ENVI 5.2二次开发更加智能、全面(续)

   在上一篇博文中(https://www.cnblogs.com/enviidl/p/16657613.html)介绍了ENVI 5.2全新的面向对象开发模式。本文来个续,在图像处理ENVI Task的基础上,进一步介绍ENVI提供的虚拟栅格对象。

       在ENVI 5.1版本中,ENVI Task这种全新的开发接口已初见端倪,虽然当时只有4个而已,可以浏览之前的博客了解一下(https://www.cnblogs.com/enviidl/p/16657843.html)。

       在ENVI 5.2版本中,ENVI Task接口数量暴增到58个,增加了常用的图像处理功能,例如重采样、变化检测、图像分类、拉伸增强、图像融合等,详细列表如下图所示。

图:ENVI 5.2中提供的ENVITasks

       下面我们找典型功能和需求进行体验。

面向对象图像分割

       在之前的ENVI接口中,是以过程(ENVI_FX_SEGMENTONLY_DOIT)的形式提供此功能,此种接口调用时,存在如下缺点:格式较为复杂、关键字和参数较多、学习成本较高。而全新的ENVI Tasks是面向对象的开发模式,对于新人来说更容易上手。

       下面以ENVI自带QB数据为例,展示如何利用代码实现面向对象分割操作。

PRO test_FXSegmentation

COMPILE_OPT idl2

; 启动 ENVI 5.2

e = ENVI()

; 打开遥感图像

File = FILEPATH('qb_boulder_msi', Subdir=['data'], $

Root_Dir=e.ROOT_DIR)

Raster = e.OpenRaster(File)

; 初始化 FXSegmentation Task

Task = ENVITASK('FXSegmentation')

; 设置输入参数:输入图像、分割尺度、合并尺度

Task.INPUT_RASTER = Raster

Task.SEGMENT_VALUE = 50.0

Task.MERGE_VALUE = 90.0

; 设置输出栅格路径(位于ENVI临时目录下)

Task.OUTPUT _MEANS_RASTER_URI = e.GetTemporaryFilename()

; 执行面向对象分割

Task.Execute

; 将分割结果添加到 Data Manager 中

DataColl = e.DATA

DataColl.Add, Task.OUTPUT _MEANS_RASTER

; 在ENVI中显示分割结果

View1 = e.GetView()

Layer1 = View1.CreateLayer(Task.OUTPUT _MEANS_RASTER)

END

 

图:FXSegmentation进度条

       下面我们来对比 DOIT 接口的调用方法:

PRO EXAMPLE_FX_SEGMENTONLY_DOIT

COMPILE_OPT IDL2

;启动ENVI

e = ENVI()

;打开遥感图像

File = FILEPATH('qb_boulder_msi', Subdir=['data'], $

Root_Dir=e.ROOT_DIR)

Raster = e.OpenRaster(File)

fid = ENVIRasterToFID(Raster)

; 设置输入输出参数

SegImage = e.GetTemporaryFilename()

dims = [-1L0, raster.NCOLUMNS-10, raster.NROWS-1]

pos = LINDGEN(raster.NBANDS)

; 执行面向对象分割

ENVI_DOIT, 'envi_fx_segmentonly_doit', $

fid=fid, pos=pos, dims=dims, $

r_fid=r_fid, $

merge_level=90.0, scale_level=50.0, $

segmentation_raster_filename=SegImage

; 在ENVI中加载显示分割结果

oSegImage = e.OpenRaster(SegImage)

view1 = e.GetView()

layer1 = view1.CreateLayer(oSegImage)

END

 

       通过上面两种调用方式的对比,我们发现:在之前的DOIT接口中,需要设置的参数较多(例如POS、DIMS),写法不规整且易读性较差;而ENVI Task的代码更加简洁、易读、规整和灵活。

虚拟栅格对象

       ENVI 5.2除了提供58个用于图像处理的ENVI Task之外,还提供了另外一种栅格对象——虚拟栅格对象。一般情况下,我们在进行遥感图像处理时都需要很多步骤,而中间步骤的结果不需要保留在最终成果中,此时虚拟栅格对象的优势就表现的淋漓尽致。

       这里我们以一个实际应用场景来介绍虚拟栅格对象的好处。我们有三个步骤需要处理,具体说明如下:

  • 输入数据为两景TM多光谱影像,空间分辨率均为30米;
  • 输出要求进行3个处理步骤:
  • 经过匀色的镶嵌结果
  • 将空间分辨率重采样为90米
  • 只保留R、G、B三个波段

       在下面的代码中,使用了ENVIMosaicRaster、ENVIResamleRaster、ENVISubsetRaster三种虚拟栅格对象,只需一步输出,即可满足3个处理需求。

       注:详细介绍参考ENVI帮助Programming > Routines > Data Control Routines,除了本例中的3个虚拟栅格对象,还有一些其他功能的栅格对象,比如ENVISpatialGridRaster、ENVINNDiffusePanSharpeningRaster、ENVISpectralIndexRaster等。

PRO test_VirtualRaster

COMPILE_OPT idl2

;启动ENVI

e=ENVI()

;设置输入文件

input1='D:\temp\mosaic_1.img'

input2='D:\temp\mosaic_2.img'

;打开输入文件

Raster1=e.OpenRaster(input1, data_ignore_value=0)

Raster2=e.OpenRaster(input2, data_ignore_value=0)

;查看输入文件的空间分辨率为

Ref1=Raster1.SPATIALREF

PRINT, Ref1.PIXEL_SIZE

;创建 ENVIRaster 对象数组

Scenes=[Raster1,Raster2]

;创建 ENVIMosaicRaster 对象

MRaster=ENVIMOSAICRASTER(Scenes)

;设置匀色算法

MRaster.COLOR_MATCHING_METHOD = 'histogram matching'

;对 ENVIMosaicRaster 对象进行重采样

ResampleRaster=ENVIResampleRaster(MRaster,PIXEL_SCALE=3.0)

;对 ResampleRaster 对象进行波段裁剪,只保留3个波段

RGBRaster=ENVISubsetRaster(ResampleRaster,Bands=[0,1,2])

;输出最终镶嵌结果

RGBRaster.Export, 'D:\temp\result.dat', 'envi'

END

图:查看结果空间分辨率为90米

posted @ 2022-09-05 13:47  ENVI-IDL技术殿堂  阅读(528)  评论(0编辑  收藏  举报