ENVI 5.2二次开发更加智能、全面
大家所熟悉的ENVI二次开发方式是调用*_doit函数,这种传统的开发方式在函数调用时参数设置复杂,开发不够智能。从ENVI 5.0版本开始,便加入了许多全新的二次开发函数接口,这些全新的函数接口采用面向对象的开发方式,使得ENVI二次开发变得更加轻松、智能。
最新发布的ENVI5.2版本在保留传统的ENVI二次开发方式(*_DOIT)的基础上,新增了更多全新的函数接口及58个即拿即用的图像处理任务(ENVI Task),使得ENVI二次开发功能更加全面。详细介绍请参考ENVI Help->Programming->Routines及Programming Guide(二次开发手册)。
1. 智能的二次开发方式
面向对象(Object-Oriented,简称OO)开发方式主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物。全新的ENVI 二次开发方式不需要用户拥有强大的面向对象技能,只需理解对象概念即可。对象是一个程序的基石,但对象具体是什么呢?这里举个例子:当你第一眼看到下图的藏獒时,你看到了它的毛色为黄色,鼻子大,眼睛小等特性,如果你拿棍子打它,它会立马起来咬你,这是它的行为。因此,我们说这里的藏獒就是一个对象,每个对象都有它的属性(特性)和方法(行为)。
理解了对象的概念,ENVI5.2二次开发方式将变的非常简单、智能。

