基於ENVI/IDL 的一鍵化實現LST-NDVI的乾溼邊方程擬合,並得到TVDI計算結果圖

ENVI/IDL (5.3版本)一鍵化實現LST-NDVI的乾溼邊方程擬合,並得到TVDI計算結果圖

0 原理介紹

利用IDL將NDVI異常值進行剔除,NDVI取值範圍爲0.2~1(植被覆蓋區),對反演的地表溫度Ts選擇5%的置信區間,構建NDVI-Ts特徵空間,進行兩種反演方法(單通道算法、單窗算法)的乾溼邊方程的擬合。
其中乾溼邊方程擬合公式和TVDI計算公式如下:
在這裏插入圖片描述

其中:其中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

在這裏插入圖片描述

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_徐永明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章