转载于 http://blog.sina.com.cn/s/blog_764b1e9d0101ccdu.html
ENVI 5.1二次开发之——无缝镶嵌(ENVIMosaicRaster)
ENVI 5.1提供的二次开发API较5.0有了新的改进。更加突出体现面向对象和类的概念。
本文主要介绍ENVI 5.1新增无缝镶嵌工具提供的API。我们知道,ENVI 5.0及之前版本的镶嵌工具为Georeference Mosaic,提供的接口为Mosaic_DOIT,但是没有公开匀色、羽化等实用的关键字接口,只能进行忽略值的设置。ENVI 5.1更新的无缝镶嵌工具(详见:http://blog.sina.com.cn/s/blog_764b1e9d0101cbf0.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构建金字塔的过程,节省时间和硬盘空间;
Ø 可以将此功能嵌入自己的业务化系统中。