为 ENVITask 创建 ENVIRaster 子集
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/subsetting-envirasters-for-envitask
8550 评价本文:
暂无评价
为 ENVITask 创建 ENVIRaster 子集
匿名 2014年8月1日,星期五
几个月前,我写过关于 ENVITask 的文章,这是 ENVI 5.1 中用于分析的新 API。任何查看过此 API 的人都会注意到,任务对象不像 ENVI_DOIT 那样包含用于空间或光谱子集提取的参数(例如 POS 和 DIMS)。为每个任务添加这些参数会导致不必要的内部复杂性,并且由于我们的“栅格就是栅格”理念,这并非必需。如果您只想在栅格的一个子集上运行任务,则需要您在调用任务之前自行执行子集提取。这可以通过 ENVIRaster::Subset() 方法来实现,该方法会返回一个新的 ENVIRaster 对象,仅提供对该子集的访问。
正如文档所述,可以执行三种形式的子集提取:
- 使用 SUB_RECT 进行空间子集提取
- 使用 BANDS 进行光谱子集提取
- 使用 ROI 进行像素掩膜
您可以同时使用这些关键字中的任何一个或全部,但如果您同时指定了 SUB_RECT 和 ROI,则会先执行空间子集提取,然后再进行 ROI 掩膜处理。
空间子集提取使用 SUB_RECT 关键字执行,它以一个数组形式表示像素坐标:[左列,顶行,右列,底行]。如果您指定了负值或过大的值,这些值将被限制在栅格范围内。
光谱子集提取使用 BANDS 关键字执行,它可以是一个标量波段索引,也可以是一个波段索引数组。这些索引是从 0 开始计数的,不能重复,但其顺序很重要,可用于波段重排序。因此,设置 BANDS=[0,1,2] 与 BANDS=[2,1,0] 将产生不同的输出栅格。超出范围的波段索引将引发错误。
使用 ENVIROI 进行像素掩膜是通过 ROI 关键字执行的,该关键字设置为 ENVIROI 对象引用。这不会改变栅格的空间或光谱范围,但会屏蔽掉 ROI 区域外的所有像素。如果您正在编写自己的扩展或处理脚本,则在调用 ENVIRaster::GetData() 或 ENVIRasterIterator::GetData() 时必须使用 PIXELSTATE 关键字。正如这两种方法的文档所解释的,此关键字将被设置为一个与数据维度相同的字节数组,它使用位掩码来告诉您每个像素是否有效以及无效的原因。在大多数情况下,唯一需要关注的是 PIXELSTATE 值是 0 还是非 0,其中 0 表示有效,任何非零值表示无效。
下面是一个示例,它加载一个 Quickbird 镶嵌影像,切出一个仅包含可见光波段的小空间子集并将其校准为辐射亮度图像,然后将生成的输出加载到栅格图层中,以便与原始栅格进行比较:
; 加载栅格 nv = ENVI() inputFile = Dialog_Pickfile(TITLE='选择要校准的文件') oRaster = nv.OpenRaster(inputFile)
; 在视图中显示栅格 oView = nv.GetView() oLayer1 = oView.CreateLayer(oRaster)
; 为任务处理提取栅格子集 subRect = [700, 900, 1000, 1300] bands = [0, 1, 2] oInput = oRaster.Subset(SUB_RECT=subRect, BANDS=bands)
; 加载 enviTask oTask = enviTask('RadiometricCalibration')
; 设置参数 oTask.INPUT_RASTER = oInput oTask.CALIBRATION_TYPE = 0 ; 辐射亮度 oTask.OUTPUT_DATA_TYPE = 4 ; 浮点型
; 运行任务 oTask.Execute
; 显示结果 oLayer2 = oView.CreateLayer(oTask.Output_Raster)
此代码的运行结果截图如下:
