ENVI/IDL 编程:批量裁剪同一地区的多幅影像

3 篇文章 0 订阅

问题描述:通常的批量裁剪方法是使用相同的矢量文件或者roi区域,分别对每景影像裁剪。可采用subset via rois等等方法,但由于多幅影像间(在坐标系相同,分辨率相同的情况下),并非完美配准,因此,裁剪到的影像会存在一行或者一列的差异,使得后续计算无法进行。因此,可采用另一种思路:利用裁剪区域的掩膜图mask(栅格),对多幅影像进行波段合成layer stacking,然后再掩膜掉无效区域。
关键函数过程:envi_layer_stacking_doit(波段合成), Math_Doit (波段运算),ENVI_FILE_MNG(释放内存)
注意点:波段合成与波段运算的输入文件的fid:应当是多个,即使是处理同一文件的不同波段,不同点在于波段的位置不同(pos不同),具体查看IDL/ENVI文档帮助
未解决的问题:内存释放函数ENVI_FILE_MNG可以释放硬盘上的文件,但似乎无法释放位于内存的文件(files in memory),目前不知道如何解决。如有方法,愿分享,感激不尽。
代码如下:
pro zy3batchsubset
;20190213 使用矢量批量裁剪影像
;如果采用上面的方法,得到的影像可能相差一行或者一列,最好的方法是采用layer_stacking
;步骤:1.使用mask进行layer_stacking 2.使用mask进行掩膜处理  3.内存释放(ENVI会自动将文件加入内存,影响后续运行效率)

具体的代码如下:(运行环境 ENVI5.3+IDL8.5)  

COMPILE_OPT IDL2
  ;start the application
  e =ENVI()
  ;Initialize ENVI and send all errors
  ; andwarnings to the file batch.txt
  ENVI_BATCH_INIT, log_file='batch.txt'
  ;open all files to subset
  file= EXPAND_PATH('待裁剪的影像路径', /ALL_DIRS,/ARRAY)
  datapath = FILE_SEARCH(file,'*rpc*.dat',count = count_all)
  ;load mask of interest
  maskpath='裁剪区域的掩膜路径'
  respath='存储裁剪后的影像路径'
  fid=LONARR(2)
  pos=LONARR(2)
  dims=LONARR(5,2)
    ;loop over all files
  FOR i=0,count_all-1 DO BEGIN
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;step1.LAYER_STACKING;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;   tmp=e.OpenRaster(datapath[i])
;   mask=e.OpenRaster(maskpath)
;   task=ENVITASK('RegridRaster')
;   task.INPUT_RASTER=tmp
;   task.GRID_DEFINITION=
  ; Use the spatial reference of the mask scene to
  ; create a common grid definition for other scenes
  basename=FILE_BASENAME(datapath[i])
  basename=STRMID(basename,0,STRLEN(basename)-4)
  resname=respath+basename+'_sub'
  ;whether the current file has been processed?
  IF file_test(resname) EQ 1 then begin
    continue
  ENDIF
  ;process files
  ENVI_OPEN_FILE, datapath[i],r_fid=data_fid
  envi_file_query, data_fid, dims=data_dims
  ENVI_OPEN_FILE, maskpath,r_fid=mask_fid
  envi_file_query, mask_fid, dims=mask_dims
  mask_proj = ENVI_GET_PROJECTION(FID=mask_fid, PIXEL_SIZE=mask_ps)
  dims[0,0]=data_dims
  dims[0,1]=mask_dims
  ENVI_DOIT, 'envi_layer_stacking_doit', dims=dims,/EXCLUSIVE, $
    fid=[data_fid,mask_fid],out_dt=12,/IN_MEMORY,$
    out_proj=mask_proj,pos=[0,0],r_fid=lay_fid,out_ps=mask_ps
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;;;;;;;;step2.band math;;;;;;;;;;;;;;;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  ENVI_FILE_QUERY, lay_fid,dims=lay_dims
  ENVI_DOIT, 'Math_Doit',fid=[lay_fid,lay_fid],dims=lay_dims,pos=[0,1],$
  exp='b1*b2',out_name=resname
  ENVI_FILE_MNG , ID=lay_fid, /REMOVE
  ;release files in memory:释放了硬盘上的文件,但是没有释放in memory
  fids = envi_get_file_ids()
  size = SIZE(fids)  ;dimensions,respective length,data type, num_of_elements total
  length = size[1]
  FOR i = 0L, length-1 DO BEGIN
    ENVI_FILE_MNG,id = fids[i],/remove
  ENDFOR
  ENDFOR
end 
————————————————
版权声明:本文为CSDN博主「银木荷」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41300185/article/details/87253519

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值