ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IDL实现批量将图像波段单独存为文件

2022-09-05 11:31:17  阅读:192  来源: 互联网

标签:name 批量 doit dims IDL curBand fid 图像 out


论坛里面的一个问题“ENVI怎样将图像各波段分开为单独文件”。IDL二次开发调用ENVI函数可以轻松实现,用哪个函数呢,有 “cf_doit”、“resize_doit”、“math_doit”、“envi_layer_stacking_doit”等几个。当然了,将各波段一次全部读出来再写成二进制文件也行(分块也可以,稍微麻烦些),一旦遇到大数据了不好控制内存占用。
基于:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=60383 对上面几种方式的调用和花费时间简单进行了测试,程序主界面如下:

sav程序http://www.rayfile.com/files/7cb9e3de-3b25-11e1-91d0-0015c55db73d/

主要功能代码如下:

   

     FOR i=0,N_ELEMENTS(files)-1 DO BEGIN

       ;构建输出文件名

       fileName = FILE_BASENAME(files[i])

       pointPos = STRPOS(fileName,'.')

       ;查找文件名中点的位置

       IF pointPos[0NE -1 THEN BEGIN

         fileName= STRMID(fileName,0,pointPos)

       ENDIF

       

       

       ENVI_OPEN_FILE, files[i], r_fid=fid

       IF (fid EQ -1THEN BEGIN

         tmp = DIALOG_MESSAGE(files[i]+'文件读取错误',$

           title = !sys_title, /error)

         CONTINUE

       ENDIF

       ;文件信息

       ENVI_FILE_QUERY, fid, dims=dims, nb=nb,bnames = bnames,DATA_TYPE = dt,$

         ns = ns, nl = nl

       startTime = systime(1)

       for curBand =0,nb-1 do begin

         out_name = outfiledir+PATH_SEP()+fileName+'_band'+StrTrim(curBand+1,2)+'.img'

         envi_doit, 'cf_doit', $

           fid=fid, pos=curBand, dims=dims, $

           remove=0, out_name=out_name

       endfor

       ;

       print,'cf_doit time',systime(1)-startTime

       startTime = systime(1)

       for curBand =0,nb-1 do begin

         out_name = outfiledir+PATH_SEP()+fileName+'_band_resize'+StrTrim(curBand+1,2)+'.img'

         envi_doit, 'resize_doit', $

           fid=fid, pos=curBand, dims=dims, $

           interp=1, rfact=[1,1], $

           out_name=out_name

       endfor

       print,'resize_doit time',systime(1)-startTime

       

       

       startTime = systime(1)

       for curBand =0,nb-1 do begin

         out_name = outfiledir+PATH_SEP()+fileName+'_band_bandmath'+StrTrim(curBand+1,2)+'.img'

         pos  = curBand

         exp = 'b1'

         envi_doit, 'math_doit', $

           fid=fid, pos=pos, dims=dims, $

           exp=exp, out_name=out_name

       endfor

       print,'math_doit time',systime(1)-startTime

       

       startTime = systime(1)

       for curBand =0,nb-1 do begin

       

         pos  = curBand

         out_proj = envi_get_projection(fid=fid, $

           pixel_size=out_ps)

         out_name = outfiledir+PATH_SEP()+fileName+'_layer_stacking'+StrTrim(curBand+1,2)+'.img'

         envi_doit, 'envi_layer_stacking_doit', $

           fid=fid, pos=pos, dims=dims, $

           out_dt=dt, out_name=out_name, $

           interp=2, out_ps=out_ps, $

           out_proj=out_proj

       endfor

       print,'layer_stacking_doit time',systime(1)-startTime

       ;依次读写文件

       startTime = systime(1)

       for curBand =0,nb-1 do begin

       

         pos  = curBand

         map_info = envi_get_map_info(fid=fid) 

         out_name = outfiledir+PATH_SEP()+fileName+'_writeu'+StrTrim(curBand+1,2)+'.img'

         openw,lun,out_name,/get

         writeu,lun,envi_get_data(fid=fid, dims=dims, pos=pos)

         free_lun,lun

         ENVI_SETUP_HEAD, fname=out_name, $

         ns=ns, nl=nl, nb=1, $

         interleave=0, data_type=dt, $

         offset=0, /write,$

         MAP_INFO = MAP_INFO

       endfor

       print,'writeU time',systime(1)-startTime

       

       ;输出完成

       ENVI_FILE_MNG, id=fid, /remove

       ;设置进度条

       IDLITWDPROGRESSBAR_SETVALUE,(*pState).PRSBAR,(i+1)*per

     ENDFOR

对70M左右的224个波段的高光谱数据测试,各方法花费的时间如下:

cf_doit time      2.5090001

resize_doit time      3.3580000

math_doit time      3.5969999

layer_stacking_doit time      8.9680002

writeU time      2.2889998

这里的writeU最快,cf_doit次之,也在意料之中,因其他函数均支持分块处理。故最保险的函数还是选用cf_doit。

标签:name,批量,doit,dims,IDL,curBand,fid,图像,out
来源: https://www.cnblogs.com/enviidl/p/16657500.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有