图:藏獒->对象
ENVI新的二次开发中,通过e=ENVI()方式启动ENVI,这里返回的e就是一个对象,将e的信息打印出来:
ENVI> print,e
ENVI <274465>
DATA =
LANGUAGE = 'eng'
LAYOUT = 1, 1
LOG_FILE = ''
PREFERENCES =
ROOT_DIR = 'C:\Program Files\Exelis\envi52\'
UI =
UVALUE = !NULL
VERSION = '5.2'
WIDGET_ID = 897
可以看到e中包含了许多信息,包括语言(Language)、视图布局(layout)、日志文件(log_fid)、安装目录(root_dir)、UI对象、UVALUE、版本(Version)和Widget_ID,这些都是e这个对象的属性。
我们说每个对象除了属性之外还有方法,例如:通过e对象的Openraster方法打开一个栅格数据。
|
ENVI> file = FILEPATH('qb_boulder_msi', ROOT_DIR=e.ROOT_DIR, $ > SUBDIRECTORY = ['data']) ENVI> print,file C:\Program Files\Exelis\envi52\data\qb_boulder_msi ENVI> raster = e.OpenRaster(file) |
我们通过查看Openraster方法的帮助,可以知道该方法的返回值raster也是一个对象,那对象raster又有自己的属性和方法,例如:利用raster对象的Export方法将数据导出为TIF格式。
|
ENVI> help,raster RASTER ENVIRASTER <282395> ENVI> raster.Export, 'D:\temp\qb_boulder_msi', 'TIFF' |
至此,大家应该理解对象的概念了!
2. 全新的二次开发接口
ENVI5.2提供了功能更加全面的函数接口,根据函数调用方式的不同分为两类:ENVI函数接口调用、ENVI Tasks调用。
2.1ENVI函数接口调用
ENVI5.2提供了更多的程序控制、数据控制以及显示控制相关的函数接口,功能更加全面,例如:使用ENVIMosaicRaster函数对输入栅格做镶嵌,函数调用方法如下:
|
PRO MOSAICBATCH_SEAMPOLYGONS COMPILE_OPT IDL2 ; 启动ENVI e = ENVI()
; 选择镶嵌文件 files = DIALOG_PICKFILE(/MULTIPLE, TITLE = 'Select input scenes') scenes = !NULL FOR i=0, N_ELEMENTS(files)-1 DO BEGIN raster = e.OpenRaster(files[i]) scenes = [scenes, raster] ENDFOR
; 调用ENVIMosaicRaster函数执行镶嵌功能 mosaicRaster = ENVIMosaicRaster(scenes, SEAMLINE_METHOD='Geometry')
;保存镶嵌结果为ENVI格式 newFile = e.GetTemporaryFilename() mosaicRaster.Export, newFile, 'ENVI'
;保存接边线为shapefile文件 mosaicRaster.SaveSeamPolygons, 'C:\MyData\SeamPolygons.shp'
; 关闭ENVI e.Close END |
ENVI5.2包含的程序控制、数据控制以及显示控制相关的函数接口总结如下,
|
方法 |
功能介绍 |
|
ENVI.AddCustomReader |
为File > Open As > Custom添加打开自定义格式数据的过程。 |
|
ENVI.AddExtension |
为Toolbox添加扩展工具,可添加菜单功能。 |
|
ENVI.Close |
关闭ENVI。 |
|
ENVI.CreateView |
创建新的视图(View) |
|
ENVI.GetTemporaryFilename |
自动获取一个临时文件名,位于临时目录。 |
|
ENVI.GetView |
获取当前视图,返回值为ENVIView对象。 |
|
ENVI.HideExtensionFiles |
启动ENVI时隐藏某个扩展补丁。 |
|
ENVI.LogMessage |
将自定义消息保存到日志文件LOG_FILE内。 |
|
ENVI.OpenRaster |
打开栅格数据,支持大多数格式。 |
|
ENVI.OpenROI |
打开ENVI的ROI文件。 |
|
ENVI.OpenVector |
打开矢量数据。 |
|
ENVI.Refresh |
可以禁用或启用ENVI刷新功能。 |
|
ENVI.ReportError |
弹出错误提示对话框。 |
|
ENVI.Show |
使ENVI处于当前激活窗口。 |
|
ENVIPreferences |
管理ENVI Preferences设置 |
|
ENVIPreferenceItem |
设置ENVI Preferences设置项 |
数据控制中包含的函数如下表所示:
|
对象或方法 |
功能介绍 |
|
ENVICoordSys |
对象:可通过ENVIVector的COORD_SYS属性获取此对象。 |
|
ENVIDataCollection |
对象:获取当前打开的文件Raster对象数组 |
|
ENVIEqualizationStretchRaster |
对象:均衡化拉伸栅格数据 |
|
ENVIFIDToRaster |
方法:将ENVI中的文件ID(FID)转换为ENVIRaster对象。 |
|
ENVIGaussianStretchRaster |
对象:高斯拉伸栅格数据 |
|
ENVIGCPSet |
对象:ENVI的地面控制点对象。 |
|
ENVIGLTRasterSpatialRef |
对象:空间参考对象,包含了地理查找表(GLT)。 |
|
ENVIGridDefinition |
对象:定义参考网格 |
|
ENVILinearPercentStretchRaster |
对象:线性百分比拉伸栅格数据 |
|
ENVILinearRangeStretchRaster |
对象:线性范围拉伸栅格数据 |
|
ENVILogStretchRaster |
对象:对数拉伸栅格数据 |
|
ENVIMetaspectralRaster |
对象:ENVI元文件生成对象 |
|
ENVIMosaicRaster |
对象:ENVI无缝镶嵌栅格对象。 |
|
ENVINNDiffusePanSharpeningRaster |
对象:基于NND算法的融合 |
|
ENVIOptimizedLinearStretchRaster |
对象:优化线性拉伸栅格数据 |
|
ENVIPseudoRasterSpatialRef |
对象:空间参考对象,包含了Pseudo 地理信息。 |
|
ENVIRaster |
对象:ENVI栅格对象,包含一些栅格数据操作方法。 |
|
ENVIRasterIterator |
对象:ENVI分块处理对象。 |
|
ENVIRasterMetadata |
对象:ENVI栅格元数据对象。 |
|
ENVIRasterSeries |
对象:生成栅格时间序列文件 |
|
ENVIRasterStatistics |
对象:栅格统计对象 |
|
ENVIRasterToFID |
方法:将ENVIRaster转换为FID。 |
|
ENVIResampleRaster |
对象:栅格重采样 |
|
ENVIROI |
对象:全新的ENVI感兴趣区域对象。 |
|
ENVIRootStretchRaster |
对象:栅格根拉伸,例如:平方根,3次方根 |
|
ENVIRPCRasterSpatialRef |
对象:空间参考对象,存储RPC信息。 |
|
ENVISpatialGridRaster |
对象:重投影及重采样栅格 |
|
ENVISpectralIndexRaster |
对象:光谱指数计算 |
|
ENVIStandardRasterSpatialRef |
对象:空间参考对象,包含了标准地理坐标系信息。 |
|
ENVISubsetRaster |
对象:栅格裁剪对象 |
|
ENVITime |
对象:ENVI时间对象。 |
|
ENVIVector |
对象:ENVI矢量数据对象。 |
显示控制包含的函数如下表所示:
|
对象 |
功能介绍 |
|
ENVIPortal |
ENVI透视窗口对象。 |
|
ENVIRasterLayer |
ENVI栅格图层对象,可对图层进行移动等操作。 |
|
ENVIRasterSeriesLayer |
栅格时间序列文件生成对象 |
|
ENVIROILayer |
ENVI感兴趣区域图层。 |
|
ENVIUI |
ENVI用户界面对象,可弹出文件选择对话框和地图坐标系统界面等。 |
|
ENVIVectorLayer |
ENVI矢量图层对象,可对图层进行移动等操作。 |
|
ENVIView |
ENVI视图对象,可对视图进行平移、旋转、缩放等操作。 |
2.2ENVI Task调用
ENVI5.2新增了58个即拿即用的图像处理任务,几乎包括了所有基本的ENVI图像处理,用户可以利用ENVITask和ENVITaskParameter两个函数调用任何一个任务,可以说ENVI Task调用是一种特殊的函数接口调用。这里我们对58种任务做了总结和说明如下表所示:
|
Tasks |
功能描述 |
|
AutoChangeThresholdClassification |
基于自动阈值法的图像变化监测 |
|
BuildBandStack |
波段合成 |
|
BuildRasterSeries |
|
|
BuildTimeSeries |
根据采集时间排序后,构建用于时空分析的栅格系列文件 |
|
ChangeThresholdClassification |
基于手动阈值法的图像变化监测 |
|
ClassificationAggregation |
分类结果聚合,清除碎斑 |
|
ClassificationSmoothing |
分类结果平滑,清除斑点噪声 |
|
ClassificationToShapefile |
导出分类结果中的一类或多类为Shapefile格式 |
|
ColorSliceClassification |
通过阈值进行栅格数据的分类并着色,默认类别:16类、颜色表为:Rainbow |
|
DarkSubtractionCorrection |
简化黑暗像元法大气校正 |
|
DimensionsResampleRaster |
重采样 |
|
EqualizationStretchRaster |
直方图均衡化拉伸 |
|
FXSegmentation |
面向对象分割 |
|
ForwardICATransform |
独立主成分分析 |
|
ForwardMNFTransform |
最小噪声分离 |
|
ForwardPCATransform |
主成分分析 |
|
GaussianStretchRaster |
高斯拉伸 |
|
GramSchmidtPanSharpening |
GS融合方法 |
|
ISODATAClassification |
ISODATA非监督分类法 |
|
ImageBandDifference |
波段差值分析 |
|
ImageIntersection |
计算两个图像交集 |
|
ImageThresholdToROI |
阈值法定义ROI |
|
LinearPercentStretchRaster |
百分比线性拉伸 |
|
LinearRangeStretchRaster |
基于像素值范围的线性拉伸 |
|
LogStretchRaster |
对数拉伸 |
|
MahalanobisDistanceClassification |
马氏距离监督分类法 |
|
MappingResampleRaster |
行列映射法重采样 |
|
MaximumLikelihoodClassification |
最大似然监督分类法 |
|
MinimumDistanceClassification |
最小距离监督分类法 |
|
NNDiffusePanSharpening |
NNDiffuse图像融合 |
|
OptimizedLinearStretchRaster |
优化线性拉伸 |
|
PCPanSharpening |
PCA图像融合 |
|
PercentThresholdClassification |
基于阈值法的异常区域和非异常区域提取 |
|
PixelScaleResampleRaster |
分辨率成倍采样法 |
|
QUAC |
快速大气校正 |
|
QuerySpectralIndices |
基于影像中心波长信息获取光谱指数数组 |
|
ROIToClassification |
ROI转换为分类文件 |
|
RPCOrthorectification |
正射校正 |
|
RXAnomalyDetection |
基于RX的异常检测 |
|
RadiometricCalibration |
辐射定标 |
|
RadiometricNormalization |
辐射归一化 |
|
RasterStatistics |
栅格统计 |
|
RasterViewshed |
视域分析 |
|
RegridRaster |
影像栅格化 |
|
RegridRasterSeriesByIndex |
基于索引的批量影像栅格化 |
|
RegridRasterSeriesByIntersection |
基于交集的批量影像栅格化 |
|
RegridRasterSeriesByUnion |
基于并集的批量影像栅格化 |
|
ReprojectGLT |
基于GLT转换投影坐标 |
|
RootStretchRaster |
指定范围拉伸 |
|
SpectralAngleMapperClassification |
光谱角监督分类法 |
|
SpectralIndex |
光谱指数计算 |
|
SpectralIndices |
批量光谱指数计算 |
|
ThematicChange |
分类后变化监测 |
|
TrainingClassificationStatistics |
分类后统计 |
|
VectorAttributeToROIs |
基于矢量中的属性创建ROI |
|
VectorRecordsToROI |
基于矢量创建ROI |
|
VegetationSuppression |
植被抑制 |
|
VideoToRasterSeries |
视频转栅格 |
以ENVI5.2新增的NNDiffuse融合方法为例,介绍如何调用ENVI Task,其他Task调用方法类似,IDL代码如下所示:
|
PRO ENVIRPCOrthorectificationTask_Example COMPILE_OPT idl2 ; 启动ENVI e = ENVI()
; 打开高分辨率影像和低分辨率影像 highResFile = Filepath('qb_boulder_pan', Subdir=['data'], $ Root_Dir=e.ROOT_DIR) highResRaster = e.OPENRASTER(highResFile) lowResFile = Filepath('qb_boulder_msi', Subdir=['data'], $ Root_Dir=e.ROOT_DIR) lowResRaster = e.OPENRASTER(lowResFile)
; 初始化NNDiffuse任务 Task = ENVITask('NNDiffusePanSharpening')
; 定义参数 Task.INPUT_LOW_RESOLUTION_RASTER = lowResRaster Task.INPUT_HIGH_RESOLUTION_RASTER = highResRaster Task.OUTPUT_RASTER_URI = e.GETTEMPORARYFILENAME() ; 输出结果路径
; 执行任务 Task.EXECUTE
; 将输出结果添加到Data Manager中 DataColl = e.DATA DataColl.ADD, Task.OUTPUT_RASTER
; 显示输出结果 View1 = e.GETVIEW() Layer1 = View1.CREATELAYER(Task.OUTPUT_RASTER) END |
执行的结果如下图所示:

图:NND融合前后对比

本文来自地理遥感生态网平台www.gisrs.cn,作者:地理遥感生态网平台,转载请注明原文链接:https://www.cnblogs.com/gisrs365/articles/18190215
浙公网安备 33010602011771号