【发布时间】:2021-09-15 08:29:34
【问题描述】:
我有一个面具,里面可能有洞。我想从遮罩的外部(而不是孔)横向侵蚀一定数量的像素。
诀窍是,如果我向内侵蚀 5px 并且在某个点有一个距离边缘 3px 的孔,我想侵蚀这 3px,然后将剩余的 2px 侵蚀到孔之外。所以我总是每边侵蚀 5px,基本上跳过了任何漏洞。
例如使用这个掩码:
这些灰色区域将被侵蚀:
我可以通过遍历每一行来了解如何做到这一点,例如:
erode_px = 5
for y, row in enumerate(mask):
idxs = np.nonzero(row)[0]
if idxs.size:
if idxs.size < erode_px * 2:
mask[y] = 0
else:
mask[y, :idxs[erode_px]] = 0
mask[y, idxs[-erode_px]:] = 0
但我正在处理非常大的面具,这需要高效。有没有办法在不遍历 Python 中的每一行的情况下实现这一点?最好只使用 OpenCV / numpy。
【问题讨论】:
-
您可以在 C++ 中实现它,将其添加到 openCV 源代码中并在 Python 中使用包装器。
-
也许有一个复杂的算法,有两个或三个单独的距离变换等。不确定。
-
整合图像可能有用。
标签: python numpy opencv image-processing