ENVI/IDL 波段合成 批处理

;该函数进行波段合成
;
;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

代码在选择合成的波段处需要优化,另外其他的需要可以在代码中进行修改。

参考博客地址:IDL8.5进行波段合成代码_落霞与孤鹜亓飞的博客-CSDN博客_idl波段合成

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值