首页 > 解决方案 > 腐蚀数组的几层

问题描述

我无法理解 scipy 的binary_erosion功能。

from scipy.ndimage import binary_erosion
a = np.zeros([12,12])
a[1:11,1:11]=1
binary_erosion(a).astype(int)

这会移除最外层的边缘,但如果我也想移除第二层怎么办?我知道我可能应该使用该structure选项,但我不明白它是如何工作的,也找不到足够的示例来正确解释它

标签: pythonarraysnumpyscipy

解决方案


使用iterations选项让它重复n次数(删除附加层):[]

迭代:int,可选
侵蚀是重复迭代次数(默认情况下为一次)。如果迭代次数小于 1,则重复腐蚀,直到结果不再变化。

所以你的:

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

并且将迭代选项设置为 2,您会注意到减少了一个额外的层。

>>> binary_erosion(a, iterations=2).astype(int)
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

由于您在评论中询问,structure可用于确定每个iteration. 这里有一个很好的分解意味着什么。

这是the structuring element used for erosion. 这意味着如果这是一个 3x3 的正方形,当它围绕边缘移动时,完全覆盖的像素将被移除,而仅部分覆盖的像素将保留。

还可以看看这个中等的帖子,它手绘了一堆例子来说明它是如何工作的,并进一步分解了它。


推荐阅读