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) |
输入为字符串数组,取值可选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=0, N_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构建金字塔的过程,节省时间和硬盘空间;
Ø 可以将此功能嵌入自己的业务化系统中。

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