对于只包含TrueFalse值的形状H x W的给定图像遮罩矩阵,当它们完全被True值包围时,我希望将所有False值转换为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 ]
])

结果应该是

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 ]
])

我正在寻找一种高效的方法来实现这一点,可能是通过一个健壮的图像处理库,而不是精心设计一个定制的Python助手函数.

推荐答案

这里有一个使用cv.findContours的解决方案.

这发现了白色的岛屿,里面有任何黑色的池塘,然后填满了岛屿.

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

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)

输入、输出:

input ... output

Python相关问答推荐

具有多处理的冗余打印

Pandas 的日期范围功能

无法使用msal获取Azure订阅,并通过REST API在Python中获取请求

从pandas中的两列创建分类数据

通过在测验程序中添加解释来加强学习

如何列出Python脚本中使用的所有包?

为什么Pydantic在我申报邮箱时说邮箱丢失

如何使用scikit-learn Python库中的Agglomerative集群算法以及集群中声明的对象数量?

为什么我的(工作)代码(生成交互式情节)在将其放入函数中时不再工作?

了解shuffle在NP.random.Generator.choice()中的作用

请从Python访问kivy子部件的功能需要帮助

如何使用上下文管理器创建类的实例?

剧作家Python没有得到回应

_repr_html_实现自定义__getattr_时未显示

加速Python循环

如何在Python脚本中附加一个Google tab(已经打开)

计算分布的标准差

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

删除marplotlib条形图上的底边

在matplotlib中删除子图之间的间隙_mosaic