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
- 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