2022年遥感数据的波段运算 .pdf
遥感数据的波段运算一、波段运算(Band Math)Band MathTM功能允许你处理导致单个波段输出的复杂表达式。这些数学表达式也可以应用于一个多波段文件中的所有波段,providing“File Math”。关于使用波段运算的更多信息,请参阅ENVI Programmers Guide 第 29 页的“Band Math Basics”。1可利用的波段运算功能(Available Band Math Functions)Band Math 功能为用户提供一个灵活的图像处理工具,其中许多功能是无法在任何其它的图像处理系统中获得的。该功能的能力与 IDL 语言的能力直接相关。可用的函数包括但不仅限于表 4-2 中列出的数学表达式。表 4-2:一些可用的波段运算函数。Series and Scalar 数学三角函数其它波段运算选项加(+)正弦(sin(x)关系运算符(EQ、NE、LE、LT、GE、GT)减(-)余弦(cos(x)逻辑运算符(AND、OR、XOR、NOT)乘(*)正切(tan(x)类型转换函数(byte,fix,long,float,double,complex)除(/)反正弦(asin(x)IDL 返回数组结果的函数最小运算符()反正切(atan(x)User IDL 函数和程序绝对值(abs(x)双曲正弦(sinh(x)名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 7 页 -平方根(sqrt(x)双曲余弦(cosh(x)指数()双曲正切(tanh(x)自然指数(exp(x)自然对数(alog(x)以 10 为底的对数(alog10(x)注意一些有效的 IDL 表达式要求整个输入数组存在于内存中,它可以不必与 ENVI tiling 操作相兼容。2Band Math 对话框(1).选择Basic Tools Band Math.将出现 Band Math 对话框。假如运算结果是一个二维数组,它将接受任何有效的 IDL 数学表达式、函数或程序。(2).在标签为 “Enter an expression:”的文本框内,输入变量名(将被赋值到整个图像波段或可能应用到一个多波段文件中的每个波段)和所需要的数学运算符。变量名必须以字符“b”或“B”开头,后面跟着 5 个以内的数字字符。实例:若你想计算三个波段的平均值,则在文本框“Enter an expression:”内输入数学方程式:(float(b1)+float(b2)+float(b3)/3.0 这时,变量 b1、b2 自动跳入”Previous band math expression”对话框中,可以输入到文本框中。该表达式中使用的三个变量,“b1”是第一个变量,“b2”是第二个变量,“b3”是第三个变量。注意,在本例中,IDL 的浮点型函数用来防止计算时出现字节溢出错误。(3).输入一个有效的表达式被输入,点击“OK”处理。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 7 页 -将出现Variable/Band Name Pairings 对话框。请参见以下部分。4要重新使用、保存或取消任何以前应用的数学表达式:(1).点击显示在“Previous Expression:”列表中的任何表达式,把它导入到“Enter an expression:”文本区中。(2).一旦被导入,点击“OK”,把该表达式应用到一组新的波段。将出现Variable/Band Name Pairings 对话框。请见下列的详细向导。5 要把表达式保存到一个输出文件,点击“Save”,然后当出现 Enter Output Filename 对话框时,键入输出文件名。为了保持一致,输出文件名应该指定扩展名为.exp。(Tips:可以在记事本中先输入复杂的公式,再导入公式文件)。6要恢复原先保存的表达式,点击“Restore”,然后选择适当的文件名。该表达式将显示在“Previous Expression:”列表中。要清除所有原先的表达式,点击“Clear”。图 4-13:Band Math 对话框。Variable/Band Name Pairings 对话框Variable/Band Name Pairings 对话框允许你从一个输入波段列表中,把波段赋值给输入在“Enter an expression:”文本框中的变量。要把一个值赋给原先实例中的变量“b1”:1.在标签为“Variables used in expression:”的文本框内,点击表达式“B1”。2.在标签为“可利用波段列表:”的列表中,点击所需要的波段。注意,一旦第一个波段被选择,只有那些相同空间大小的波段被显示在波段列表中。3.按照同种方法,为“B2”、“B3”等赋予一个值。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 7 页 -要把一个多波段图像赋值给一个或所有变量:1.点击“Map variable to Input file”。2.使用标准的 ENVI 文件选择步骤,选择一个文件(这可视为“File Math”)。所选择的文件可以是波谱子集,但是若一个以上的文件被使用,它们必须有相同的波段数。通过数学表达式修改的文件数学(file math),一个多波段输出图像产生。3.一旦所有变量被定义,标准的 ENVI 输出对话框显示在 Variable/Bands Pairings 对话框的底部。可以把一个波段运算结果作为新的变量输入下一个运算过程。要选择一个空间子集:1.点击 “Spatial Subset”。2.将出现标准的 File Spatial Subset 对话框(第 145 的 “Standardized ENVI Spatial Subsetting”)。系统默认值被设置为处理整个空间场景。要把结果输出到一个文件或内存,选择“File”或“Memory”切换按钮。若选择输出到一个文件,键入一个输出文件名,或使用“Choose”按钮选择一个文件名,然后点击 “OK”。结果图像被显示在可利用波段列表中。二、运用 IDL 程序和波段运算功能由于 ENVI 为你提供对 IDL 性能的访问,你可以使用内置的 IDL 功能部件的能力、IDL 用户函数,或书写你自己的程序执行自定义的操作。这些函数的唯一要求是它们接受一个或多个图像阵列作为输入,并且它们输出一个单波段二维数组的计算结果。这些函数必须保存在 IDL 路径列表内的一个目录下,以便它们将自动编译。通过使用 ENVI 主菜单 System 下拉菜单下的Compile Module选项(见ENVI Programmers Guide 第 23 页的“Incorporating New Routines”),也可以对它们进行编译。以下是用户波段运算功能的一些简单的实例。要获得更多关于使用波段运算执行用户自定义程序的信息,请参阅ENVI Programmer s Guide 第 29 页的“Band Math Basics”和 ENVI 用户函数指南。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 7 页 -波段运算函数 1 下面的实例是一个非常简单的自定义波段运算函数,它把两个波段相加。下面的程序文本可以在一个文本编辑器中输入,并用文件名user_bm1.pro 来保存:实例:FUNCTION user_bm1,b1,b2 RETURN,b1+b2 END 要从Band Math“Enter an expression:”文本框中调用该函数,使用语法:user_bm1(b1,b2)波段运算函数 2 下面的实例是一个自定义的波段运算函数,它把一个变量的数据类型转换为字节型,并将数值倒置(inverts the values)。下面的程序文本可以在一个文本编辑器中输入,并用文件名user_bm2.pro保存:实例:FUNCTION user_bm2,b1 lut=255-BINDGEN(256)b1=BYTSCL(b1)b1=lut(b1)RETURN,b1 END 要从Band Math“Enter an expression:”文本框中调用该函数,使用语法:user_bm2(b1)名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 7 页 -波段运算函数 3 下面的实例是一个自定义的波段运算函数,当 b1 非零时,它用变量 b2 的值代替变量 b1。这一函数对分类图象非常有用,它用于将另一幅图象的像元代替分类的像元。下面的程序文本可以在一个文本编辑器中输入,并用文件名user_bm3.pro 来保存:实例:FUNCTION user_bm3,b1,b2 b1=(b1 NE 0)*b2 RETURN,b1 END 要从Band Math“Enter an expression:”文本框中调用该函数,使用语法:user_bm3(b1,b2)波段运算函数 4 下面的实例是一个自定义的波段运算函数,它计算归一化差值植被指数(Normalized Difference Vegetation Index,NDVI),并把它缩放到字节数据范围。注意,“min”和“max”关键字在函数中是必需的,以确保同样的最小和最大值被用于缩放一个tiled 图像中所有的tiles。对于变量 b1,应该使用一个 0.8 m 附近的红外图像波段,而对于变量 b2,应该使用一个0.6 m 附近的“红”波段。下面的程序文本可以在一个文本编辑器中输入,并保存为user_bm4.pro:实例:FUNCTION user_bm4,b1,b2 b1=bytscl(float(b1)-b2)/(float(b1)+b2),min=-1.0,max=1.0)RETURN,b1 END 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 7 页 -要从Band Math“Enter an expression:”文本框中调用该函数,使用语法:user_bm4(b1,b2)实例 5:作用:The following example creates a custom Band Math function to perform the following ratio and optionally check for divide-by-zero.步骤:在记事本或IDL中编写如下代码文件名为”mfband.pro”保存在ENVI中的“SAVE_ADD”目录下.重启ENVI 调入含至少两个波段的图象输入变量b1,b2在 Enter Expression text box 中输入表达式bm_ratio(b1,b2)function bm_ratio,b1,b2,check=check den=float(b1)-b2 if(keyword_set(check)then ptr=where(den eq 0.,count)$else count=0 if(count gt 0)then denptr=1.0 result=(float(b1)+b2)/den if(count gt 0)then resultptr=0.0 return,result end 注意:Compiling Band Math Functions Custom Band Math functions cannot be compiled with ENVI RT.If you have ENVI RT,you must use a compiled(.sav)file to add a custom Band Math function.名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 7 页 -