;该函数进行波段合成
;
;img_dir代表需要合成的文件所在的目录
;
;orderArray是一个数组,代表读取到的文件的合成顺序
;
;imgSuffixName表示影像的后缀名
;
;outPutPath代表影像输出路径
FUNCTION MYLAYERSTACK, img_dir,imgSuffixName,orderArray,outPutPath
COMPILE_OPT idl2
ENVI,/restore_base_save_files ;第一个ENVI函数前,加载ENVI函数
IF FILE_TEST(outPutPath) EQ 1 THEN BEGIN ;如果输出路径文件已经存在,则直接返回
RETURN, outPutPath
ENDIF
;求出该路径下对应格式的影像文件路径
image_files = FILE_SEARCH(img_dir,"*."+imgSuffixName,count=fileNum)
;如果没找到文件,则返回
IF image_files EQ [""] THEN BEGIN
PRINT,"没找到",imgSuffixName,"类型的文件,请检查路径是否正确"
RETURN, outPutPath;若没找到对应文件,直接返回
ENDIF
;启动envi,打开第一个影像文件
e = ENVI(/HEADLESS)
band = e.OPENRASTER(image_files[0])
spatialRef = band.SPATIALREF
bandNum = SIZE(orderArray,/N_elements);求出波段合成顺序数组的大小
bandArray = OBJARR(bandNum)
;按照orderArray中的顺序构造波段数组
FOR i = 0,bandNum-1 DO BEGIN
bandArray[i] = e.OPENRASTER(image_files[orderArray[i]])
ENDFOR
;开始执行波段合成操作
Task = ENVITASK("BuildBandStack")
Task.SPATIAL_REFERENCE = spatialRef
Task.INPUT_RASTER = bandArray
Task.OUTPUT_RASTER_URI = outPutPath
Task.EXECUTE;
ENVI_BATCH_EXIT ;最后一个ENVI函数后,退出ENVI函数
RETURN,outPutPath;返回输出路径
END
;layerstak这个过程中调用上面定义的波段合成函数
PRO LAYERSTACK
;/MULTIPLE_FILES可显示所有文件,/DIRECTORY只能选取文件夹
fileName = DIALOG_PICKFILE(/READ, FILTER = '*.bmp',TITLE='请选择输入数据集',/DIRECTORY)
r = FILE_SEARCH(fileName,'*',count=num,/test_directory)
;判断输入数据是否为单个数据集
IF num EQ 0 THEN BEGIN
r = fileName
num = num+1
ENDIF
;输出保存文件路径FolderPath
FolderPath = DIALOG_PICKFILE(/READ, FILTER = '*.bmp',TITLE='请选择输出文件夹',/DIRECTORY)
;创建一个变量a来存储用户选择的波段数量,并从控制端输入合成的波段序号
READ,'请输入需要合成的波段个数',a
orderArray = INTARR(a)
READ,'请输入合成波段',orderArray
--orderArray ;输入第i位与数据的第i位对应的下标一致
; orderArray = [1,4,5,6,2] 这里是从代码中输入你要合成的波段序号
FOR i=0,num-1 DO BEGIN
;获取遥感图像文件名imgName
imgName = FILE_BASENAME(r) ;FILE_BASENAME(r[i])无法获取该文件名
imgName = imgName[i]
imgPath = r[i] ;需要添加'\'才能将数据添加至下一级文件夹
outPutPath = FolderPath+imgName+"LayerStack.TIFF" ;表示合成结果输出路径,路径不能存在中文
outPutPath = MYLAYERSTACK(imgPath,"TIF",orderArray,outPutPath) ;调用波段合成函数
ENDFOR
;弹出运行结束提示框MESSAGE
MESSAGE = DIALOG_MESSAGE("已完成波段合成", /information, title=" 数据处理结果 ")
END
代码在选择合成的波段处需要优化,另外其他的需要可以在代码中进行修改。