sunsett的个人博客分享 http://blog.sciencenet.cn/u/sunsett

博文

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

已有 5155 次阅读 2019-3-4 20:29 |个人分类:ENVI/IDL|系统分类:科研笔记

问题描述:通常的批量裁剪方法是使用相同的矢量文件或者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 

原文:https://blog.csdn.net/qq_41300185/article/details/87253519 

版权声明:本文为博主原创文章,转载请附上博文链接!




https://blog.sciencenet.cn/blog-3409932-1165642.html


下一篇:从CDSN转到科学网
收藏 IP: 202.114.121.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-18 23:13

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部