您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页idl开发专题-ENVI功能扩展

idl开发专题-ENVI功能扩展

来源:吉趣旅游网
ENVI功能扩展

本帖最后由 lianyi_dyq 于 2009-4-25 00:06 编辑

1ENVI功能扩展

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 steps return,result

end

以编写(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 EQ

0.,count) $ ELSE count=0

IF (count GT 0) THEN den [ptr]=1.0 ;继续计算比率结果 result=(FLOAT(b1)+b2)/den

IF(count GT 0) THEN result[ptr]=0.0 ;返回结果 RETURN,result END

2.编译函数

编译函数的方法有两种,一是直接编译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]

5

评分次数

gisxn

liuge11

hl5313110

dsbin

linakulamatata

本主题由 dsbin 于 2009-6-29 09:09 加入精华

收藏 分享 评分

地球没了谁都转,世界少了谁都不会乱!

回复 引用 订阅 报告 道具 TOP

2#

lianyi_dy

q

发表于 2009-4-24 23:17 | 只看该作者

本帖最后由 lianyi_dyq 于 2009-4-25 00:14 编辑

1.1用户函数

1.1.1用户函数介绍

用户函数允许用户为ENVI添加新的功能并通过ENVI菜单进行访问。可以添加任意数量的用户函数,并且每个函数都可以获得它自己的菜单选项。当用户通过菜单选择该函数对应的菜单项时,将会 版主 帖子

167

执行这些函数,就如同ENVI的自身函数一样。

1.1.2ENVI菜单介绍

ENVI的菜单系统,包括主菜单和显示窗口菜单,是由ENVI安装目录下menu目录下的envi.men和display.men这两个ASCII码

文件定义的。

MENU目录位置Windows系统上:itt\\idlxx\\products\\envixx\\menu 0

envi.men文件定义了ENVI主菜单中的选项,display.men文件

精华

定义了显示窗口菜单中的选项。每次ENVI启动的时候,这两个文件9

被读入并根据其内容构建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 BEGIN

msg = DIALOG_MESSAGE('数据无效!',/Error)

RETURN

ENDIF ;数据信息查询

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

地球没了谁都转,世界少了谁都不会乱! 影音更酷!马上访问GISALL视频分享中心

回复 引用

报告 道具 TOP

3#

发表于 2009-4-24 23:18 | 只看该作者

本帖最后由 lianyi_dyq 于 2009-11-19 16:45 编辑

添加功能函数将功能函数添加到系统的\\ save_add下有两种

方式,一是将pro源码文件拷贝到\\ save_add目录,一是保存为sav

lianyi_dyq

文件放入\\ save_add目录。

a)源码文件(*.pro)保存sav文件的步骤

i. IDL进程重启 IDL> .Reset_Session

ii编译函数

版主

帖子 1670 精华

9

点击菜单[运行]→[编译*.pro]或鼠标点击工具栏上

编译按钮 ;

按快捷键Ctrl+F8或在命令行中输入.COMPILE

‘*.pro’;

编译函数中调用到的函数: IDL> Resolve_All, /continue_on_error,

skip_routines='envi' iii.保存为save文件

SAVE, file='*.sav', /routines

1.1.4.2编写ENVI组件事件管理模块

编写一个显示数据文件名及基本信息的功能模块。

1.改ENVI下的菜单

在ENVI的菜单配置文件envi.mem中添加“自定义函

数”和“文件信息”菜单选项。

2.编写功能函数

PRO Envi_widget_event,event ;添加编译严格检查 COMPILE_OPT STRICTARR

;选择文件

ENVI_OPEN_FILE,file,r_fid = fid IF fid[0] EQ -1 THEN BEGIN

