ENVI/IDL二次开发介绍
ENVI程序中的通用关键字
- FID
FID是一个长整型的标量。FID为ENVI的程序员提供了一个命名变量,可以用于一个或几个ENVI程序,来打开或选择文件。所有对该文件进行操作的ENVI程序都是通过FID完成。
需要注意的是,FID和LUN是不同的。如果文件打开失败,则FID返回为-1 - R_FID和M_FID
ENVI处理程序产生结果一幅新图像也包括一个R_FID,或者称为返回FID关键字。如果结果是存在内存中的,设置R_FID关键字是访问数据的唯一方法。
运行进行掩模的处理程序还包括一个M_FID,或者称为掩模关键字用于确定用作掩模波段的文件。 - DIMS
DIMS关键字是一个5个元素长整型数组。它定义了处理数据的空间子集。当需要确定FID的时候,你必须同时确定该文件的空间范围。
DIMS[0] 存储一个打开的ROI区域的指针,仅在ROI被定义的时候使用,其它时候设为-1L
DIMS[1] 采样的起始位置Sample start
DIMS[2] 采样的终止位置Sample end
DIMS[3] 行的起始位置Line start
DIMS[4] 行的结束位置Line end - POS
POS关键字定义了用于处理的波段位置,是一个变长的长整型数组。波段从0开始,例如,要处理第三波段和第四波段,POS=[ 2 , 3 ]
常用ENVI功能函数介绍
- 文件管理
ENVI_PICKFILE:产生一个提示用户选择文件的对话框,并返回用户所选择的文件名
ENVI_SELECT:产生对话框提示用户从ENVI中已经打开的文件中选择一个文件,并返回用户所选择文件的FID,该函数还可以返回DIMS和POS的值
ENVI_OPEN_FILE:该函数返回一个文件的FID,并将文件信息添加到可用波段列表中
ENVI_FILE_MNG:该函数可以打开、关闭或者删除硬盘上的文件。无需用户干预
ENVI_GET_FILE_IDS:该函数返回所有当前打开的文件的FID - 打开外部文件格式
ENVI_OPEN_DATA_FILE:该函数打开ENVI所支持的外部文件(无ENVI头文件)并返回FID - 获取数据
ENVI_GET_DATA:该函数从一个打开的文件中获取影像数据。它每次只返回某一波段的数据,数据的范围由DIMS关键字控制。
ENVI_GET_SLICE:该函数从一个打开的文件中获取波谱影像数据,它返回影像某一行所有波段的数据值。结果以BIP或BIL的格式返回 - 将数据输入到内存
ENVI_ENTER_DATA:该函数将IDL数组中的数据输入到内存中,并通过可用波段列表进行管理。 - 将影像数据存入硬盘
使用IDL的WRITEU函数写入数据
ENVI_SETUP_HEAD:使用该函数写某个影像数据的头文件
ENVI批处理模式
- 批处理模式简介
以批处理模式运行ENVI能够让用户在命令行模式下使用ENVI。这种能力在以下几种情况下非常有用:
(1)用户主要使用IDL工作但需要偶尔用到ENVI的函数;
(2)用户希望创建定制的应用程序混合了IDL代码和ENVI函数;
(3)用户希望进行大量的ENVI处理而无需人工干预。
批处理模式的ENVI和正常模式下没有什么区别,只是通过一系列的特定的函数库来执行ENVI的功能。为了使用这些函数,必须首先将它们恢复到IDL内存中。因此为了正确获取这些函数,有必要了解一下ENVI程序的结构。
ENVI功能文件由大约40个小的IDL save文件组成,这些文件是包括数据和编译后的程序的二进制文件。这些save文件存放在ENVI安装目录下的Save目录下。ENVI的核心save文件包括ENVI的基本功能函数,动态运行函数以及ENVI运行所需的内部变量。 - 如何开始批处理模式
恢复ENVI sav文件envi, /restore_base_save_files
开始批处理模式envi_batch_init, log_file=’batch.txt’
退出批处理模式envi_batch_exit
用户函数
- 用户函数介绍
用户函数允许用户为ENVI添加新的功能并通过ENVI的菜单进行访问。用户能够添加任意数量的用户函数,并且每个函数都可以获得它自己的菜单选项。当用户通过菜单选择用户函数时,将会执行这些函数,如同ENVI的其它函数一样。用户函数和IDL程序没有什么区别,可以称为ENVI的程序。在某种意义上说,它们和批处理模式也很接近,除了无需初始化批处理模式。
用户函数是事件的处理程序。因此,所有的ENVI用户函数必须遵循事件处理的基本规则,即用户函数定义时必须要加上一个附加的变量来接受事件结构。即使用户函数中不会用到事件信息,这个附加参数也必须要加上。
Pro ProName, ev
Function FunName,ev - 可用的ENVI小部件
ENVI_PICKFILE:用于从硬盘上选择一个文件。可以用来收集任意类型的文件名。
ENVI_SELECT:ENVI标准的文件选择对话框,用来选择一个打开的文件,确定空间和光谱子区,以及掩模波段。它也包括了一个打开按钮,能够允许用户从硬盘上打开一个新的文件。
WIDGET_EDIT:提供了一个部件从列表中选择项目。
WIDGET_GEO:用于提示用户选择经纬度值。
WIDGET_MAP:用于编辑地图坐标和投影
WIDGET_MENU
WIDGET_MULTI:用于多项选择
WIDGET_OUTF:用于选择一个输出文件名
WIDGET_OUTFM:用于选择一个输出文件名或是输入到内存
WIDGET_PARAM:
WIDGET_PMENU:提供下拉菜单
WIDGET_RGB:用于修改RGB颜色值
WIDGET_SLABEL:用于显示文本信息
WIDGET_STRING - 小部件事件自动管理程序
通常在IDL程序中,程序员要对程序中使用的小部件编写事件处理程序。这对新使用IDL的用户来说,是一个比较大的难题。因此为了方便使用ENVI用户函数,ENVI中提供了自动事件处理程序。这种自动事件处理程序能够自动的管理所有ENVI部件产生的事件。主要有两个函数进行事件的自动管理。
WIDGET_AUTO_BASE
在通常的IDL程序中,所有的BASE部件,包括顶级BASE,都是通过WIDGET_BASE函数创建的。但是,在ENVI编程中,如果要创建事件自动管理的部件构架,必须通过WIDGET_AUTO_BASE创建顶级BASE,在构建GUI的过程中使用的其它BASE使用原来的WIDGET_BASE函数创建。使用WIGET_AUTO_BASE函数创建的顶级BASE是自动列对齐,居中和模态化的。WIGET_AUTO_BASE仅介绍几个关键字来控制它的属性。
AUTO_WID_MNG
在通常的IDL部件程序中,一旦GUI被定义,XMANAGER程序会被调用进行部件的注册并进行部件事件的检测。而在自动事件管理的ENVI程序中,无须调用XMANAGER程序,相反,一个ENVI函数AUTO_WID_MNG被调用进行部件的注册,检测事件,并以结构的形式返回用户输入的值。
使用影像分块技术
- 影像分块技术简介
•ENVI的处理函数获取输入影像数据,处理数据,并输出新的影像,绘图或是提供报告。ENVI的处理函数通常都是和ENVI的影像分块技术集合在一起,以处理任意空间和波谱大小的影像。
•空间分块的大小能够在配置文件中定义,而波谱分块的大小总是等于采样的数目乘上波段数(sample*band)。
•所有的ENVI用户函数也能够通过ENVI内建的分块函数获取数据。这确保了用户函数也能够处理任意大小的数据文件。ENVI的分块来自于三种格式:BSQ格式,BIL格式以及BIP格式。ENVI还提供了进度条部件来显示分块的处理情况。
•ENVI也提供了未使用分块技术的函数,但是不推荐使用,因为它仅能用于比较小的文件。当然未使用分块技术的函数是一种快速的访问数据的方法,因此可用于快速进行程序原型的开发。
•分块处理程序:ENVI分块处理将输入数据分成同样大小的单元,可以是空间方式也可以是波谱方式,以确保所有大小的影像都能被处理。一个空间分块的大小是n行所有列,而波谱分块的大小是Sampleband。
•空间分块近似等于按输入波段对影像进行分块,因此可以不用考虑文件的存储方式而进行空间处理。但访问单一文件的多个波段,所有波段将拥有同样数目的空间分块。通常进行空间分块的都是BSQ文件,而进行波谱分块的是BIL或BIP文件。使用和输入文件同样的存储方式非常有效。
•当进行邻域处理时,空间分块也可以设定重叠的行数。重叠行仅加在每个分块的顶部,在整个波段作为一个分块时,没有重叠行。例如:进行3x3卷积时,需要一行重叠来处理上一个分块的最后一行。
•分块处理的步骤如下:
**初始化空间或波谱分块需求,使用ENVI_INIT_TILE
获取分块输入数据,ENVI_GET_TILE
当所有的分块数据都处理完毕,释放分块需求,ENVI_TILE_DONE**
•保存结果
输出文件通过使用IDL程序OPENW写入,在调用OPENW程序前,需要通过GET_LUN函数获得文件单元号。通过IDL程序WRITEU函数将处理后的分块数据写入文件。在所有分块数据都写入后,文件被关闭,文件单元号通过IDL程序FREE_LUN释放。
一旦文件被写入硬盘,可以使用ENVI函数ENVI_SETUP_HEAD进行ENVI头文件的写入。下列文件信息必须写入头文件:文件名,采样数,行数,波段数,偏移,存储方式,以及数据类型。此外还有一些可选的关键字。如X、Y的起始位置,文本描述,波段名称等等。
编译用户函数
•由于IDL编译器不能识别ENVI库函数,因此用户程序在编译的时候通常会报错。
•同时为了向下兼容,IDL编译器将()作为数组的定义,当IDL编译器不能识别函数时,它会将它当作是数组定义,从而导致编译错误。
•FORWARD_FUNCTION可以告诉编译器,哪些变量是函数,而非数组定义。
•COMPILE_OPT STRICTARR则强制编译器以[]作为数组的定义。
RESOLVE_ALL
•在IDL程序中,用到许多IDL内置的函数,都是以源码的形式提供的。在IDL编译器中,它们被自动编译。但是在ENVI中,ENVI不能编译这些函数,因此要想将用户函数打包,必须要找到所有依赖的函数,而IDL提供了一个工具函数就是RESOLVE_ALL,该函数可以自动寻找和编译用户程序所依赖的所有函数。
•在使用RESOLVE_ALL函数时要注意,它也不能识别ENVI库函数,在遇到ENVI库函数时会报错,因此在使用时,必须加上CONTINUE_ON_ERROR关键字。
例子编译用户函数
•在用户函数中加入COMPILE_OPT STRICTARR或是使用FORWARD_FUNCTION函数
•保存修改后的代码
•启动一个新的Session
•编译修改后的用户函数
•使用RESOLVE_ALL函数编译所有依赖函数:
•RESOLVE_ALL, /CONTINUE_ON_ERROR
•使用SAVE函数将用户函数存为SAVE文件
•SAVE, file=’my_user_function.sav’, /routines
•注:save文件名必须和用户函数名一致,并包括一个.sav后缀,编译后的SAVE文件必须放入ENVI安装目录下的save_add目录中。
ENVI提供的交互工具
- 绘图工具
•ENVI为用户提供了访问ENVI绘图窗口的方法。用户能够定义一系列的绘图并将其载入到绘图窗口中。ENVI函数ENIV_PLOT_DATA用于绘制X、Y数据。可选的关键字有绘图的标题,颜色,名称,线形,轴名以及各个绘图的标题。 - 报告
用户可以使用ENVI提供的报告部件来显示文本数据。这个报告部件通过ENVI_INFO_WID创建,它能够将用户提供的字符串数组中的每一个元素以新的一行显示。ENVI将会自动管理报告部件的事件,用户无需编写事件处理程序。 - RGB颜色三元组
•在很多ENVI函数中要使用到颜色索引,而其它的函数使用RGB颜色三元组。ENVI函数ENVI_GET_RGB_TRIPLETS 可以返回任何颜色索引的RGB值。为了避免颜色索引超出系统的颜色数,函数内部采用了求摸得运算。
•注:用户可以添加自定义的颜色到ENVI系统中,通过修改ENVI 目录下的colors.txt文件。 - 获取文件信息
•ENVI提供了ENVI_FILE_QUERY函数用来获取文件的信息,这些文件信息可以用于ENVI_SETUP_HEAD和ENVI_ENTER_DATA等函数。 - 文件管理工具,ENVI提供了几个函数可以进行文件的管理:
•ENVI_FILE_MNG 管理打开的文件,可以将打开的文件关闭,删除
•ENIV_OPEN_DATA_FILE 打开一个ENVI支持的外部文件
•ENVI_OPEN_FILE 打开一个影像文件
•ENVI_OUTPUT_TO_EXTERNAL_FORMAT 将ENVI文件输出为外部格式
•ENVI_PICKFILE ENVI的文件选取函数
•ENVI_SELECT 选择一个打开的ENVI图像文件
References
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