侵蚀阵列的几层

时间:2019-09-24 22:44:26

标签: python arrays numpy scipy

我无法理解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选项,但我不了解它的工作原理,也找不到足够的示例来正确解释它

1 个答案:

答案 0 :(得分:1)

使用iterations选项使其重复n次(删除其他图层):[source]

  

迭代次数: 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的去除量。 here的含义很好。

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

还请看this medium post,该手册为它的工作原理绘制了一系列示例,并将其进一步分解。