msg = DIALOG_MESSAGE('数据无效!

',/Error)

RETURN;

ENDIF ;创建TLB

tlb = WIDGET_AUTO_BASE(title='ENVI组件事件测试')

;创建裁剪组件

ws = WIDGET_SUBSET(tlb, uvalue='subset', fid=fid,$

dims=dims, /auto) result = AUTO_WID_MNG(tlb)

;显示选择结果

IF result.accept EQ 1 THEN BEGIN

dims = result.subset

msg = DIALOG_MESSAGE('选择了OK!'+

STRING(13B)+$

'是ROI?'+ STRING(dims[0])+

STRING(13B)+$

'采样起始列位置:'+ STRING(dims[1])+

STRING(13B)+$

'采样终止列位置:'+ STRING(dims[2])+

STRING(13B)+$

'采样起始行位置:'+ STRING(dims[3])+

STRING(13B)+$

'采样终止行位置:'+ STRING(dims[4])+

STRING(13B), $

/information) ENDIF ELSE BEGIN

msg = DIALOG_MESAGE('选择了

Cancel',/information) ENDELSE

END 3.添加功能函数

将功能函数或生成的sav文件拷贝到系统的\\ save_add下。

1.1ENVI的二次开发

ENVI的二次开发能够让用户在命令模式下使用ENVI。这种

方式在以下几种情况下非常有用:

1.用户主要使用IDL工作但偶尔需要用到ENVI的函数; 2.用户希望创建定制的应用程序其中混合了IDL代码和ENVI

函数;

3.用户希望进行大量的ENVI处理而无需人工干预时。 二次开发是通过一系列特定的函数库来执行ENVI的功能,因此为了获取ENVI库函数,有必要了解一下ENVI程序的结构。 ENVI 的功能函数分散在大约50个IDL的 二进制save文件中,这些二进制文件存放在ENVI安装路径下的Save目录下, 在Windows上这些sav文件存放在ITT\\idlxx\\products\\envixx\\save目录下。核心save文件包括了ENVI的基本功能函数,动态运行函数及

ENVI函数运行所需的内部变量。

1.1.1二次开发模式

ENVI二次开发模式的初始化是恢复ENVI的二进制save文

件并调用ENVI的命令ENVI_BATCH_INIT。步骤如下:

1.启动ENVI;

3.启动一个新的IDL编译器,并输入以下命令:

IDL>ENVI, /restore_base_save_files

如果无关键字RESTORE_BASE_SAVE_FILES,最终会

启动正常的ENVI程序; 4.调用ENVI_BATCH_INIT 程序

调用ENVI_BATCH_INIT等于启动了一个没有GUI的新

ENVI。

下面的是批处理初始化的例子:

pro bt_init

envi,/restore_base_save_files envi_batch_init,log_file='batch.log'

envi_batch_exit

end

如果希望在运行ENVI_BATCH_EXIT时不希望IDL也

关闭,那么可以再ENVI的主菜单

[File]→[Perference]→[Miscellaneous]选项,并确定Exit IDL on Exit

from ENVI选项设置为No。

地球没了谁都转,世界少了谁都不会乱! 没有个人空间?GISALL全新上线,点击申请开通

回复 引用

报告 道具 TOP

lianyi_dyq

4#

发表于 2009-4-24 23:51 | 只看该作者

社区公告

ESRI社区近期管理规则!!(关于注册、发帖等事项)

版主

帖子 1670 精华

本帖最后由 lianyi_dyq 于 2009-4-24 23:58 编辑

1.1常用关键字及函数

1.1.1FID

9 文件ID(FID)是一个长整型的标量。FID为ENVI的程序员

提供了一个命名变量,可以被数个ENVI程序所使用,来打开或选

择文件。ENVI程序对该文件进行的所有操作都是通过FID完成的。

1.1.2R_FID和M_FID

ENVI处理程序所产生的影像结果也包括一个R_FID,或者称为返回FID关键字。在掩模处理程序还包括一个M_FID,或者称

为掩模FID关键字,用于确定用作掩模波段的文件。

如果打开文件发生错误,FID将被设置为-1。因此在ENVI中进行编程时,总是要检查FID、R_FID以及M_FID是否有效。当

遇到一个无效的FID,通常从当前的处理程序中返回。

1.1.3DIMS

DIMS[0]:用于存储指向一个打开的ROI区域的指针,仅在

ROI被定义的时候使用,其它时候设为-1

DIMS[1]:采样的起始位置(一个基于0的IDL数组下标)

DIMS[2]:采样的终止位置 DIMS[3]:行的起始位置 DIMS[4]:行的结束位置

1.1.4POSPOS关键字

定义了用于处理的波段位置。因为ENVI处理的文件可能具有多个波段,而使用POS矢量来确定用于处理的波谱子集。要处理

多波段文件的第三波段和第四波段数据,POS=[2,3]。

1.1.5文件管理函数

ENVI文件处理函数为程序员提供了相当大的灵活性。有以下的函数可供编程使用,用户可以根据所需的情况选择所需的函数。

1.1.5.1ENVI_PICKFILE

ENVI_PICKFILE函数产生一个提示用户选择文件的对话框。该函数产生的界面和使用ENVI主菜单选择File->Open Image File

一样的界面。。

1.1.5.2ENVI_SELECT

该函数产生ENVI标准的文件选择对话框,其中包括空间和波谱子区裁剪按钮,以及掩模波段选取按钮。该函数也集成了ENVI_PICKFILE的功能,在对话框上提供了文件打开按钮,用户

可以通过该按钮打开新的ENVI文件。

1.1.5.3ENVI_OPEN_FILE

该函数返回一个文件的FID,它是打开ENVI文件的最直接和

简单的方法。

1.1.5.4ENVI_FILE_MNG

该函数可以打开、关闭或者删除硬盘上的文件。无需用户交互。

1.1.6打开文件函数

ENVI也提供了一些特定的处理程序能够打开和返回外部格式

的文件:

ENVI_OPEN_DATA_FILE

1.1.7获取数据函数

当影像文件非常大时,不适合使用IDL的READU命令将它全部读入到内存中。因此,ENVI提供了两个处理函数能够以小的、易管理的数据块方式读取影像数据。这两个函数也提供了数据逻辑

组织,一次一个波段或是一次光谱切片。

1.1.7.1ENVI_GET_DATA

该函数从一个打开的文件中获取影像数据。它每次只返回某一波段的数据。如果所需的空间数据不止一个波段,必需多次调用该程序以获得该相应波段的数据。数据的范围由DIMS关键字控制。

1.1.8感兴趣区函数

用户可用使用ENVI_GET_ROI_DIMS_PTR正确的设置ROI

指针。

1.1.9数据生成函数

1.1.9.1将影像数据保存到内存

当用户函数的结果是包含在IDL数组中的影像数据时,这些

数据可用以内存方式被ENVI所使用。

ENVI_ENTER_DATA

1.1.9.2将影像数据存入硬盘

由于IDL的WRITEU函数能够产生ENVI格式的文件,ENVI没有提供单独的程序来将IDL的数组写入到磁盘。可以直接使用

IDL的WRITEU函数

OpenW, unit, ’new_envi_image_file.img’, /Get_LUN

WriteU, unit, image_array

Free_LUN, unit

1.1.9.3ENVI_SETUP_HEAD

使用该函数写某个已存入磁盘的影像数据的ENVI头文件。使

用OPEN关键字,允许将影像文件输入到可用波段列表。

1.1.9.4添加投影坐标信息

对数据文件添加投影信息,也就是将投影信息写到ENVI数据的头文件中去。明确ENVI的头文件信息数据中投影坐标信息的内

容和格式。

以一个全球的数据[180,90]为例,如写入WGS-84的经纬度投

影信息,则需要明确下面的内容。

mc = [0.5D,0.5D,-180,90];这里的前面两个值代表的是图像的起点位置,[0.5,0.5]表示的是左上角第一个像素的中心位置为起点;[-180,90]表示左上角该点对应的地理坐标信息,我们想显示全球的

数据,故设为[-180,90]。

ps = [2,2; 代表的是像素的分辨率,经纬度投影默认以度为单位,[180,90]的数据代表的是全球[36,180],故设置为[2,2]。

创建经纬度的投影类型:proj = ENVI_PROJ_CREATE(/geographic) 创建经纬度的map信息:

mapInfo = ENVI_MAP_INFO_CREATE( $

name = 'Geographic', $

mc = mc, $ ps = ps, $ proj = proj, $ /GEOGRAPHIC)

后面就可以进行头文件信息的设置了,添加关键字map_info

即可。

;图像分辨率 ps = [2, 2] ;转换左上角经纬度坐标 mc = [0.5D,0.5D,-180,90] proj = ENVI_PROJ_CREATE(/geographic) ;创建ENVI格式的mapinfo mapInfo = ENVI_MAP_INFO_CREATE( $ name = 'Geographic', $ mc = mc, $ ps = ps, $ proj = proj, $ /GEOGRAPHIC) ;设置头文件 ENVI_SETUP_HEAD, fname=file, $ ns=ns, nl=nl, nb=nb, $ data_type=data_type, $ MAP_INFO = MAPINFO , $ INTERLEAVE =0, $ offset=0, /write

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- jqkq.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务