波段运算(bandmath)工具中数据类型及转换函数
波段运算的强大功能是由IDL的功能、速度和灵活性所提供的。但是要熟练使用波段运算功能,并不需要成为一个熟悉IDL编程的专家。下面的知识可以帮助熟练使用波段运算功能并避免一些经常出现的问题。
- 注意数据类型
IDL中的数学运算与简单的使用计算器进行运算是有一定差别的。要重视输入波段的数据类型和表达式中所应用的常数。每种数据类型——尤其是非浮点型的整型数据都包含一个有限的数据范围。例如:8-bit字节型数据表示的值仅为0-255,如果对16-bit整型数据波段求和(b1 + b2)并且其值大于255,那么得到的结果将与期望值不等。当一个值大于某个数据类型所能容纳的值的范围时,该值将会溢出(overflow)并从头开始计算,例如:将8-bit字节型数据250和10求和,结果为4。
类似的情况经常会在波段运算中遇到,因为遥感图像通常会被存储为8-bit字节型或16-bit整型。要避免数据溢出,可以使用IDL中的一种数据类型转换功能(参见表15.1)对输入波段的数据类型进行转换。例如,在对8-bit字节型整型图像波段求和时(结果有大于255),如果使用IDL函数fix()将数据类型转换为整型,就可以得到正确的结果。
fix(b1)+ b2
因此在上面的求波段和(b1+b2+b3)的例子中,正确的表达式应该是fix(b1)+b2+b3。
你可能会有这样的想法:既然浮点型数据可以表示所有的数据值,为什么不在所有的计算中都使用浮点型数据呢?这是因为一个数据所能表现的动态数据范围越大,它占用的磁盘空间越多。例如:字节型数据的一个像元仅占用1个字节;整型数据的一个像元占用2个字节;浮点型数据的一个像元占用4个字节。浮点型结果将比整型结果多占用一倍的磁盘空间。关于IDL数据类型的占用磁盘空间和数据范围的详细介绍,参考表15.1。
表15.1数据类型及说明
数据类型 |
转换函数 |
缩写 |
数据范围 |
Bytes/ Pixel |
8-bit字节型(Byte) |
byte() |
B |
0-255 |
1 |
16-bit整型(Integer) |
fix() |
|
-32768-32767 |
2 |
16-bit无符号整型(Unsigned Int) |
uint() |
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 |
- IDL数据类型的动态变换
一些数字可以使用几种不同的数据类型表达出来,IDL制定了一些默认规则对这些数据进行解译。因此IDL的数据类型是可以进行动态变换的,也就是说IDL能够将表达式中的数据类型提升为它在表达式中所遇到的最高数据类型。例如:不包含小数点的整型数字,即使它在8-bit字节型的动态范围,也常被解译为16-bit整型数据。如果想为一幅8-bit字节型数据图像加5,并且使用如下的波段运算表达式:
B1 + 5
数据5将被解译为16-bit整型数据,因此波段运算结果将被提升为16-bit整型数据图像(占用8-bit字节型图像的两倍磁盘空间)。如果想保持结果为字节型图像,可以使用数据类型计算函数byte():
b1 + byte(5)
或使用IDL中将16-bit整型数据转换为8-bit字节型数据的缩写:
b1 + 5B
在数据后紧跟一个字母B表示将该数据解译为字节型数据。如果在波段运算表达式中经常使用常数,这些类似的缩写是很有用的。详细介绍参考表15.1。
摘自《ENVI遥感图像处理方法 第二版》高等教育出版社