1. 程式人生 > 其它 >ENVI擴充套件工具:利用波段運算修改NaN方法總結

ENVI擴充套件工具:利用波段運算修改NaN方法總結

NaN為Not a Number的縮寫,在遙感影象中屬於異常值。很多使用者有修改NaN的需求,比如把0值修改為NaN,或把NaN修改為0值等。由於波段運算公式較為複雜,現歸納如下。

直接利用波段運算進行

  • 修改0值為NaN
    • float(b1)*b1/b1
  • 修改特定值(250)為NaN
    • b1*float(b1 ne 250)/(b1 ne 250)
  • 修改NaN為特定值(-999):
    • finite(b1, /nan)*(-999) or (~finite(b1, /nan))*b1
  • 修改NaN為0值(先按上面方法修改為-999或其他影象中不存在的值)
    • (b1 ne -999)*b1

利用擴充套件補丁進行呼叫

由於波段運算公式較為複雜,所以寫成使用者函式,編譯為sav檔案供ENVI呼叫。

建議使用ENVI App Store進行ENVI擴充套件工具的安裝與管理。

App Store下載地址:envi.geoscene.cn/appstore

或者可以手動下載地址:https://envi.geoscene.cn/appstore/nanoperion

注:適用於ENVI4.8、5.0及以上版本,如果是其他版本,可以將原始碼自行編譯為Sav檔案。

下載後將sav檔案拷貝到如下路徑,重啟ENVI即可。

  • ENVI 4.8
    • C:\Program Files\ITT\IDL\IDL80\products\envi48\save_add
  • ENVI Classic
    • C:\Program Files\Exelis\ENVI50\classic\save_add
  • ENVI 5.0
    • C:\Program Files\Exelis\ENVI50\custom_code

補丁中函式功能和呼叫格式說明如下表所示:

函式名

功能

波段運算呼叫公式

NaN2Zero

修改NaN為0值

NaN2Zero(b1)

Zero2NaN

修改0值為NaN

Zero2NaN(b1)

DN2NaN

修改指定值為NaN

DN2NaN(b1,DN)

NaN2DN

修改NaN為指定值

NaN2DN(b1,DN)

注:公式中的DN為使用者自定義DN值,比如將值為250的像元修改為NaN,公式可寫為:DN2NaN(b1, 250)

舉例演示:

  • 開啟影象,背景值為0;
  • 首先呼叫Zero2NaN函式,輸入影象為原始檔案,得到Disp #2中的結果,即0值轉換為NaN;
  • 然後呼叫NaN2Zero函式,輸入影象為上一步結果,得到Disp #3中的結果,即NaN轉換為0值。

圖:結果與原始資料對比

圖:結果與原始資料對比

圖:波段運算公式示例

附補丁原始碼:

;+

; :DESCRIPTION:

;     波段運算修改NaN使用者函式

; :AUTHOR: [email protected];

; :Date: 2013-8-5

;-

;修改NaN為0值

FUNCTION NaN2Zero, b1

  b1 = FINITE(b1, /nan)*(-9999) OR (~FINITE(b1, /nan))*b1

  b1 = (b1 NE -9999)*b1

  RETURN, (b1 EQ 0)*0 + (b1 NE 0)*b1

END

;修改0值為NaN

FUNCTION Zero2NaN, b1

  RETURN, FLOAT(b1)*b1/b1

END

;修改指定值為NaN

FUNCTION DN2NaN, b1, DN

  RETURN, b1*FLOAT(b1 NE DN)/(b1 NE DN)

END

;修改NaN為指定值

FUNCTION NaN2DN, b1, DN

  RETURN, FINITE(b1, /nan)*(DN) OR (~FINITE(b1, /nan))*b1

END