||
问题描述:通常的批量裁剪方法是使用相同的矢量文件或者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
版权声明:本文为博主原创文章,转载请附上博文链接!
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 08:41
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社