大家所熟悉的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方法打开一个栅格数据。
|
我们通过查看Openraster方法的帮助,可以知道该方法的返回值raster也是一个对象,那对象raster又有自己的属性和方法,例如:利用raster对象的Export方法将数据导出为TIF格式。
|
至此,大家应该理解对象的概念了!
2. 全新的二次开发接口
ENVI5.2提供了功能更加全面的函数接口,根据函数调用方式的不同分为两类:ENVI函数接口调用、ENVI Tasks调用。
2.1ENVI函数接口调用
ENVI5.2提供了更多的程序控制、数据控制以及显示控制相关的函数接口,功能更加全面,例如:使用ENVIMosaicRaster函数对输入栅格做镶嵌,函数调用方法如下:
|
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代码如下所示:
|
执行的结果如下图所示:
图:NND融合前后对比