You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高效填充NumPy布尔矩阵:替换被True包围的所有False值

高效处理布尔掩码:填充被完全包围的False区域

你需要解决的是布尔掩码的内部空洞填充问题——把所有被True完全包围的False区域转换成True,优先用成熟图像处理库实现,无需编写自定义函数。下面是两种高效的解决方案:

方法一:用Scipy的binary_fill_holes(最简洁)

Scipy的ndimage模块提供了专门的binary_fill_holes函数,直接针对二进制布尔数组填充内部空洞,完全匹配需求,一行核心代码就能搞定。

代码示例

import numpy as np
from scipy.ndimage import binary_fill_holes

# 示例掩码
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 ]
])

# 填充内部空洞
filled_mask = binary_fill_holes(mask).astype(bool)

print(filled_mask)

运行后输出的就是全True的矩阵,完全符合示例要求。

方法二:用OpenCV的floodFill(适合大型图像)

如果处理的是超大尺寸掩码,OpenCV的实现效率更高。核心思路是:先填充掩码边界的False(外部区域),剩下的False就是内部空洞,再将其转换为True。

代码示例

import numpy as np
import cv2

# 示例掩码
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 ]
])

# 转换为OpenCV支持的uint8格式(False=0,True=255)
img = mask.astype(np.uint8) * 255
# 创建floodFill需要的边界掩码(比原图大2个像素)
h, w = img.shape
mask_flood = np.zeros((h+2, w+2), np.uint8)

# 从四个角落开始填充外部的0(即外部False区域)
cv2.floodFill(img, mask_flood, (0,0), 255)
cv2.floodFill(img, mask_flood, (w-1,0), 255)
cv2.floodFill(img, mask_flood, (0,h-1), 255)
cv2.floodFill(img, mask_flood, (w-1,h-1), 255)

# 剩下的0就是内部空洞,转成True;原来的255保持True
filled_mask = (img == 255).astype(bool)

print(filled_mask)

两种方法都能高效解决问题:scipy的写法更简洁直观,OpenCV在处理大尺寸图像时性能更优,可根据你的实际场景选择。

内容的提问来源于stack exchange,提问作者maplemaple

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:01:25