【ENVI入门系列】22.ENVI功能扩展与二次开发
版权声明:本教程涉及到的数据仅供练习使用,禁止用于商业用途。
目录
ENVI功能扩展与二次开发
1.
2.
2.1
2.2
2.2.1
2.2.2
2.3
2.4
2.4.1
2.4.2
2.4.3
2.4.4
3.
3.1
3.2
3.3
3.4
3.5
3.6
1. 概述
一、ENVI功能扩展
图:灵活地对ENVI进行功能扩展
二、ENVI二次开发
2. ENVI Classic开发技术
2.1 ENVI Classic菜单介绍
-
ENVI 4.x:Home:\Program Files\ITT\IDL\IDLXX\products\enviXX\menu
-
ENVI Classic:Home:\Program Files\Exelis\ENVIXX\classic\menu
一、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} |
-
{Open Image File}:第一个大括号括起来的部分定义了显示在菜单上的内容。
-
{open envi file}:第二个大括号括起来的部分定义了为菜单项所赋给的用户值。用户值在同一用户函数处理多个菜单项时非常有用,可以区别那个菜单项被选中。
-
{envi_menu_event}:第三个大括号定义了菜单项事件处理程序的名称,即编写的用户函数名。该处使用的是用户函数名,而不是用户函数所在的文件名,所以没有后缀。
二、修改方法
ENVI_DEFINE_MENU_BUTTON, ButtonInfo [, /DISPLAY], $ EVENT_PRO=string | /MENU | UVALUE=string [, POSITION=long integer or string] [, REF_INDEX=long integer] [, REF_UVALUE=variable], REF_VALUE=string [, SEPARATOR={0 | 1 | -1}] [, /SIBLING], VALUE=string |
-
Display-是创建在主菜单还是显示菜单;
-
VALUE -菜单的显示信息 -必须的;
-
UVALUE -必须的;
-
EVENT_PRO-程序事件名称;
-
Menu- 是否为菜单;
-
REF_INDEX-如REF_VALUE不唯一则可用此来设置;
-
REF_VALUE -作为parent的已存在菜单名;
-
SIBLING -是否创建同级菜单;
2.2 ENVI Classic组件介绍
2.2.1 组件介绍
图 ENVI Classic帮助中的组件列表
为了大家能方便使用和查找,特意将ENVI提供的组件名称与功能进行了总结,如下表所示。
表:界面组件一览表
函数名称 |
功能描述 |
AUTO_WID_MNG |
对ENVI的复合组件自动进行事件调度。 |
ENVI_CENTER |
获得组件居中的偏移量。 |
ENVI_COLLECT_SPECTRA |
进行端元波谱收集。 |
ENVI_DEFINE_MENU_BUTTON |
在ENVI 菜单系统中自动创建菜单按钮。 |
ENVI_INFO_WID |
在信息提示界面中显示文本数据。 |
ENVI_PICKFILE |
对话框选择文件。 |
ENVI_SELECT |
选择文件和波段的对话框组件。 |
RGB_GET_BANDS |
显示一对话框组件来从当前文件列表中选择三个波段。 |
WIDGET_AUTO_BASE |
创建自动调度事件管理的组件。 |
WIDGET_EDIT |
编辑多行文字列表的复合组件。 |
WIDGET_GEO |
度分秒方式输入经纬度的复合组件。 |
WIDGET_MAP |
输入和编辑投影坐标系统的组件。 |
WIDGET_MENU |
创建单选或复选框的组件 |
WIDGET_MULTI |
多选的复合组件。 |
WIDGET_OUTF |
输出文件选择的组件。 |
WIDGET_OUTFM |
输出到文件还是到内存的选择组件。 |
WIDGET_PARAM |
设定输入格式的参数输入组件。 |
WIDGET_PMENU |
下拉列表组件。 |
WIDGET_RGB |
RGB、HLS或HSV方式修改颜色组件。 |
WIDGET_SLABEL |
显示文本信息的组件。 |
WIDGET_SLIST |
列表显示选择组件。 |
WIDGET_SSLIDER |
滑动条组件。 |
WIDGET_STRING |
文本字符串输入组件。 |
WIDGET_SUBSET |
选择裁剪范围组件,包含文件坐标、地理坐标、文件等类型。 |
WIDGET_TOGGLE |
开关按钮组件。 |
2.2.2 事件管理
2.3 ENVI Classic功能扩展实例
(1) 启动IDL工作台,并将"envi_file_info.pro"源码文件在IDL编辑器中打开;
(2) 点击IDL工具栏中的"编译"按钮,将pro编译到内存中,控制台提示如下:
IDL> .compile –v 'D:\ENVI&IDL资料库\2014ENVI入门学习素材包\22.ENVI二次开发\Codes\envi_file_info.pro' % Compiled module: ENVI_FILE_INFO_DEFINE_BUTTONS. % Compiled module: DEFINEFUN. % Compiled module: ENVI_FILE_INFO. |
注:在编译前,建议先点击"重置"按钮,将IDL进程重置。
(3) 在控制台输入如下命令,将pro文件编译为sav文件,然后将sav文件拷贝到save_add路径(C:\Program Files\Exelis\ENVI51\classic\save_add);
IDL> save, filename='C:\envi_file_info.sav',/routines |
(4) 重启ENVI Classic,查看菜单添加效果与事件响应结果。如下图所示。
图:添加菜单效果和事件响应
2.4 ENVI Classic二次开发
(1) 用户主要使用IDL工作但偶尔需要用到ENVI的函数;
(2) 用户希望创建定制的应用程序其中混合了IDL代码和ENVI函数;
(3) 用户希望进行大量的ENVI处理而无需人工干预时。
2.4.1 启动二次开发模式
ENVI, /restore_base_save_files ENVI_BATCH_INIT |
如果希望在运行ENVI_BATCH_EXIT时不希望IDL也关闭,那么可以在ENVI的主菜单File > Perference > Miscellaneous选项,并确定Exit IDL on Exit from ENVI选项设置为No。
2.4.2 常用关键字介绍
-
FID
-
R_FID和M_FID
-
DIMS
-
DIMS[0]:用于存储指向一个打开的ROI区域的指针,仅在ROI被定义的时候使用,其它时候设为-1。
-
DIMS[1]:采样的起始位置(一个基于0的IDL数组下标)
-
DIMS[2]:采样的终止位置
-
DIMS[3]:行的起始位置
-
DIMS[4]:行的结束位置
-
POS
2.4.3 常用函数介绍
一、文件管理函数
-
ENVI_PICKFILE
-
ENVI_SELECT
-
ENVI_OPEN_FILE
-
ENVI_FILE_MNG
-
ENVI_GET_FILE_IDS
二、打开文件函数
-
ENVI_OPEN_DATA_FILE
三、获取数据函数
-
ENVI_GET_DATA
-
ENVI_GET_SLICE
四、数据保存函数
-
ENVI_WRITE_ENVI_FILE
-
ENVI_SETUP_HEAD
-
ENVI_OUTPUT_TO_EXTERNAL_FORMAT
2.4.4 二次开发实例
一、调用ENVI实现面向对象特征提取
-
rulebased.pro:实现基于规则的河流提取
-
segmentonly.pro:实现面向对象图像分割
图:ENVI批处理模板
3. ENVI 5.x开发技术
3.1 启动ENVI 5
Result = ENVI([/CURRENT] [, ERROR=variable] [, /HEADLESS] [, LAYOUT=array] [, LOG_FILE=string] [, UVALUE=variable]) |
e = ENVI() ;启动ENVI 5界面 |
或
e = ENVI(/headless) ;headless关键字表示只调用ENVI函数,不打开ENVI界面 |
3.2 ENVI 5 程序控制
ENVI> help, e E ENVI <165828> ENVI> print, e ENVI <165828> LANGUAGE = 'zho' LAYOUT = 1, 1 LOG_FILE = '' ROOT_DIR = 'C:\Program Files\Exelis\envi51\' UI = UVALUE = !NULL VERSION = '5.0.2' WIDGET_ID = 3 |
表:ENVI 5提供的程序控制接口
方法 |
功能介绍 |
ENVI.AddCustomReader |
为File > Open As > Custom添加打开自定义格式数据的过程 |
ENVI.AddExtension |
为Toolbox添加扩展工具,ENVI 5.0 SP2新增可添加菜单功能 |
ENVI.Close |
关闭ENVI |
ENVI.CreateRaster |
创建ENVIRaster对象,栅格文件对象 |
ENVI.CreateRasterMetadata |
创建ENVIRasterMetadata对象,栅格描述数据 |
ENVI.CreateRasterSpatialRef |
创建ENVIRasterSpatialRef对象,即空间参考对象 |
ENVI.CreateView |
创建新的视图(View) |
ENVI.ExportRaster |
输出栅格文件,可另存为DTED、ENVI、NITF、TIFF格式等。 |
ENVI.GetOpenData |
获取已经打开的数据,返回栅格或矢量对象数组。 |
ENVI.GetPreference |
获取ENVI设置参数,如输入输出路径等。 |
ENVI.GetTemporaryFilename |
自动获取一个临时文件名,位于临时目录。 |
ENVI.GetView |
获取当前视图,返回值为ENVIView对象。 |
ENVI.HideExtensionFiles |
启动ENVI时隐藏某个扩展补丁 |
ENVI.LogMessage |
将自定义消息保存到日志文件LOG_FILE内。 |
ENVI.OpenRaster |
打开栅格数据,支持大多数格式。 |
ENVI.OpenVector |
打开矢量数据。 |
ENVI.Refresh |
可以禁用或启用ENVI刷新功能。 |
ENVI.ReportError |
弹出错误提示对话框。 |
ENVI.Show |
使ENVI处于当前激活窗口。 |
3.3 ENVI 5 数据控制
表:ENVI 5提供的数据控制对象与方法一览表
对象或方法 |
功能介绍 |
ENVICoordSys |
对象:可通过ENVIVector的COORD_SYS属性获取此对象。 |
ENVIDataCollection |
对象:获取当前打开的文件Raster对象数组 |
ENVIFIDToRaster |
方法:将ENVI中的文件ID(FID)转换为ENVIRaster对象。 |
ENVIGCPSet |
对象:ENVI的地面控制点对象。 |
ENVIGLTRasterSpatialRef |
对象:空间参考对象,包含了地理查找表(GLT)。 |
ENVIMosaicRaster |
对象:ENVI无缝镶嵌栅格对象。 |
ENVIPseudoRasterSpatialR |
对象:空间参考对象,包含了Pseudo 地理信息 |
ENVIRaster |
对象:ENVI栅格对象,包含一些栅格数据操作方法。 |
ENVIRasterIterator |
对象:ENVI分块处理对象。 |
ENVIRasterMetadata |
对象:ENVI栅格元数据对象。 |
ENVIRasterToFID |
方法:将ENVIRaster转换为FID。 |
ENVIROI |
对象:全新的ENVI感兴趣区域对象。 |
ENVIRPCRasterSpatialRef |
对象:空间参考对象,存储RPC信息。 |
ENVIStandardRasterSpatia |
对象:空间参考对象,包含了标准地理坐标系信息。 |
ENVITime |
对象:ENVI时间对象。 |
ENVIVector |
对象:ENVI矢量数据对象。 |
3.4 ENVI 5 显示控制
表:ENVI 5提供的显示控制对象
对象 |
功能介绍 |
ENVIPortal |
ENVI透视窗口对象。 |
ENVIRasterLayer |
ENVI栅格图层对象,可对图层进行移动等操作。 |
ENVIROILayer |
ENVI感兴趣区域图层。 |
ENVIUI |
ENVI用户界面对象,可弹出文件选择对话框和地图坐标系统界面等。 |
ENVIVectorLayer |
ENVI矢量图层对象,可对图层进行移动等操作。 |
ENVIView |
ENVI视图对象,可对视图进行平移、旋转、缩放等操作。 |
3.5 ENVI 5 图像处理
表:ENVI 5.1版本提供的ENVITask
ENVITask名称 |
功能描述 |
ENVIQUACTask |
对多光谱或高光谱图像执行快速大气校正。 |
ENVIRadiometricCalibrati |
执行辐射定标,可以得到辐射亮度值、表观反射率或亮温。 |
ENVIReprojectGLTTask |
对NPP VIIRS或MODIS数据执行几何校正(需要经纬度信息),同时可以移除蝴蝶结效应(需要Quality Band)。 |
ENVIRPCOrthorectificatio |
执行RPC正射纠正操作。 |
表:ENVIRPCOrthorectificatio
属性名 |
意义 |
DEM_RASTER |
指定DEM栅格对象(ENVIRaster) |
DESCRIPTION (Get) |
描述ENVITask要执行的处理。 |
GEOID_OFFSET (optional) |
如果DEM参考平均海平面,可以指定大地水准面偏移量。 |
GRID_SPACING |
网格间距,默认为10。如果设为1,将执行严格正射纠正(要保证DEM分辨率够高,且研究区地形起伏较大,否则不建议使用)。设置值越大,精度越低,速度越快。 |
IGNORE_VALIDATE |
意义同ENVITask的同名属性。 |
INPUT_RASTER |
输入栅格数据,必须包含RPC信息。 |
INPUT_GCP (optional) |
输入为ENVIGCPSet对象,为正射纠正用到的控制点。 |
DEM_IS_HEIGHT_ABOVE_ELLIPSOID (optional) |
设为1表示DEM已经是椭球体上方的高度。 |
NAME (Get) |
ENVITask的名字。 |
OUTPUT_PIXEL_SIZE (optional) |
输出栅格像元大小。 |
OUTPUT_INTERPOLATION_METHOD (optional) |
重采样方法:0: Nearest Neighbor;1: Bilinear (default); 2: Cubic Convolution。 |
OUTPUT_RASTER (optional) |
输出栅格对象(ENVIRaster),默认为ENVI标准格式。 |
OUTPUT_RASTER_URI (optional) |
输出文件路径。如果不指定,则默认输出到临时文件夹。 |
OUTPUT_SUBSET (optional) |
输出结果时可以进行空间裁剪。 |
PRO Example_RPCOrthorectification ; 启动ENVI5.1 e = ENVI() ; 选择输入文件 ImageFile = DIALOG_PICKFILE(TITLE='Select an input image') Raster = e.OpenRaster(ImageFile) ; 选择DEM文件,这里使用ENVI5.1自带的DEM数据 DEMFile = 'C:\Program Files\Exelis\ENVI51\data\GMTED2010.jp2' DEM = e.OpenRaster(DEMFile) ; 新建RPCOrthorectification ENVITask Task = ENVITask('RPCOrthorectification') ; 设置Task的输入输出参数 Task.INPUT_RASTER = Raster Task.DEM_RASTER = DEM Task.DEM_IS_HEIGHT_ABOVE_ELLIPSOID = 0 Task.OUTPUT_RASTER_URI = e.GetTemporaryFilename() ; 执行Task Task.Execute, Error=error ; 将输出结果添加到Data Manager中 DataColl = e.DATA DataColl.Add, Task.OUTPUT_RASTER ; 显示结果 View1 = e.GetView() Layer1 = View1.CreateLayer(Task.OUTPUT_RASTER) END |
图:RPC正射校正进度条
图:RPC正射校正结果
3.6 ENVI 5 扩展工具
图:新建ENVI扩展
创建sav文件方法有两种:
(1) 在IDL资源管理器中,右键点击TEST_EXTENSION工程文件夹,点击构建工程即可。
(2) 编译pro源码文件,然后使用SAVE命令创建sav文件。
IDL> .compile -v 'D:\IDLWorkspace82\My_Extension\test_extension.pro' % Compiled module: TEST_EXTENSION_EXTENSIONS_INIT. % Compiled module: TEST_EXTENSION. IDL> save, filename = 'D:\TEMP\TEST_EXTENSION.sav', /routines |
图:新增加的菜单和工具
教程下载:http://pan.baidu.com/s/1mgJsaSS
代码下载:http://pan.baidu.com/s/1o69e8FC
视频下载:ENVI Classic —— http://pan.baidu.com/s/1pJM9KiZ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)