,ENVI/IDL,14-波段运算与波谱运算,刘海新,河北工程大学资源学院,ENVI/IDL,1、概述,ENVI 波段运算工具能够调用用户编写的程序进展定制的处理。波段运算工具用来定义输入的波段或文件,并调用用户编写的函数,最终将结果输出到文件或是内存中。,波段运算函数使用变量命名为b1(B1),b2(B2)等等。通过在波段运算表达式窗口中输入函数名和变量名就可以调用该波段运算函数。通过波段运算对话框为变量赋值。,上图通过三个波段的相加说明白波段运算的处理过程。表达式中的每一个波段都对应于一个输入的影像波段,对这三个波段求和并输出结果影像。这个表达式中的每个变量不仅可以对应于单一波段,也可以对应与一个文件。例如:在表达式b1+b2+b3 中,假设b1 映射为文件而b2,b3 映射为单一波段则结果为b1 所对应的文件的全部波段分别和b2、b3 进展求和。,14.1波段运算,ENVI/IDL,2、Band Math工具,要在ENVI 中使用波段运算工具:选择Basic Tools Band Math。将消逝Band Math 对话框,以上面的波段求和为例,说明使用方法。,输入b1+b2+b3,点击add to list添加到以前的band math 表达式中,点击ok弹出变量赋值对话框,如右图。,留意,一旦一个波段选中,则另外所选波段确定要与第一个波段具有一样的行列。,14.1波段运算,可用波段列表,用于变量的赋值,表达式中的变量以及赋值状况,ENVI/IDL,3、使用波段运算需要满足4 个根本条件:,1 必需符合IDL 语言书写波段运算表达式,所定义的处理算法或波段运算表达式必需满足IDL 语法。不过,书写简洁的波段运算表达式无须具备IDL 的根本学问,但是假设所感兴趣的处理需要书写简洁的表达式,建议学习用于波段运算的IDL 学问。,2全部输入波段必需具有一样的空间大小,由于波段运算表达式是依据pixel-for-pixel 原理作用于波段的,因此输入波段在行列数和像元大小必需一样。,14.1波段运算,ENVI/IDL,3表达式中的全部变量都必需用Bn或bn命名表达式中代表输入波段的变量必需以字母“b”或“B”开头,后跟5 位以内的数字。例如:对3 个波段进展求和运算的有效表达式可以用以下3 种方式书写:,b1+b2+b3,B1+B11+B111,B1+b2+B3,4.波段运算表达式所生成的结果必需在行列数方面与输入波段一样。,14.1波段运算,ENVI/IDL,4、用于波段运算的IDL 学问,波段运算的强大功能是由IDL 的功能、速度和灵敏性所供给的。但是要娴熟使用波段运算功能,并不需要成为一个生疏IDL 编程的专家。下面的学问可以帮助娴熟使用波段运算功能并避开一些常常消逝的问题。,1 数据类型,IDL 中的数学运算与简洁的使用计算器进展运算是有确定差异的。要重视输入波段的数据类型和表达式中所应用的常数。每种数据类型尤其是非浮点型的整型数据都包含一个有限的数据范围。例如:字节型数据表示的值仅为0-255,假设对两个字节型数据波段求和b1+b2并且其值大于255,那么得到的结果将与期望值不等。当一个值大于某个数据类型所能容纳的值的范围时,该值将会溢出overflow并从头开头计算,例如:将字节型数据250 和10 求和,结果为4。,14.1波段运算,ENVI/IDL,类似的状况常常会在波段运算中遇到,由于遥感影像通常会被存储为字节型或整型。要避开数据溢出,可以使用IDL 中的一种数据类型转换功能对输入波段的数据类型进展转换。例如:在对两个字节型图像波段求和时,假设使用IDL 函数FIX将数据类型转换为整型,就可以得到正确的结果。例如fixb1+b2,有人可能会问:既然浮点型数据可以表示全部的数据值,为什么不在全部的计算中都使用浮点型数据呢?这是由于一个数据所能表现的动态数据范围越大,它占用的磁盘空间越多。例如:字节型数据的一个像元仅占用1 个字节;整型数据的一个像元占用2 个字节;浮点型数据的一个像元占用4 个字节。浮点型结果将比整型结果多占用一倍的磁盘空间。关于IDL数据类型的占用磁盘空间和数据范围的具体介绍,参考下表。,14.1波段运算,ENVI/IDL,2IDL 数据类型的动态变换,IDL 的数据类型转换功能,例如:fix不是唯一对波段运算结果的数据类型进展转换的方法。这是由于IDL 的数据类型是可以动态变换的,也就是说IDL 能够将表达式中的数据类型转换为它在表达式中所遇到的最高数据类型。由于一些数字例如:小的整型数据可以使用几种不同的数据类型表示出来,因此IDL 必需制定某些默认规章对这些数据进展解译。,例如:不包含小数点的数据,即使它仅包含字节型的动态范围,也将被解译为整型数据。例如:假设想为一幅字节型数据图像加5,并且使用如下的波段运算表达式:B1+5,数据5 将被解释为2 个字节的整型数据,因此波段运算结果将被提升为整型数据图像占用字节型图像的两倍磁盘空间。假设想保持结果为字节型图像,可以使用数据类型计算函数byte:b1+byte5或使用IDL 中将整型数据转换为字节型数据的缩写:b1+5B,在数据后紧跟一个字母B 表示将该数据解译为字节型数据。假设在波段运算表达式中常常使用常数,这些类似的缩写是很有用的。,14.1波段运算,ENVI/IDL,3 留意操作挨次,在波段运算过程中,是依据数学运算符的优先级对表达式进展处理,而不是依据运算符的消逝挨次。使用圆括号可以更改操作挨次,系统最先对嵌套在表达式最内层的局部进展操作。具有一样优先级的运算符依据它们在表达式中消逝的挨次进展操作。例如:5+3*2考虑表达式用常数代替波段 求得的值为11,由于乘号运算符的优先级高5+3*2 求得的值为16,由于圆括号转变了操作挨次将优先级的挨次与数据类型的动态变换结合起来时,假设操作不当,也将转变表达式的运算结果。要确保将表达式中的数据提升为适当的数据类型,从而避开数据的溢出或在处理整型除法时消逝错误。例如,考虑如下例如:float5+10/3 全部的常数都为整型,但float函数将结果转换为浮点型数据,由于除号的优先级高于加号,因此先以整型数据进展除法运算,将结果与被转换为浮点型数据的5 相加得到一个浮点型结果8.0,而不是所期望的结果8.3。假设是5+10/float3,将数据类型转换函数移到除法运算中,将得到期望的结果8.3。,14.1波段运算,ENVI/IDL,4避开在所用的IDL 函数中同时调用全部图像数据,犹如其他全部ENVI 程序一样,波段运算处理也是分块进展的。这意味着假设被处理的图像大于在参数设置中被指定的局部tile尺寸,运算将被分解为更小的局部,系统对每一局部进展单独处理,然后再重新组合起来。当使用的IDL 函数同时需要调用全部图像数据时,由于波段运算表达式是对每一局部数据进展单独处理的,这种处理方法将会产生问题。,例如,在使用求取数组中的最大值的IDL 函数MAX时:b1/maxb1,假设波段运算是分块进展的,则每一个局部除以的值是该局部的最大值,而不是整个波段的最大值。假设觉察波段运算结果中有较宽的水平条带,那很有可能是由于分块处理造成的,由于图像是水平分块的。要避开同时调用全部图像数据的IDL 函数还包括:MAX、MIN、MEAN、MEDIAN、STDDEV、VARIANCE 和TOTAL。在多数状况下,使用BYTSCL 函数也比较困难,但是假设先知道了输入波段的数据范围,可以将BYTSCL 函数与MIN 和MAX 关键字合并起来使用。,14.1波段运算,ENVI/IDL,5充分利用IDL 功能强大的数组运算符,IDL 的数组运算符不但便于使用而且功能强大。它们允许对图像中的每一个像元进展单独检验和处理,而且避开了FOR 循环的使用不允许在波段运算中使用。数组运算符包含关系运算符LT、LE、EQ、NE、GE、GT、Boolean 运算符AND、OR、NOT、XOR和最小值、最大值运算符。这些特殊的运算符对图像中的每个像元同时进展处理,并将结果返还到与输入图像具有一样维数的图像中。,例如:要找出全部负值像元并用值-999 代替它们,可以使用如下的波段运算表达式:b1 lt 0*-999+b1 ge 0*b1,关系运算符对真值关系成立返回值为1,对假值关系不成立返回值为0。系统读取表达式b1 lt 0局部后将返还一个与b1 维数一样的数组,其中b1 值为负的区域值为1;其他局部值为0,因此在乘以替换值-999 时,相当于只对那些满足条件的像元有影响。,其次个关系运算符b1 ge 0是对第一个的补充找出那些值为正或0 的像元,乘以它们的初始值,然后再参与替换值后的数组中。类似的使用数组运算符的表达式为波段运算供给了很强的灵敏性。,14.1波段运算,ENVI/IDL,5、波段运算表达式典型例子,1 避开整型数据除法,当对整型数据波段进展除法运算时,运算结果不是被向上或向下取整,而是直接被简洁地舍去小数点后面的数据被舍弃。要避开这种状况发生,通常将数据类型提升为浮点型。,b1/floatb2,假设想将除法数据结果保持为整型,最好先将数据转换为浮点型进展除法运算,然后再将结果转换为所需的数据类型。例如:假设输入波段为字节型,想将结果取整并存储为整型数据,使用下面的表达式:,fixceilb1/floatb2,14.1波段运算,ENVI/IDL,2 避开整型运算溢出,整型数据包含一个动态的数据范围。假设波段运算将生成的数据相当大或相当小,无法以输入波段的数据类型表示出来,要留意提升相应的数据类型。例如:假设例如表达式中的波段b1 和b2 为字节型数据,生成结果的最大值可能为256*256=65,025。由于字节型数据所能表示的最大值为255,因此结果的数据类型只有被转换为16-bit无符号整型才能返回正确的值,否则,大于255 的值将溢出,并记录一个错误的值。可以使用如下表达式避开溢出,unitb1*b2,14.1波段运算,ENVI/IDL,3 生成融合图像,波段运算为多幅图像的融合供给了简洁的方法。例如:假设b1 和b2 为字节型数据,下面的表达式将生成一幅新的字节图像,b2 所占权重为0.8,b1 所占权重为0.2。,byteround0.2*b1+0.8*b2round为整型取整,4 使用数组运算符对图像进展选择性更改,波段运算为图像的选择性更改和来自多幅图像的数据结合供给了简洁的方法。在下面的例如中,把两幅图像结合起来进展处理,从而从影像中消退云的影响。在图像b1 中,像元值大于200 的像元被认为是云,希望用图像b2 中的相应像元对它们进展替换。,b1 gt 200*b2+b1 le 200*b1,14.1波段运算,ENVI/IDL,下面的例如是一个较为简洁的表达式,但是所使用的数组运算符与前面的例如大同小异。该表达式使用几个标准来生成一幅二进制掩膜图像,用于识别主要为云的像元。该算法实际应用于从来自AVHRR 的经过定标的日间图像中生成云的掩膜图像。在该表达式中,b4热红外波段值必需为负,或b2反射波段值必需大于0.65 并且b3 和b4中红外和热红外波段的差值必需大于15 度。由于关系运算符为真值关系成立返回1 值,因此生成的掩膜图像在有云处值为1,在其他区域值为0。,b4 lt 0orb2 gt 0.65ANDb3 b4gt 15,14.1波段运算,ENVI/IDL,5 最小值和最大值运算符的使用,最小值和最大值运算符也是数组的根底运算符,但与关系运算符或Boolean 运算符不同的是:它们不返还真值或假值,而返还实际的最小值和最大值。在下面的例如中,对于图像中的每一个像元,0、b2 或b3 中的最大值将被加到b1 中,该表达式确保加到b1 中的值始终为正。,b1+0 b2 b3,14.1波段运算,ENVI/IDL,Spectral Mat功能是一种灵敏的波谱处理工具,它允许用数学表达式或IDL 程序对波谱以及选择的多波段图像进展处理。波谱可以来自一幅多波段图像即一个Z 剖面、波谱库或