【ENVI入门系列】21.波段运算与波谱运算工具
版权声明:本教程涉及到的数据仅供练习使用,禁止用于商业用途。
目录
波段运算与波谱运算工具
1.
2.
3.
4.
4.1
4.2
4.3
4.4
4.5
5.
6.
6.1
6.2
6.3
7.
1. 概述
图:波段运算示意图
2. 波段运算满足条件
- b1 + b2 + b3
- B1 + B11 + B111
- B1 + b2 + B333
-
ENVI 4.x:
C:\Program Files\ITT\IDL\IDL80\products\envi48\save_add -
ENVI Classic:
C:\Program Files\Exelis\ENVI51\classic\save_add -
ENVI 5.x:
C:\Program Files\Exelis\ENVI51\extensions
3. 波段运算用法示例
(1) 启动ENVI,选择菜单File > Open,打开数据"can_tmr.img";
(2) 启动Band Math工具,路径为Toolbox/Band Ratio/Band Math;
(3) 在Band Math面板,在Enter an expression文本框中输入运算表达式:b1+b2+b3,点击Add to List按钮,将表达式添加到Previous Band Math Expression列表中;
注:如果表达式存在语法错误,将不能被添加到列表中,如下图所示。
图:Band Math面板
(4) 在Band Math面板中,选中添加的"b1+b2+b3",点击OK按钮,打开Variables to Bands Pairings对话框(如图),为运算表达式中各个变量赋图像文件或者图像波段;
图:Variables to Bands Pairings对话框
(5) 在Variables to Bands Pairings对话框中,Variables used in expression列表框中选择变量b1,单击Available Bands List中的"TM Band 1 (0.4850)"。然后用同样的方法为b2和b3指定为"TM Band 2"和"TM Band 3";
注1:本例中指定变量为波段,同样可以指定为文件。方法如下:选中变量后,点击按钮Map Variable to Input file,可以为变量指定一个多波段图像文件
注2:一旦第一个波段或文件被选中,只有那些具有相同行列数的波段被显示在波段列表中。
(6) 单击Choose按钮,选择文件名及路径保存结果,单击OK按钮执行运算。
(7) 此时可以将输入和输出文件加载到视图中,然后点击工具栏 图标获取当前鼠标位置的像元值,如图所示。
图:鼠标取值Cursor Value面板
注:本例中输入文件的数据类型为Byte型,范围0~255,所以使用b1+b2+b3有可能会越界。所以,更标准的公式应该为fix(b1)+b2+b3。本例只是简单演示用法。后续章节会详细介绍波段运算的注意事项,如数据类型的转换等。
- 单击Save按钮可以将列表中的运算表达式保存为外部文件(.exp);
- 单击Restore按钮可以将外部运算表达式文件导入;
- Clear按钮可以清除列表中的所有运算表达式;
- Delete按钮可以删除选择的运算表达式。
4. 波段运算的IDL知识
4.1 注意数据类型
|
fix(b1)+ b2
表:数据类型及说明
数据类型 |
转换函数 |
缩写 |
数据范围 |
Bytes/ Pixel |
8-bit字节型(Byte) |
byte( ) |
B |
0-255 |
1 |
16-bit整型(Integer) |
fix( ) |
|
-32768-32767 |
2 |
16-bit无符号整型(Unsigned Int) |
unit( ) |
U |
0-65535 |
2 |
32-bit长整型(Long Integer) |
long( ) |
L |
大约+/-20亿 |
4 |
32-bit无符号长整型(Unsigned Long) |
ulong( ) |
UL |
0-大约40亿 |
4 |
32-bit浮点型(Floating Point) |
float( ) |
. |
+/-1e38 |
4 |
64-bit双精度浮点型(Double Precision) |
double( ) |
D |
+/-1e308 |
8 |
64-bit整型(64-bit Integer) |
long64( ) |
LL |
大约+/-9e18 |
8 |
无符号64-bit整型(Unsigned 64-bit) |
ulong64( ) |
ULL |
0-大约2e19 |
8 |
复数型(Complex) |
complex( ) |
|
+/-1e38 |
8 |
双精度复数型(Double Complex) |
dcomplex( ) |
|
+/-1e308 |
16 |
4.2 数据类型的动态变换
B1 + 5
b1 + byte(5)
b1 + 5B
4.3 充分利用IDL的数组运算符
(b1 lt 0)*(-999)+(b1 ge 0)* b1
表:IDL数组操作函数和运算符
种类 |
操作函数 |
基本运算 |
加(+)、减(-)、乘(*)、除(/) |
三角函数 |
正弦sin(x)、余弦cos(x)、正切tan(x) |
反正弦asin(x)、反余弦acos(x)、反正切atan(x) |
|
双曲正弦sinh(x)、双曲余弦cosh(x)、双曲正切tanh(x) |
|
关系和逻辑运算符 |
小于(LT)、小于等于(LE)、等于(EQ)、不等于(NE)、大于等于(GE)、大于(GT) |
AND、OR、NOT、XOR |
|
最小值运算符(<)和最大值运算符(>) |
|
其他数学函数 |
指数(^)和自然指数(exp(x)) |
自然对数(alog(x)) |
|
以10为底的对数(alog10(x)) |
|
整型取整——round(x)、ceil(x)、和floor(x) |
|
平方根(sqrt(x)) |
|
绝对值(abs(x)) |
4.4 运算符操作顺序
-
5 + 3 * 2
—— 求得的值为11,因为乘号运算符的优先级高 -
(5 + 3)* 2
—— 求得的值为16,因为圆括号改变了操作顺序
float(5)+ 10 / 3
5 + 10 / float(3)
表:运算符优先级
优先级顺序 |
运算符 |
描述 |
1 |
( ) |
用圆括号将表达式分开 |
2 |
^ |
指数 |
3 |
* |
乘法 |
#和## |
矩阵相乘 |
|
/ |
除法 |
|
MOD |
求模 |
|
4 |
+ |
加法 |
- |
减法 |
|
< |
最小值运算符 |
|
> |
最大值运算符 |
|
NOT |
Boolean negation |
|
5 |
EQ |
等于 |
NE |
不等于 |
|
LE |
小于或等于 |
|
LT |
小于 |
|
GE |
大于或等于 |
|
GT |
大于 |
|
6 |
AND |
Boolean AND |
OR |
Boolean OR |
|
XOR |
Boolean exclusive OR |
|
7 |
? : |
条件表达式(在波段运算中很少使用) |
b1 / max(b1)
5. 波段运算典型公式
b1 / float(b2)
fix(ceil(b1 / float(b2)))
uint(b1) * b2
byte(round((0.2 * b1) + (0.8 * b2)))
(b1 gt 200)* b2 + (b1 le 200)* b1
(b1 eq 0)*255 + (b1 gt 0)*b1
(b4 lt 0) or (b2 gt 0.65) and (b3–b4) gt 15
b1 +(0 > b2 > b3)
0 > b1 < 1
(b1>0+b2>0+b3>0) / (((b1 ge 0) + (b2 ge 0)+(b3 ge 0)) >1)
-
修改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
6. 调用IDL用户函数
FUNCTION bm_func, b1, [b2,..., bn, parameters and keywords] END |
6.1 编写函数
;定义两个变量和一个关键字 FUNCTION bm_ratio, b1, b2, check=check ;计算分母 den = FLOAT(b1) - b2 IF (KEYWORD_SET(check)) THEN $ ptr = WHERE(den EQ 0, count) $ ELSE $ ;如果设置了check关键字,检查分母为0情况 count = 0 ;如果分母为0,临时则将分母赋值1.0 IF (count GT 0) THEN den[ptr] = 1.0 ;计算比值 result = (FLOAT(b1) + b2) / den ;分母为0时,直接将结果返回0.0 IF (count GT 0) THEN result[ptr] = 0.0 RETURN, result END |
6.2 编译函数
(1) 将bm_ratio.pro文件拷贝到安装路径的Extensions或save_add 目录下,启动ENVI + IDL模式,自动将bm_ratio.pro编译。
(2) 启动 ENVI + IDL模式,在IDL编辑器中打开bm_ratio.pro源码文件,点击IDL工作台工具栏的编译按钮,然后就可以在ENVI中使用bm_ratio函数了。
(3) 在IDL中,通过save命令,将pro源码文件编译为sav文件,然后拷贝到ENVI安装路径的Extensions或save_add文件夹下,启动ENVI即可使用。
6.3 使用函数
(1) 打开一个多光谱文件;
(2) 与第2章节方法一样,打开波段运算工具,输入如下表达式:
bm_ratio(b1, b2)
或
bm_ratio(b1, b2,/check)
图:使用IDL用户函数
(3) 其他操作过程与第2章节一样,为变量选定波段或文件后,执行即可。
7. 波谱运算(Spectral Math)
图:波谱运算示意图
(1) 选择菜单Display > Spectral Library Viewer,启动波谱库浏览器;
(2) 在Spectral Library Viewer面板左侧,自动加载了ENVI自动波谱库文件。这里选择veg_lib文件夹里的veg_1dry.sli波谱库文件;
(3) 左键在波谱列表中单击,光谱曲线将显示在面板右侧的视图中,任意选择三个光谱曲线,结果如下图所示,可以点击右侧中间的三角箭头浏览已选的波谱列表;
(4) 启动Spectral Math工具,路径为Toolbox/Spectral/Spectral Math;
(5) 在弹出的Spectral Math面板中,输入表达式(s1+s2+s3)/3,点击Add to List将公式添加到上面的列表中,选中列表中的公式,点击OK;
注:由于波谱库中的光谱数据类型为浮点型,所以不需要进行数据类型转换。如果输入光谱数据类型为字节型、整型等,需要进行数据类型转换。
图:Spectral Library Viewer面板
(6) 在弹出的Variables to Spectra Pairings面板中,为s1、s2、s3指定波谱曲线。Output Result to可以选择Same Window或New Window,这里选择New Window,将结果输出到新窗口中。可通过鼠标左键将输入三条曲线拖拽到新的窗口中,结果如图所示,红绿蓝三条曲线为输入波谱,紫色为输出波谱。
图:Variables to Spectra Pairings面板
图:波谱运算结果
教材下载:http://pan.baidu.com/s/1jGgM1cq
数据下载:http://pan.baidu.com/s/1sjJNQvb
视频下载:http://pan.baidu.com/s/1eQu1KkU