ENVI波段运算的IDL知识
波段运算的强大功能是由IDL的功能、速度和灵活性所提供的。下面的知识有助于熟练使用波段运算功能并避免一些经常出现的问题。
1.数据类型
IDL中的数学运算与简单地使用计算器进行运算是有一定差别的,要重视输人波段的数据类型和表达式中所应用的常数。每种数据类型,尤其是非浮点型的整型数据都包含一个有限的数据范围。例如,8位字节型数据表示的值仅为0~255,如果对16位整型数据波段求和(b1+b2)并且其值大于255,那么得到的结果将与期望值不符。当一个值大于某个数据类型所能容纳的值的范围时,该值将会溢出(overlow)并从头开始计算。例如,将8位字节型数据250和10求和,结果为4。
类似的情况经常会在波段运算中遇到,因为遥感图像通常会被存储为8位字节型或16位整型。要避免数据溢出,可以使用IDL中的一种数据类型转换功能(参见表)对输入波段的数据类型进行转换。例如,在对8位字节型整型图像波段求和时(结果有大于255),如果使用IDL函数fix( )将数据类型转换为整型:fix(bl)+b2,就可以得到正确的结果。因此,在上面提及的求波段之和(b1+b2+b3)的例子中,正确的表达式应该是fix(bl)+b2+b3。
你可能会有这样的想法:既然浮点型数据可以表示所有的数据值,为什么不在所有的计算中都使用浮点型数据呢?这是因为一个数据所能表现的动态数据范围越大,它占用的磁盘空间也越多。例如,字节型数据的一个像元仅占用1个字节;整型数据的一个像元占用2个字节;浮点型数据的一个像元占用4个字节。可见,浮点型结果将比整型结果多占用一倍的磁盘空间。
2.IDL数据类型的动态变换
一些数字可以使用几种不同的数据类型表达,IDL制定了一些默认规则对这些数据进行解译。因此IDL的数据类型是可以进行动态变换的,也就是说,IDL能够将表达式中的数据类型提升为它在表达式中所遇到的最高数据类型。例如,不包含小数点的整型数字,即使它在8位字节型的动态范围,也常被解译为16位整型数据。如果想为一幅8位字节型数据图像加5,并且使用如下的波段运算表达式:B1+5,数据5将被解译为16位整型数据,因此波段运算结果将被提升为16位整型数据(占用8位字节型图像的两倍磁盘空间)。如果想保持结果为字节型图像,可以使用数据类型计算函数byte():b1+byte(5),或使用IDL中将16位整型数据转换为8位字节型数据的缩写:bl+5B。
数据后的字母“B”表示将该数据解译为字节型数据。如果在波段运算表达式中经常使用常数,这些类似的缩写是很有用的。
3.数组运算符
IDL的数组运算符使用方便且功能强大,它们可以对图像中的每一个像元进行单独检验和处理,而且避免了FOR循环的使用(不允许在波段运算中使用)。数组运算符包含关系运算符(LT、LE、EQ、NE、GE、GT)、Boolean运算符(AND、OR、NOT、XOR)和最小值、最大值运算符(<、>)。这些特殊的运算符对图像中的每个像元同时进行处理,并将结果返还到与输人图像具有相同维数的图像中。例如,要找出所有负值像元并用值-999代替它们,可以使用如下的波段运算表达式:
(b1lt0)*(-999)+(b1ge0)*b1
展开全文
关系运算符对真值(关系成立)返回值为1,对假值(关系不成立)返回值为0。系统读取表达式(bllt0)部分后将返还一个与bl维数相同的数组,其中b1值为负的区域返回值为1,其他部分返回值为0。因此,在乘以替换值-999时,相当于只对那些满足条件的像元有影响。第二个关系运算符(b1ge0)是对第一个的补充一找出那些值为正或0的像元,乘以它们的初始值,然后再加人替换值后的数组中。类似的利用数组运算符的表达式为波段运算提供了很强的灵活性。
4.运算符操作顺序
在波段运算过程中是根据数学运算符的优先级对表达式进行处理的,而不是根据运算符的出现顺序。使用圆括号可以更改操作顺序,系统最先对嵌套在表达式最内层的部分进行操作。IDL运算符的优先级顺序列在表中。具有相同优先级的运算符根据它们在表达式中出现的顺序进行操作。例如,如下表达式(用常数代替波段):
5+3*2求得的值为11,因为乘号运算符的优先级高
(5+3)*2求得的值为16,因为圆括号改变了运算顺序
将优先级的顺序与数据类型的动态变换结合起来时,如果操作不当,将改变表达式的运算结果。要确保将表达式中的数据提升为适当的数据类型,从而避免数据的溢出或在处理整型除法时出现错误。例如,float(5)+10/3中所有的常数都为整型,但float( )函数将结果提升为浮点型数据,由于除号的优先级高于加号,因此先以整型数据进行除法运算,将结果与被提升为浮点型数据的5相加得到一个浮点型结果8.0,而不是所期望的结果8.3。
5.调用整个图像的IDL函数
与其他所有ENVI程序一样,波段运算处理也是分块进行的。如果被处理的图像大于在参数设置中被指定的碎片尺寸(Tile Size),图像将被分解为更小的部分,系统对每一部分进行单独处理,然后再重新组合起来。当使用的IDL函数同时需要调用所有图像数据时,由于波段运算表达式是对每一部分数据进行单独处理的,这种处理方法将会产生问题。例如,在使用求取数组中的最大值的IDL函数MAX( )时:
bl/max(bl)
如果波段运算是分块进行的,则每一个部分除以的值是该部分的最大值,而不是整个波段的最大值。如果运行这个运算式发现波段运算结果中有较宽的水平条带,那很有可能是由于分块处理造成的,因为图像是水平分块的。
返回搜狐,查看更多