ENVI 5.1二次开发之——无缝镶嵌(ENVIMosaicRaster)

ENVI 5.1提供的二次开发API较5.0有了新的改进。更加突出体现面向对象和类的概念。

本文主要介绍ENVI 5.1新增无缝镶嵌工具提供的API。我们知道,ENVI 5.0及之前版本的镶嵌工具为Georeference Mosaic,提供的接口为Mosaic_DOIT,但是没有公开匀色、羽化等实用的关键字接口,只能进行忽略值的设置。ENVI 5.1更新的无缝镶嵌工具(详见:https://www.cnblogs.com/enviidl/p/16518077.html),提供了对应接口——ENVIMosaicRaster,利用此对象可以完成匀色、羽化、忽略值、接边线生成等功能,轻松实现批处理。下表可以清晰反映新旧镶嵌接口的区别。

表:ENVI新旧镶嵌接口功能对比  

 

旧版接口(MOSAIC_DOIT

新版接口(ENVIMOSAICRASTER

忽略值

匀色

-

羽化

-

接边线

-

易用性

★★★★★

1.      ENVIMosaicRaster介绍

调用格式为:

Result = ENVIMosaicRaster(Scenes [, Properties=value] [, Keywords=value])

下面分Scenes、Properties、keywords、Methods进行介绍。

Scenes

此参数为输入参数,为ENVIRaster对象数组。例如我们想新建Raster1和Raster2的镶嵌对象,可以设置Scenes = [Raster1, Raster2]。注意事项如下:

  •  Scenes中的每一个Raster必须具有相同的波段和数据类型;
  •  Scenes可以在初始化ENVIMosaicRaster时传入,也可以在创建后使用scenes属性赋值;
  •  Seamless Mosaic tool可以接收复数数据类型。如果Complex Function存在,在镶嵌之前,ENVI会转换数据为单精度(浮点型)或双精度类型。如果Complex Function不存在,ENVI使用Power Function转换复数数据。
  •  如果数据含有NaN或Inf时,在计算轮廓线和匀色统计时,自动忽略这些像元。

Properties

ENVIMosaicRaster继承了ENVIRaster的所有属性。而下面的属性是ENVIMosaicRaster独有的。继承的ENVIRaster属性中,Pyramid_exists属性固定为0,Read_only为1。

表:ENVIMosaicRaster独有的属性一览表

属性

功能

注意事项

BACKGROUND (Get, Set)

设置背景值(忽略值)

必须在输入栅格数据类型范围内,如过为Byte,则必须输入0~255之间的值,否则报错。

COLOR_MATCHING_METHOD (Get, Set)

设置匀色算法

可选值如下:

–histogram matching:直方图匹配

– none:默认值,不匀色

COLOR_MATCHING_ACTIONS (Get, Set)

指定参考图像(reference)
和待匹配图像(adjusted)

输入为字符串数组,取值可选adjust、none、reference。只能设置一个reference,其他可设置none或adjust。默认情况下第一个Raster作为reference。

例如:['reference', 'adjust', 'adjust', 'adjust']

COLOR_MATCHING_STATS (Get, Set)

设置直方图统计范围

如果使用匀色,需要设置此关键字为:

–  entire scene:整幅图像

–  overlapping area:默认值,重叠区

注:如果没有重叠区,则统计整图。

FEATHERING_DISTANCE (Get, Set)

设置羽化像元数

可以指定一个数,所以Raster通用;也可以指定一个向量,每一个Raster用不同的羽化距离。

FEATHERING_METHOD (Get, Set)

设置羽化方法

可选值如下:

–  edge:基于边缘羽化

–   none:默认值,不进行羽化

–    seamline:基于接边线羽化

RESAMPLING (Get, Set)

重采样方法

可选如下:

– Nearest Neighbor: 默认值,最近邻域法

– Bilinear: 双线性内插

– Cubic: 三次卷积

SEAM_POLYGONS (Get, Set)

指定接边线

指定为ENVIVector对象,可以使用e.OpenVector打开shp。

SEAMLINE_METHOD (Get, Set)

接边线生成方法

可选如下:

–   geometry:自动生成

–    none:不使用接边线,默认值。

注:属性后面的(Get、Set)表示此属性可以获取,也可以进行设置。凡是属性类型为字符串的,均不区分大小写。

Keywords

关键字中只有一个ERROR,可以进行错误处理,返回错误消息。

Methods

ENVIMosaicRaster继承了ENVIRaster的大部分方法(有些不可用),如下表所示。

表:ENVIMosaicRaster方法一览表

继承ENVIRaster的方法

方法名

功能

Close

关闭对象

CreatePyramid

不可用

CreateTileIterator

分块处理

Export

输出到本地硬盘

GetData

获取数据

Save

不可用

SetData

不可用(ENVIMosaicRaster为只读对象)

SetTile

不可用(ENVIMosaicRaster为只读对象)

Subset

裁剪,取子集。可空间裁剪和光谱裁剪。

WriteMetadata

元数据写出,更新hdr头文件。

ENVIMosaicRaster自有的方法

SaveSeamPolygons

保存自动生成的接边线

下面是一些调用这些方法的注意事项:

  • 因为Mosaic Raster是一个只读的对象,不能使用SetData和SetTile方法写入ENVIMosaicRaster;
  • ENVIDataCollection不会返回ENVIMosaicRaster对象,除非调用了Export方法将镶嵌结果输出到本地硬盘;
  • 调用Subset方法时,使用SUB_SECT关键字可以设置空间子集范围(Spatial Subset);
  • 调用Subset方法时,使用BANDS关键字可以设置光谱子集范围(Spectral Subset)。

2.      ENVIMosaicRaster示例代码

运行后,在弹出对话框选择要镶嵌的数据文件(多选),点击OK,然后选择输出路径,IDL将自动进行无缝镶嵌,实现功能如下:

  •  使用自动生成接边线;
  •  羽化距离为20(接边线两侧各10个像元);
  •  忽略值设置为0;
  •  重采样算法为双线性内插;
  •  保存的接边线为“文件名+_seamline.shp”。

 

PRO MOSAICBATCH

 COMPILE_OPT IDL2

 ; 启动ENVI 5.1

  e = ENVI()

 

 ; 选择多个文件

  files = DIALOG_PICKFILE(/MULTIPLE, $

   TITLE = 'Select input scenes')

  scenes = !NULL

 ; 将每一个Raster放在一个Scenes中

 FOR i=0N_ELEMENTS(files)-1 DO BEGIN

   raster = e.OpenRaster(files[i])

   scenes = [scenes, raster]

 ENDFOR

 

 ; 创建ENVIMosaicRaster对象

 mosaicRaster = ENVIMosaicRaster(scenes,          $

   background = 0                                    $

   color_matching_method = 'histogram matching', $

   color_matching_stats = 'overlapping area',     $

   feathering_distance = 20                        $

   feathering_method = 'seamline',                    $

   resampling = 'bilinear',                         $

   seamline_method = 'geometry')

 

 ; 设置输出路径

  newFile = ENVI_PICKFILE(title='Select output file', $

   /output)

 IF FILE_TEST(newFile) THEN FILE_DELETE, newFile

 ; 输出镶嵌结果

 mosaicRaster.Export, newFile, 'ENVI'

 

 ; 保存接边线

 mosaicRaster.SAVESEAMPOLYGONS, newFile+'_seamline.shp'

  vector = e.OpenVector(newFile+'_seamline.shp')

 

 ; 打开并显示栅格和接边线

 mosaicRaster = e.OpenRaster(newFile)

  view = e.GetView()

  layer = view.createlayer(mosaicRaster)

  vlayer = view.createlayer(vector)

 

END

 

3.      总结

使用此方法可以快速、便捷地使用无缝镶嵌功能,具有以下优势:

Ø 轻松实现自动化批处理,设置好参数后,只需选择输入输出即可;

Ø 如果数据量较大,省去了ENVI构建金字塔的过程,节省时间和硬盘空间;

Ø 可以将此功能嵌入自己的业务化系统中。

posted @   ENVI-IDL技术殿堂  阅读(807)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示