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 = [-1L, 0, raster.NCOLUMNS-1, 0, 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米

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