基于ENVI/IDL 的一键化实现LST-NDVI的干湿边方程拟合,并得到TVDI计算结果图

ENVI/IDL (5.3版本)一键化实现LST-NDVI的干湿边方程拟合,并得到TVDI计算结果图

0 原理介绍

利用IDL将NDVI异常值进行剔除,NDVI取值范围为0.2~1(植被覆盖区),对反演的地表温度Ts选择5%的置信区间,构建NDVI-Ts特征空间,进行两种反演方法(单通道算法、单窗算法)的干湿边方程的拟合。
其中干湿边方程拟合公式和TVDI计算公式如下:
基于ENVI/IDL 的一键化实现LST-NDVI的干湿边方程拟合,并得到TVDI计算结果图_第1张图片

其中:其中Tsmin是湿边方程,Tsmax是干边方程,TVDI的值域为[0,1]。TVDI越大,土壤湿度越低,TVDI越小,土壤湿度越高。
以NDVI为横坐标,LST为纵坐标,得到NDVI-LST的散点图。根据NDVI-LST的散点图,就能得到每个NDVI值对应的LST的最大最小值,即要求的干边和湿边,最后根据干边和湿边的散点图,就能拟合到干边方程和湿边方程。

1 打开影像所在文件夹

// 格式为dat
 ENVI,/RESTORE_BASE_SAVE_FILES
  ;ENVI批处理模式/RESTORE_BASE_SAVE_FILES
  ENVI_BATCH_INIT
  file_path=dialog_pickfile( get_path = newPath,$
    /DIRECTORY,$
    title='SELECT A DIRECTORY CONTAINS DAT-FILE')
  file_path_list=file_search(file_path,'*.dat')
  file_name_list=file_basename(file_path_list)
  ; print,file_path_list
  filecount=N_ELEMENTS(file_path_list)

2 数据读取

  //************************************** 数据读取*******************************************
    ENVI_OPEN_FILE, LSTname, r_fid =fid_LST
    ;print,LSTname
    ENVI_FILE_QUERY, fid_LST,           $
      nb = nb,                      $ ;波段数
      ns = ns,                      $ ;列数
      nl = nl                      ,$;行数
      dims=dims
    map_info=envi_get_map_info(fid=fid_LST)
    ENVI_OPEN_FILE, NDVIname, r_fid =fid_NDVI
    LST=ENVI_GET_DATA(fid = fid_LST, dims = dims, pos = 0)+273.15  //℃+273.15---K
    NDVI=ENVI_GET_DATA(fid = fid_NDVI, dims = dims, pos = 0)

3 直方图统计

 hist=Histogram(LST,min=273.16,Binsize=0.1)
    ;统计直方图,获取累计像元个数
    totalCounts = TOTAL(hist, /CUMULATIVE)
    ;获取累积百分比
    totalPercents = totalCounts/totalCounts[-1]
    //***************************************  设定NDVI统计阈值及间隔*******************************

    NDVI_min=0.2                                 //NDVI>0.2为植被区域
    NDVI_max=1
    INTERVAL=0.01                                ;统计间隔
    NUMS=CEIL((NDVI_max-NDVI_min)/INTERVAL)       ;NDVI统计区间数目
    NDVIs=FINDGEN(NUMS)*INTERVAL+NDVI_MIN         ;每个NDVI统计区间的起始值
    NDVIe=NDVIs+INTERVAL                          ;每个NDVI统计区间的终止值
    NDVIm=NDVIs+INTERVAL/2.0                        ;;每个NDVI统计区间的均值

  //*********************************  干湿边曲线拟合   *******************************************
    LST_MAX=FLTARR(NUMS)
    LST_MIN=FLTARR(NUMS)
