IDL波段运算,常规用法就是选择要运算的几个波段,经过运算后,输出为单波段结果。可我们经常也遇到这样的场景,如大气校正后,结果被放大10000倍,需要将每个波段都除以10000,再合成所有波段。ENVI中可以使用Map Variables to Multiband Images这个功能,可以选择几个波段或全部的文件作为运算波段,结果输出为对应多波段影像。
ENVI中有两个函数,即math_doit、cf_doit将它们组合即可完成这样的功能,下面是IDL的Demo,测试数据是GF2大气校正后的影像,有4个波段,功能就是将每个波段除以10000,在合成输出为tif文件。大家可以根据自己的业务需要更改计算表达式。
pro bandmath
COMPILE_OPT idl2
envi,/restore_base_save_files
envi_batch_init
imgFile='D:\Temp1\GF2\daqi\Flaashac'
outPath='D:\Temp1\GF2\BandMath\result.tif'
ENVI_OPEN_FILE,imgFile,r_fid = input_fid
;文件信息
ENVI_FILE_QUERY,input_fid, nb = num_bands ,dims = dims,bnames= bnames
pos_t = indgen(num_bands)
out_fid=INTARR(num_bands)
;波段运算表达式
;对每个波段进行运算,结果存放于内存中
expression ='float(b1)/10000'
;各个波段进行波段运算
FOR i=0,num_bands-1 DO BEGIN
ENVI_DOIT, 'math_doit', dims=dims, exp= expression, pos=pos_t[i], $
fid=input_fid, r_fid=r_fid,/IN_MEMORY
out_fid[i]=r_fid
ENDFOR
pos_dt = INTARR(num_bands)
o_bname = bnames+"("+expression+")"
;合成波段
ENVI_DOIT, 'cf_doit', dims=dims, fid=out_fid,/IN_MEMORY,out_bname = o_bname,$
out_dt=4,OUT_NAME=outPath,pos=pos_dt,/REMOVE,r_fid=result_fid
;输出为tif格式
ENVI_OUTPUT_TO_EXTERNAL_FORMAT,dims=dims,fid=result_fid,$
OUT_BNAME=o_bname,out_name=outPath,pos=pos_t,/TIFF
envi_file_mng,id=input_fid,/REMOVE
ENVI_BATCH_EXIT
end