ENVI: Mask_Doit

本文介绍了一种利用IDL编程语言中的mask_doit函数进行遥感影像批量裁剪的方法。通过读取特定目录下的遥感影像文件,使用预定义的多边形区域文件(EVF)确定裁剪范围,并应用到每一幅影像上,最终实现多波段遥感影像的精确裁剪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用mask_doit函数,实现批量裁剪。

compile_opt idl2

  start_path = 'F:\Temporary\data\LC8 Results\'

  cd,start_path

  out_path = 'F:\Temporary\data\LC8 Results\ENVI_clip\temp\ROI\'



  Files = FILE_Search(start_path + 'compo432.tif', count = Filecount)

  ;  FileCount = N_ELEMENTS(Files)

  If FileCount Eq 0 Then Begin

    print, 'File not exist'

    Return

  Endif



  For num = 0, FileCount - 1 do begin

    FileName = Files[num]

    envi_open_file, FileName , r_fid=fid, /no_realize, /invisible

    if (fid eq -1) then begin

      return

    endif

    Print, 'fid=', fid



    ENVI_FILE_QUERY, fid, dims=dims, ns=ns, nl=nl, nb=nb, BNAMES= BNAMES

    t_fid=LONARR(nb)+fid  ;此句的作用?在以后实践中明确。

    pos=LINDGEN(nb)

    

    pos_num = strpos(file_basename(FileName),'.') 

    out_name = out_path + strmid(file_basename(FileName),0, pos_num) + "_roi.tif"

    

    print, out_name

    

    evf_file ='F:\Temporary\data\LC8 Results\Envi_polygon_.evf';

    evf_id=ENVI_EVF_OPEN(evf_file)

    ENVI_EVF_INFO, evf_id, num_recs = num_recs,data_type = data_type,$

      projection = projection, layer_name = layer_name

    roi_ids = LONARR(num_recs)



    For i = 0, num_recs - 1 do begin

      record = ENVI_EVF_READ_RECORD(evf_id, i)

      ENVI_CONVERT_FILE_COORDINATES,fid,xmap,ymap,record[0,*],record[1,*]



      roi_id = ENVI_CREATE_ROI(color = 4, ns = ns , nl = nl)

      ENVI_DEFINE_ROI, roi_id, /polygon, xpts=REFORM(xMap), ypts=REFORM(yMap)

      roi_ids = roi_id



      IF i EQ 0 THEN BEGIN

        xmin = ROUND(MIN(xMap,max = xMax))

        yMin = ROUND(MIN(yMap,max = yMax))

      ENDIF ELSE BEGIN

        xmin = xMin < ROUND(MIN(xMap))

        xMax = xMax > ROUND(MAX(xMap))

        yMin = yMin < ROUND(MIN(yMap))

        yMax = yMax > ROUND(MAX(yMap))

      ENDELSE

    ENDFOR



    xMin = xMin > 0

    xmax = xMax < ns ;- 1 

    yMin = yMin > 0

    ymax = yMax < nl ;- 1



    ENVI_MASK_DOIT,AND_OR = 1, /IN_MEMORY, $

      ROI_IDS= roi_ids, ns = ns, nl = nl, $

      /inside, r_fid = m_fid

    out_dims = [-1,xMin,xMax,yMin,yMax]

    ENVI_MASK_APPLY_DOIT, FID = fid, POS = pos, DIMS = out_dims, $

      M_FID = m_fid, M_POS = m_pos, VALUE = 0, out_name = out_name, R_FID = r_fid, $

      OUT_BNAME = BNAMES, IN_MEMORY = 0

      

      ; 应当理解 M_POS关键字的含义: specify the band position of the mask band.

      ; 因此,令M_POS = m_pos,就能实现对多波段图像的裁剪,而非以前令M_POS = [0]的简单赋值(对单波段图像的处理)。

      ;

    ENVI_FILE_MNG, id =m_fid,/remove

  Endfor



  print,' Clip Done'

旅行者2号
飞出太阳系

; 定义ENVI菜单按钮 - 影像融合工具 PRO envi_sharpening_DEFINE_BUTTONS,buttonInfo compile_opt IDL2 ; 在主菜单Basic Tools后添加自定义菜单 envi_define_menu_button, buttonInfo, $ value = '影像处理工具', /menu, $ ref_value= 'Basic Tools', $ /sibling, position = 'after' ; 在自定义菜单下添加影像融合菜单项 envi_define_menu_button, buttonInfo, $ value = '影像融合', uvalue= 'fusion_option', $ event_pro= 'envi_test_sharpening', $ ref_value= '影像处理工具', position = 'last' END ; 影像融合处理主程序 pro envi_sharpening,event Compile_opt idl2 ENVI,/restore_base_save_files ENVI_BATCH_INIT ; 选择低分辨率多光谱影像 ENVI_SELECT, fid=ms_fid,dims=ms_dims,pos=ms_pos ENVI_FILE_QUERY, ms_fid, nb=ms_nb if (ms_fid[0] eq -1) then begin message, '请选择多光谱影像数据!', /info return endif ; 选择高分辨率全色影像 ENVI_SELECT, fid=pan_fid,dims=pan_dims,pos=pan_pos ENVI_FILE_QUERY, pan_fid, nb=pan_nb if (pan_fid[0] eq -1) then begin message, '请选择全色影像数据!', /info return endif ; 创建处理对话框 base = widget_auto_base(title='主成分变换影像融合') widget_control, base, /realize ; 插值方法选择 list = ['双线性插值', '三次卷积插值', '最近邻插值'] we = widget_pmenu(base, list=list, uvalue='interp_method', /auto) ; 输出设置区域 sb = widget_base(base, /row, /frame, title='输出设置') wf = widget_outfm(sb, uvalue='output_file', /auto) ; 显示对话框并获取用户输入 result = auto_wid_mng(base) if(result.accept eq 0) then return ; 获取用户选择的参数 outname = result.output_file.name INTERP = result.interp_method ; 插值方法索引 ; 显示处理进度 envi_batch_progress, /start, title='影像融合处理', $ text='正在执行主成分变换影像融合...' ; 执行主成分变换影像融合 if (result.output_file.in_memory eq 1) then begin ; 输出到内存 ENVI_DOIT, 'ENVI_PC_SHARPEN_DOIT', $ DIMS=ms_dims, fID=ms_fid, $ HIRES_DIMS=pan_dims, HIRES_FID=pan_fid, $ HIRES_POS=indgen(pan_nb), INTERP=INTERP, $ LORES_DIMS=ms_dims, LORES_FID=ms_fid, $ LORES_POS=indgen(ms_nb), POS=INDGEN(ms_nb), $ /in_memory message, '影像融合完成! 结果已加载到内存。', /info endif else begin ; 输出到文件 ENVI_DOIT, 'ENVI_PC_SHARPEN_DOIT', $ DIMS=ms_dims, fID=ms_fid, $ HIRES_DIMS=pan_dims, HIRES_FID=pan_fid, $ HIRES_POS=indgen(pan_nb), INTERP=INTERP, $ LORES_DIMS=ms_dims, LORES_FID=ms_fid, $ LORES_POS=indgen(ms_nb), $ OUT_NAME=outname, POS=INDGEN(ms_nb) message, '影像融合完成! 结果已保存至: '+outname, /info endelse ; 关闭进度条 envi_batch_progress, /end End 按照这个写一份IDL代码,要求与这个功能一样,做一些修改即可
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值