FOR i=0,NUMS-1 DO BEGIN
 W=WHERE(NDVI1 GT NDVIs[i] AND NDVI1 LT NDVIe[i] ,COUNT)
 if count gt 0 then begin
    LST_MAX[i]=MAX(LST1[w])                      ;当前NDVI区间对应的LST最大值
    LST_MIN[i]=MIN(LST1[w])                      ;当前NDVI区间对应的LST最小值
 endif
 ENDFOR

4 计算干湿边方程

    A1=REGRESS(NDVIm,LST_MAX,CONST=B1,CORRELATION=R1)           ;干边方程
    A2=REGRESS(NDVIm,LST_MIN,CONST=B2,CORRELATION=R2)           ;
    TVDI=(LST-A2*NDVI-B2)/(((A1*NDVI+B1)-(A2*NDVI+B2)))

5 拟合干湿边方程

    FLAG=1    
    if FLAG EQ 1 THEN BEGIN
      ;O_FN=DIALOG_PICKFILE(TITLE='干湿边拟合图像保存为:')+'.png'
      o_fn=outpath+filename+'SW1.png'
      PLOT_FITTING_FIG,o_fn,$
        NDVI1,LST1,NDVIm,       $
        LST_MIN,LST_MAX,      $
        A1,B1,R1,A2,B2,R2
    ENDIF

基于ENVI/IDL 的一键化实现LST-NDVI的干湿边方程拟合,并得到TVDI计算结果图_第2张图片

6 干湿边方程拟合函数(参考:徐永明老师的课本)

PRO PLOT_FITTING_FIG,OUT_NAME,NDVI,LST,NDVIm,   $
  LST_MIN,LST_MAX,A1,B1,R1,A2,B2,R2
  xrange=[0.2,1]
  y_scale=max(lst_max)-min(lst_min)
  yrange=[min(lst_min)-y_scale*0.5,max(lst_max)+y_scale*0.5]
  plot_scatter=plot(NDVIm,LST_MAX,LINESTYLE=6,$
    XRANGE=xrange,YRANGE=yrange,XTITLE='NDVI',YTITLE='LST(K)',$
    /BUFFER,XMINOR=5,YMINOR=5);MARGIN=[0.2,0.2,0.2,0.2],
  print,'scatter'
  PLOT_PT_DRY=PLOT(NDVIm,LST_MAX,SYMBOL=2,SYM_SIZE=0.8, $
    /SYM_FILLED,COLOR='RED',LINESTYLE=6,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT,/BUFFER)
  PLOT_PT_WET=PLOT(NDVIm,LST_MIN,SYMBOL=2,SYM_SIZE=0.8,  $
    /SYM_FILLED,COLOR='BLUE',LINESTYLE=6,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT,/BUFFER)
  X=[MIN(NDVIm),Max(NDVIM)]
  PLOT_LINE_DRY=PLOT(X,Y_DRY,COLOR='Black',THICK=1.5,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT, $
    /BUFFER)
  PLOT_LINE_WET=PLOT(X,Y_WET,COLOR='Black',THICK=1.5,XTITLE='NDVI',YTITLE='LST(K)',/OVERPLOT, $
    /BUFFER)
  EQUATION_DRY='Ts = '+STRING(A1,FORMAT='(F6.2)')+'*NDVI+'+STRING(B1,FORMAT='(F6.2)')
  r1_dry='$R^2$='+STRING(R1^2,FORMAT='(F6.2)')
  EQUATION_WET='Ts = '+STRING(A2,FORMAT='(F6.2)')+'*NDVI+'+STRING(B2,FORMAT='(F6.2)')
  r2_wet='$R^2$='+STRING(R2^2,FORMAT='(F6.2)')
 
  plot_scatter.save,out_name;,border=0
  plot_pt_dry.save,out_name,border=0
  plot_pt_wet.save,out_name,border=0
  plot_line_dry.save,out_name,border=0
  plot_line_wet.save,out_name,border=0
END

参考文献

遥感二次开发语言IDL_徐永明

你可能感兴趣的:(ENVI,IDL,遥感图像处理)