波段运算(bandmath)工具中运算表达式的几个典型例子
1.避免整型数据除法
当对整型数据波段进行除法运算时,运算结果不是被向上或向下取整,而是直接被简单地舍去(小数点后面的数据被舍弃)。要避免这种情况发生,通常将数据类型转换为浮点型。
b1 / float(b2)
如果想将除法数据结果保持为整型,最好先将数据转换为浮点型进行除法运算,然后再将结果转换为所需的数据类型。例如:如果输入波段为8-bit字节型,想将结果取整并存储为16-bit整型数据,使用下面的表达式:
fix(ceil(b1 / float(b2)))
2.避免整型运算溢出
整型数据包含一个动态的数据范围。如果波段运算将生成的数据相当大或相当小,无法以输入波段的数据类型表示出来,要注意提升相应的数据类型。例如:如果示例表达式中的波段b1和b2为8-bit字节型数据,生成结果的最大值可能为(256*256)=65,025。由于字节型数据所能表示的最大值为255,因此结果的数据类型只有被提升为16-bit无符号整型才能返回正确的值,否则,大于255的值将溢出,并记录一个错误的值。因此使用下面表达式避免数据范围溢出:
uint(b1) * b2
关于IDL数据类型动态范围的详细介绍,参考表15.1。
3.生成混合图像
波段运算为多幅图像的混合提供了简单的方法。例如:如果b1和b2为8-bit字节型数据,下面的表达式将生成一幅新的8-bit字节图像,b2所占权重为0.8,b1所占权重为0.2。
byte(round((0.2 * b1)+(0.8 * b2)))
4.使用数组运算符对图像进行选择性更改
波段运算为图像的选择性更改和来自多幅图像的数据结合提供了简单的方法。在下面的示例中,把两幅图像结合起来进行处理,从而从图像中消除云的影响。在图像b1中,像元值大于200的像元被认为是云,希望用图像b2中的相应像元对它们进行替换。
(b1 gt 200)* b2 +(b1 le 200)* b1
用类似的运算表达式,可以将一幅图像的黑色背景变成白色背景:
(b1 eq 0)*255+(b1 gt 0)*b1
下面的示例是一个较为复杂的表达式。该表达式使用几个标准来生成一幅二进制掩膜图像,用于识别主要为云的像元。该算法可以应用于经过定标的AVHRR日间图像中生成云的掩膜图像。在该表达式中,b4(热红外波段)值必须为负,或b2(反射波段)值必须大于0.65并且b3和b4(中红外和热红外波段)的差值必须大于15度。由于关系运算符为真值(关系成立)返回1值,因此生成的掩膜图像在有云处值为1,在其他区域值为0。
(b4 lt 0)or(b2 gt 0.65)AND(b3 – b4)gt 15
5.最小值和最大值运算符的使用
最小值和最大值运算符也是数组的基础运算符,但与关系运算符或Boolean运算符不同的是:它们不返还真值或假值,而返还实际的最小值和最大值。在下面的例子中,对于图像中的每一个像元,0、b2或b3中的最大值将被加到b1中,该表达式确保加到b1中的值始终为正。
b1 +(0 > b2 > b3)
在下面的例子中,最小值和最大值运算符的同时运用使b1中的值被限制在0和1之间——b1中的值不会大于1或小于0,最后得到的结果在[0,1]范围内。
0 > b1 < 1
有时候需要计算几年内的数据平均值(如NDVI),如果某数据的值为0则不参加计算,如果3个通道都为0,则赋值为0,比如某点b1=4;b2=6;b3=0;那么平均值ave = (b1+b2+b3)/(1+1),则可用以下运算表达式:
(b1>0+b2>0+b3>0) / ( ((b1 gt 0) + (b2 gt 0)+(b3 gt 0)) >1)
6.利用波段运算修改NaN值
NaN为Not a Number的缩写,在遥感图像中属于异常值。很多用户有修改NaN的需求,比如把0值修改为NaN,或把NaN修改为0值等。由于波段运算公式较为复杂,现归纳如下。
(1)修改0值为NaN
float(b1)*b1/b1
提示:分母为0时,返回的就是NaN。
(2)修改特定值(如250)为NaN
b1*float(b1 ne 250)/(b1 ne 250)
提示:分母为0时,返回的就是NaN。
(3)修改NaN为特定值(-999):
finite(b1, /nan)*(-999) or (~finite(b1, /nan))*b1
提示:finite()是IDL函数,获取无效值的下标。
(4)修改NaN为0值
第一步、将NaN值修改为-999或其他图像中不存在的值,表达式为:finite(b1, /nan)*(-999) or (~finite(b1, /nan))*b1。
第二步、将-999修改为0值,表达式为:(b1 ne -999)*b1。
摘自《ENVI遥感图像处理方法 第二版》高等教育出版社