大家所熟悉的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二次开发方式将变的非常简单、智能。

elemnt ui二次开发 enovia二次开发_二次开发


图:藏獒->对象

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

执行的结果如下图所示:

elemnt ui二次开发 enovia二次开发_栅格数据_02

图:NND融合前后对比