洪水填充 Numpy 布尔矩阵的有效方法:如何替换所有由“True”括起来的“False”值

map*_*ple 1 python opencv numpy image-processing

H x W对于仅包含True和值的形状的给定图像掩模矩阵False,我希望将所有False值转换为True它们完全被值包围时的True值。

例如

mask = np.array([
    [True,  True,  True,  True,  True ],
    [True,  False, True,  False, True ],
    [True,  True,  True,  False, True ],
    [True,  False, False, False, True ],
    [True,  True,  True,  True,  True ]
])
Run Code Online (Sandbox Code Playgroud)

结果应该是

np.array([
    [True,  True,  True,  True,  True ],
    [True,  True,  True,  True,  True ],
    [True,  True,  True,  True,  True ],
    [True,  True,  True,  True,  True ],
    [True,  True,  True,  True,  True ]
])
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种有效的方法来实现这一点,也许是通过一个强大的图像处理库,而不是制作一个自定义的 Python 帮助函数。

Chr*_*itz 6

这是一个使用cv.findContours.

这会找到白色岛屿,其中有黑色池塘,然后填满岛屿。

在您的示例中,它将返回覆盖整个域的单个轮廓。就我而言,它将找到三个轮廓:顶部的凹形斑点、左侧的小斑点和右侧的大斑点。它不会费心去寻找大圆圈中包含的小圆圈。

tmp = src.astype(np.uint8).copy()

(cnts, _) = cv.findContours(
    tmp, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

cv.drawContours(
    image=tmp,
    contours=cnts, contourIdx=-1,
    color=1, thickness=cv.FILLED)

tmp = tmp.astype(bool)
Run Code Online (Sandbox Code Playgroud)

输入输出:

输入...输出