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 调用。
方法1:使用 ENVI App Store 进行ENVI扩展工具的安装与管理。
App Store下载地址:envi.geoscene.cn/appstore
方法2:手动下载 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
- ENVI 5.4 及以上
- C:\Program Files\Harris\ENVI5x\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: duhj@esrichina.com.cn;
; :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