python - 腐蚀数组的几层
问题描述
我无法理解 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
选项,但我不明白它是如何工作的,也找不到足够的示例来正确解释它
解决方案
使用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 的正方形,当它围绕边缘移动时,完全覆盖的像素将被移除,而仅部分覆盖的像素将保留。
还可以看看这个中等的帖子,它手绘了一堆例子来说明它是如何工作的,并进一步分解了它。
推荐阅读
- php - 制作虚拟主机后出错
- ruby-on-rails - 如何使用 Icalendar::HasComponents?
- sql - 如何在 SQL 中捕获每天创建和删除的表的详细信息?
- matlab - 使用 matlab 创建和绘制分布图
- visual-studio - Visual Studio 中的报表生成器 Nuget
- c++ - C++中TCP套接字的recv函数
- android - Firebase 数据库突然停止在少数安卓设备上运行
- woocommerce - 通过 Api 在 WooCommerce 中插入产品插件
- npm-install - 无法从“init.js”中找到模块“detox/runners/jest/adapter” - 排毒
- python-3.x - tensorflow不使用gpu - 素数程序