为影像数据去除无效值

2
分享 2016-03-01
在使用栅格数据时,黑边和白边问题比较困扰我们,╮(╯-╰)╭ ,丑丑地如下所示:

那如何处理这些问题呢?方法不是唯一的,我把 ArcMap 中最常用的几种方式列举一下,帮你给数据“化妆”,或者更确切的说是“整容”:


Option 1 栅格计算器
在去黑边之前最先需要了解的是黑边的像元值是什么? 可以使用 Identify 工具
查查看。 例如这份数据是 0。

这时,你也许会想到设置图层背景值的色彩可以吧?


如果仅为了显示使用,是可以解决问题的,但传统意义上的去黑边,我们一般理解成栅格数据的处理,也就是从存储上修改特定值(本例中是 0)值为 Nodata。



单波段数据处理起来常常相对容易些,最常用的工具就是 栅格计算器/Raster Calculator 了。Raster Calculator 可以通过输入的Python语法的表达式,对当前数据框内的栅格图层进运算。它是个非常实用的栅格数据处理工具,如果你想 Dive In ,点 这里了解 Raster Calculator 的工作原理。 
例如这个需求中仅需要一个简单表达式,使用到SetNull函数,如下所示:

其中,表达式是 SetNull(“RasterLayer” == 0 , “RasterLayer” )



这样执行工具之后,所有的 0 值变成了 Nodata,彻底去了黑边。


Option 2 影像分析窗口
多波段数据同样会受到黑边的困扰,而且现实情况往往没有单波段数据那么理想,仅通过一个表达式就可以搞定。例如,我们常用的影像底图数据,通常有三个波段,通过包含RGB三个波段的一组值来表示像元值,例如 (0,255,129)。我一般会根据需要处理的数据量的多少给出不同的处理方法建议:
同样第一步需要确认黑边值是什么?本例中是 (0,0,0)


ArcMap的 Windows 菜单中有 Image Analysis 。在 Image Analysis 窗口中的 Processing 部分可以对当前数据框中的图层赋予函数或函数链,从而对栅格数据实时处理。

在弹出的窗口中,在 fx行右键插入函数,例如这个需求中会使用到 Mask Function。

设置 Mask Function,(0,0,0) 组合是无效值。为什么选择 All 而不是 Any? 这个答案很显见,同时都为0的像元值才是无效值,否则不是,例如(1,255,0)是有效的。或者说各个波段的0值是and关系,而不是or。

这样带有函数的新栅格图层会自动加入 ArcMap 的 TOC,看起来万事大吉,然而这里需要说明下,这个图层需要Export到硬盘上的某个位置,它目前还是个临时数据,当layer被移除掉,这个结果就不复存在。

所以,最后重要的一步,导出数据。


( ̄ˇ ̄) 这种方法,还适用于具有多种无效值的情况。例如,除了(0,0,0) 还包含 (255,255,255) :

我们需要做的仅是继续增加栅格函数。在 Function Template Editor 中函数们顺序相接,像个环环相接的链条,所以称为 ”函数链/ Function Chain“,咦,好像跑题了。请继续看如何设置无效值:

这样就实现了去掉两组无效值。


Option 3 镶嵌数据集
那么摆在你面前的数据不是一个,而是“很多”呢?凡事保证质量之后,重复工作多了之后就同时需要保证效率,那么这种方法适用于“很多”、“大量”……
ArcGIS 的镶嵌数据集是个理想与实用兼备的影像数据管理模型,我们用它来“处理”大量栅格数据也是个不错的选择。
在地理数据库中创建镶嵌数据集,并将数据添加到镶嵌数据集中,之后:

在”之后“之前的预备动作,此文中不赘述,但是你可以看这篇了解这些内容。





在镶嵌数据集中可以使用工具 Define Mosaic Dataset Nodata 工具,对数据的无效值进行定义。

从而批量去除了无效值。
镶嵌数据集本身也支持栅格函数,类似影像数据窗口中函数模板的设置,同样可以设置函数链来实现一些复杂的要求。

有关镶嵌数据集函数,也可以参考这篇。

常见的操作一般就这几种,总结下,单波段优先考虑栅格计算器;多波段可以使用影像分析窗口;如果数据量较大,建议使用镶嵌数据集。
ArcGIS Desktop 虽然不是专业做影像数据处理的平台,但是拥有的这些功能能很大程度上解决影像处理的常见问题。写这一篇是因为不少用户遇到类似问题,集中总结下比较有意义,希望给大家一些思路,下次遇到此类的问题时,自己动手试试吧。
 

文章来源:http://kikitamap.com/2016/02/02/RasterNodata/
 

4 个评论

能讲下多波段导出的数据要如何设置吗?导出后仍然是有黑边的,原黑边数据都是0。请指点,谢谢!
应该是位深的问题。这需要看下你的数据位深是多少,假设是8bit的,0-255的值域内都有对应的像元值,那么nodata需要额外的像元值存储,涉及到进位的问题。也就是如果想真正清除黑边,需要将数据变为16bit。
你好!能讲下:1、8bit的,0-255的值域内都有对应的像元值是多少呢?若16BIT呢?
8BIT如何进位为16BIT呢?谢谢!
0-255就是像元值啊,也就是2的8次方。那16bit就是2的16次方,0-65535。 ArcGIS 中大多数可以输出栅格的工具,环境变量中都可以设置位深这个参数。

要回复文章请先登录注册