首页 > 其他分享 >ENVI 5.2二次开发更加智能、全面(续)

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

时间:2022-09-05 13:56:59浏览次数:75  
标签:5.2 Task 面向对象 对象 栅格 ENVI 二次开发

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

       在ENVI 5.1版本中,ENVI Task这种全新的开发接口已初见端倪,虽然当时只有4个而已,可以浏览之前的博客了解一下(http://blog.sina.com.cn/s/blog_764b1e9d0101cgli.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米

标签:5.2,Task,面向对象,对象,栅格,ENVI,二次开发
From: https://www.cnblogs.com/enviidl/p/16657858.html

相关文章

  • ENVI 5.0 SP2 全新的二次开发模式
    在ENVI5.0发布时,便加入了许多全新的二次开发接口。ENVI5.0SP2的发布,同样带来了新的功能函数接口。下面对ENVI5.0版本中新增的二次开发技术进行一个总结。启动ENVIIDL......
  • Revit2018二次开发——外部工具不显示
     安装包下找到D:\aaa\Revit_2018_G1_Win_64bit_dlm\Utilities\SDK\SoftwareDevelopmentKit中的RevitSDK.exe也可以直接通过安装解压这个东西。  找到一个addin文件......
  • IDL界面程序直接调用envi菜单对应功能的实现方法
    ENVI软件具备强大的二次开发功能,提供了绝大多数功能的函数调用接口。但二次开发的时候需要自己编写处理和操作界面,很多时候这也是个头疼的问题。如果希望在自己的程序界面......
  • C/C++下读取ENVI栅格文件格式
     ENVI使用的是通用栅格数据格式,包含一个简单的二进制文件(asimpleflatbinary)和一个相关的ASCII(文本)的头文件。   利用其他语言如C/C++等直接读取ENVI的数据,则可以......
  • ENVI二次开发综述与代码分享
    ENVI二次开发综述与代码分享 ENVI具备了丰富的二次开发功能函数接口,基本涵盖了ENVI下所有的功能,且通过IDL语言有输出助手(导出为COM或JAVA类)、Callable、IDLDrawWidget和......
  • ENVI5.5.3/IDL8.7.3新特性介绍
    ENVI5.5.3/IDL8.7.3于2020年2月正式发布。在ENVI5.5.3版本中,改进了一些更人性化的工具和设置,如主界面右下角显示文件的基本信息、可以更改窗口背景颜色等;帮助我们在ENVI中......
  • ENVI自动配准流程化工具的另类用法
    这里说的另类用法是指:只想利用自己手动添加的同名点用于图像配准,而不希望工具自动找点。这种需求一般用于无法自动找点的情况,比如卫星图像与DRG之类的线划图进行配准时。......
  • ENVI中高分六号WFV数据大气校正方法
    高分六号于2019年3月21日正式投入使用,它是一颗低轨光学遥感卫星,具有高分辨率、宽覆盖、高质量和高效成像等特点,配置2米全色/8米多光谱高分辨率相机(PMS)、16米多光谱中分辨率......
  • ENVI5.5.2/IDL8.7.2新特性
    2019年2月,ENVI5.5.2、IDL8.7.2 新版本发布。ENVI5.5.2主要新功能如下:新增波段扩展工具新增波谱库维数扩展工具新增开源遥感数据下载工具改进ReprojectRaster、Laye......
  • Vite Build Development Environment
    Normally,vitebuildbydefaultisbuildingtheproductionenvironmentonly,butwestillcanmakeitbuilddevelopmentenvironmentbyadding--modedevelopme......