ENVI功能扩展
- 格式:doc
- 大小:603.00 KB
- 文档页数:16
/ESRI/thread-45231-1-1.html1ENVI功能扩展ENVI作为功能强大的遥感软件,扩展ENVI的功能包括创建波段和波谱数学函数、自定义数据输入、交互式用户程序和ENVI二次开发等。
ENVI的扩展,包括波段和波谱运算函数,自定义的空间、波谱,或是感兴趣区域(ROI)的处理,用户函数,自定义文件输入程序,批处理,以及其它如报告和绘图工具等。
ENVI提供了一系列工具为程序员使用,能够极大地简化自定义程序的开发,并保持和ENVI一致的外观。
1.1ENVI波段运算和波谱运算对于用户来说,扩展ENVI的功能最简单方法就是使用波段和波谱运算函数。
用户可以交互式通过波段和波谱运算表达式对话框输入大多数的波段和波谱运算函数。
波段运算函数允许用户从任何波段或是文件中输入数据,处理数据,并输出整个波段。
波谱运算函数允许用户从图表或文件中输入波谱数据,处理数据,并输出一个波谱。
这种模式下,所有的数据的输入输出、获取、波段或波谱函数的调用及结果的输出都由ENVI中控制。
因此使用波段或波谱函数进行处理时,用户不需要修改菜单、不必创建参数输入部件,不用执行I/O操作,只需在用户编写的函数中提供数据的计算处理功能。
1.1.1波段运算下图通过三个波段的相加说明了波段运算的处理过程。
表达式中的每一个波段都对应于一个输入的影像波段,对这三个波段求和并输出结果影像。
这个表达式中的每个变量不仅可以对应于单一波段,也可以对应与一个文件。
例如:在表达式b1+b2+b3中,如果b1映射为文件而b2,b3映射为单一波段则结果为b1所对应的文件的所有波段分别和b2、b3进行求和。
波段运算可以方便的进行特定波段的自定义处理,快速高效的使用波段运算需要用户能灵活的应用IDL下的数学运算,编写过程中可参考章节2.2数组和2.7运算符。
波段运算时变量的定义必须以“b”或“B”开头,后面为数字且数字位数不超过5。
ENVI波段运算工具的使用有两种方式,数学表达式和波段运算函数。
1.1.1.1数学表达式编写数学表达式进行波段运算的步骤如下:1.在ENVI主菜单下,选择[Basic Tools]→[Band Math],在弹出的BandMath界面中,在[Enter an Expresion]里面输入表达式。
2.点击Add to list按钮,然后在[Previous Band Math Expressions]里面选择输入的表达式点击OK。
3.在弹出的界面中选择表达式中变量赋需要计算的波段。
1.1.1.2波段运算函数编写波段运算函数跟数学表达式相比,在操作上更灵活,函数中可以添加更多的控制,如运算中的错误检测等。
波段运算函数的编写非常简单,接受输入波段,处理数据,并返回结果。
以下面的方式定义:Function bm_func,b1,[b2,…,bn, parameters and keywords]processing stepsreturn,resultend以编写(b1+b2)/ (b1-b2)功能为例,编写波段运算函数步骤如下:1.编写函数并保存;函数定义为两个输入波段b1和b2以及一个check关键字FUNCTION Bm_ratio,b1,b2,check=check;计算差值den=FLOAT(b1)-b2;如果设置了check关键字,检查被0除问题IF(KEYWORD_SET(check)) THEN ptr=WHERE(den EQ0.,count) $ELSE count=0IF (count GT 0) THEN den [ptr]=1.0;继续计算比率结果result=(FLOAT(b1)+b2)/denIF(count GT 0) THEN result[ptr]=0.0;返回结果RETURN,resultEND2.编译函数编译函数的方法有两种,一是直接编译pro,一是拷贝函数或保存的sav文件到相应的目录下重启ENVI+IDL。
a)在ENVI的主菜单下,选择[File]→[Compile IDL Module],选择函数进行编译;b)把bm_ratio.pro或sav文件放入ENVI安装目录下的..\ envi46\save_add下,重新启动ENVI+IDL即可。
3.执行函数在ENVI主菜单下,选择[Basic Tools]→[Band Math],在弹出的BandMath 界面中,在[Enter an Expresion]里面输入函数调用点击[OK]执行。
1.1.2波谱运算下图三个波谱的相加来说明波谱运算的过程。
表达式中的每一个变量都被映射为一个输入波谱,对这三个波谱求和并将结果输出到绘图窗口。
表达式中的变量也可以映射为文件而不仅是单一波谱,在这种情况下,结果将是一幅新的影像。
波谱运算的操作步骤跟波段运算基本一致,不同之处有:1.变量命名以“S”或“s”开头;2.执行时ENVI主菜单下,选择[Basic Tools]→[Spectral Math]1.1用户函数1.1.1用户函数介绍用户函数允许用户为ENVI添加新的功能并通过ENVI菜单进行访问。
可以添加任意数量的用户函数,并且每个函数都可以获得它自己的菜单选项。
当用户通过菜单选择该函数对应的菜单项时,将会执行这些函数,就如同ENVI的自身函数一样。
1.1.2ENVI菜单介绍ENVI的菜单系统,包括主菜单和显示窗口菜单,是由ENVI安装目录下menu目录下的envi.men和display.men这两个ASCII码文件定义的。
MENU目录位置Windows系统上:itt\idlxx\products\envixx\menu envi.men文件定义了ENVI主菜单中的选项,display.men文件定义了显示窗口菜单中的选项。
每次ENVI启动的时候,这两个文件被读入并根据其内容构建ENVI的菜单。
在菜单中添加内容,只需在这两个文件中添加相应的内容并重启ENVI即可。
使用任何文本编辑器就可以打开envi.men文件。
在文件的顶部有些介绍的注释文本。
注释结束后,就是如下的文件的结构:0 {File}1 {Open Image File} {open envi file} {envi_menu_event}1 {Open Vector File} {open vector file} {envi_menu_event}1 {Open Remote File} {open remote file} {envi_menu_event}1 {Open External File} {separator}2 {Landsat}3 {Fast} {open eosat tm} {envi_menu_event}每一行开始的数据定义了菜单项的层次。
0表示最顶层,1表示一级子菜单,2表示二级子菜单,如此类推。
{Open Image File}第一个大括号括起来的部分定义了显示在菜单上的内容。
{open envi file}第二个大括号括起来的部分定义了为菜单项所赋给的用户值。
用户值在同一用户函数处理多个菜单项时非常有用,可以区别那个菜单项被选中。
{envi_menu_event}第三个大括号定义了菜单项事件处理程序的名称,即编写的用户函数名。
该处使用的是用户函数名,而不是用户函数所在的文件名,所以没有后缀。
1.1.3ENVI组件介绍用户函数可以实现扩展ENVI的功能部分,如果实现仅仅是无用户交互的简单功能函数编写就足够了,但如果涉及到了用户的交互式操作,如参数输入等模块,就会显得复杂了。
虽然IDL可以编写通常的组建来满足需求,但在ENVI 的功能扩展下面事件的控制就显得不那么方便了。
ENVI提供了以WIDGET_开头的20多个功能组件来满足用户的需要,很多部件都包括“OK”和“Cancel”等按钮方便用户进行交互操作。
1.1.3.1ENVI下组件介绍1.ENVI_PICKFILE组件该部件进行文件选择操作。
2.ENVI_SELECT组件于ENVI中一样,该部件提供文件的波段和范围选择操作。
3.WIDGET_EDIT组件4.WIDGET_GEO组件5.WIDGET_MAP组件6.WIDGET_MENU组件7.WIDGET_MULTI组件8. .......1.1.3.2事件管理IDL编写程序时,界面组件要先用Widget_Base创建顶组件,然后需要用XMANAGER程序进行事件的传递和获取。
ENVI下自动管理事件的组件容器则需要用WIDGET_AUTO_BASE来创建顶级容器(Top Level Base)和AUTO_WID_MNG函数进行事件的管理,此时组件需要添加关键字AUTO_MANAGE。
这种方式的应用使得ENVI下的函数扩展看起来比IDL简单的多。
1.1.4编写实例以两个例子的方式讲述了简单函数和界面组件函数扩展ENVI的步骤。
1.1.4.1扩展ENVI简单函数编写编写一个显示数据文件名及基本信息的功能模块。
1.修改ENVI下的菜单在ENVI的菜单配置文件envi.mem中添加“自定义函数”和“文件信息”菜单选项。
2.编写功能函数;PRO Envi_file_info,event;添加编译严格检查COMPILE_OPT STRICTARR;选择文件ENVI_OPEN_FILE, fname, r_fid=fid;如无效则返回IF fid[0] EQ -1 THEN BEGINmsg = DIALOG_MESSAGE('数据无效!',/Error)RETURNENDIF;数据信息查询ENVI_FILE_QUERY, fid, ns=ns, nl=nl, nb=nb, fname=fname;提示msg = DIALOG_MESSAGE('文件名:'+ fName + STRING(13B)+$'波段数:'+STRING(nb)+ STRING(13B)+ $'大小:'+STRING(ns)+'*'+STRING(nl),$/Information)END添加功能函数将功能函数添加到系统的\ save_add下有两种方式,一是将pro 源码文件拷贝到\ save_add目录,一是保存为sav文件放入\ save_add目录。
a)源码文件(*.pro)保存sav文件的步骤i. IDL进程重启IDL> .Reset_Sessionii编译函数点击菜单[运行]→[编译*.pro]或鼠标点击工具栏上编译按钮;按快捷键Ctrl+F8或在命令行中输入.COMPILE ‘*.pro’;编译函数中调用到的函数:IDL> Resolve_All, /continue_on_error, skip_routines='envi'iii.保存为save文件SAVE, file='*.sav', /routines1.1.4.2编写ENVI组件事件管理模块编写一个显示数据文件名及基本信息的功能模块。