使用边界清理和众数滤波对区域边缘进行平滑处理

需要 Spatial Analyst 许可。

边界清理众数滤波工具用于沿栅格中的区域边缘进行概化。通过扩展和收缩区域之间的边界,或者使用像元直接邻域内的众数值来替换像元,可以对边缘进行平滑处理。

边界清理

边界清理工具可通过对区域之间的边界进行平滑处理来概化或简化栅格。该工具使用每个像元的直接邻域来应用扩展和收缩方法以评估每个像元。系统提供多个选项用于控制区域的像元对平滑效果的影响。您还可以对平滑程度进行控制。

按优先级排序

该过程首先按特定优先级对输入栅格中的区域进行排序。对于输入中的每个像元,优先级可用于确定周围邻域中可替换处理像元值的区域值。

排序优先级可以基于区域的值或区域大小。排序类型参数可指定要使用的排序优先级。对于默认不排序设置,具有较大值的区域像元将具有较高的优先级,以扩展到具有较小值的区域中。对于降序设置,面积较大的区域将优先扩展到面积较小的区域中。对于升序设置,面积较小的区域将优先扩展到面积较大的区域中。

平滑量

平滑量由执行扩展和收缩过程的次数控制:一次或两次。默认值为两次,由此将导致平滑量更大。

扩展和收缩过程

扩展和收缩过程将根据在排序类型参数中设置的排序优先级类型来评估每个处理像元的直接邻域。

在此过程中,将先扩展再收缩。如果未选中运行两次扩展与收缩参数(在 Python 中,将 number_of_runs 参数设置为 ONE_WAY),则此过程将运行一次。如果选中此参数(在 Python 中,将 number_of_runs 参数设置为 TWO_WAY),则扩展和收缩过程将执行两次。

在该过程中使用的算法的其他详细信息如下所示。

单向扩展和收缩

在使用单向设置时,扩展和收缩过程将执行一次。

在扩展过程中,将会发生以下情况:

  • 对于输入栅格中的每个处理像元,将评估每个相邻像元。
  • 对于每个相邻像元,将评估该相邻像元的优先级值是否小于处理像元的优先级值。如果是这样,则将指定内部相邻像元优先级值作为输入处理像元的优先级值。将使用新的优先级值来更新内部已扩展栅格,然后继续下一个相邻像元。

在收缩过程中,将会发生以下情况:

  • 对于输入栅格中的每个处理像元,将使用在第一个过程中创建的内部扩展栅格的值来评估每个相邻像元。
  • 如果相邻像元的优先级等于处理像元的优先级,则会将原始输入栅格中的像元值复制到输出。如果不满足任何相邻像元的条件,则会将扩展栅格中的像元值复制到输出。

双向扩展和收缩

如果选中运行两次扩展与收缩参数(在 Python 中,将 number_of_runs 参数设置为 TWO_WAY),则会执行第二次扩展和收缩过程,但是,此次的优先级顺序将与第一次的优先级顺序相反。此操作第一个过程中的输出将用作第二个过程的输入。

在第一个扩展过程中,所使用的逻辑与在单向扩展过程中所使用的逻辑相同。

在第一个收缩过程中,所使用的逻辑与在单向收缩过程中所使用的逻辑相同。

在第二个扩展过程中,将会发生以下情况:

  • 对于第一个扩展和收缩过程生成的内部栅格中的每个处理像元,将评估每个相邻像元。
  • 对于每个相邻像元,将评估该相邻像元的优先级值是否大于处理像元的优先级值。如果是这样,则将指定内部相邻像元优先级值作为输入处理像元的优先级值。将使用新的优先级值来更新内部已扩展栅格,然后继续下一个相邻像元。

在第二个收缩过程中,将会发生以下情况:

  • 对于上一步中内部已扩展栅格中的每个处理像元,将评估每个相邻像元。
  • 对于每个相邻像元,如果相邻像元的优先级值小于或大于已扩展栅格中的处理像元值,则会将原始栅格中处理像元的值复制到输出。
  • 如果相邻像元的优先级值等于已扩展栅格中的处理像元值,则会将已扩展栅格中处理像元的值复制到输出。

NoData 处理

如果运行一次扩展和收缩过程,则 NoData 输入像元将具有最低优先级;如果运行两次扩展和收缩过程,则 NoData 输入像元将在第二个过程中具有最低优先级。在双向排序的第二个过程中,NoData 像元将具有最高优先级。

示例

要显示各种参数对输出的影响,请考虑以下输入栅格。

用于“边界清理”的示例输入栅格

将显示用于“边界清理”的示例输入栅格。NoData 像元将为灰色。

对于运行两次扩展与收缩参数(未选中或选中),将显示排序类型参数的所有设置的输出。

排序类型参数为不排序时,输出栅格如下所示:

“不排序”和“单向(未选中)”设置的示例输出
单向(未选中)
“不排序”和“双向(选中)”设置的示例输出
双向(选中)

排序类型参数为降序时,输出栅格如下所示:

“降序”和“单向(未选中)”设置的示例输出
单向(未选中)
“降序”和“双向(选中)”设置的示例输出
双向(选中)

排序类型参数为升序时,输出栅格如下所示:

“升序”和“单向(未选中)”设置的示例输出
单向(未选中)
“升序”和“双向(选中)”设置的示例输出
双向(选中)

众数滤波

众数滤波工具可根据像元邻域内的众数值来替换像元。此工具需要满足两个条件才能发生替换。首先,相同值的邻近像元的数量必须多到可以成为众数值,或者至少一半的像元必须具有相同值(视指定的参数而定)。即,如果指定的是众数参数,则四分之三或八分之五的已连接像元必须具有相同的值;如果指定的是半数参数,则需要四分之二或八分之四的已连接像元具有相同的值。其次,那些像元必须与指定的滤波器的中心相邻(例如,四分之三的像元必须相同)。第二个条件与像元的空间连通性有关,目的是将像元的空间模式的破坏程度降到最低。如果不满足这些条件,将不会进行替换,像元的值也将保持不变。

在下图中,众数滤波应用于输入栅格,使用最近的四个像元(四个正交的相邻像元)作为滤波器,并要求众数(四分之三的像元)值是相同的,才能更改相应像元的值。仅更改那些被三个或三个以上值相同的(正交)像元包围的像元。

众数滤波图示 1
OutRas = MajorityFilter(InRas1)

在下图中,应用了众数滤波工具,使用最近的八个像元作为滤波器,并要求至少一半的值(八分之四的像元)相同,才能更改像元的值。请注意,此时的平滑效果更佳。

众数滤波图示 2
OutRas = MajorityFilter(InRas1, eight, half)

相关主题


在本主题中
  1. 边界清理
  2. 众数滤波