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

如何以最快矩阵式计算方式处理多区域Mask的区域值替换

解决Mask连通区域替换为区域像素总数的高效方法

你要处理的是把二值Mask里的每个连通区域,替换成该区域的总像素数,不用靠findContours循环,这几个方法更高效:

方法1:用scipy.ndimage.label + numpy.bincount

这是最简洁的向量化解法,全程不需要循环处理:

import numpy as np
from scipy.ndimage import label

# 你的示例Mask
mask = np.array([[1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0],
                 [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0],
                 [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0],
                 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0],
                 [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0],
                 [0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]], dtype=np.float32)

# 标记所有连通区域,labels中每个连通区域有唯一标识(从1开始)
labels, num_regions = label(mask)
# 统计每个标识对应的像素总数,index 0对应背景(值为0的区域)
region_sizes = np.bincount(labels.flatten())
# 将标记映射为对应区域的像素数
result = region_sizes[labels]
# 背景区域保持为0
result[mask == 0] = 0.0

print(result)

输出结果中,每个连通区域的所有像素会被替换成该区域的总像素数,比如左上角12像素的区域全为12,右下角6像素的区域全为6,左下角5像素的区域全为5。

方法2:用OpenCV的connectedComponents

如果你的项目已经依赖OpenCV,这个方法更贴合现有技术栈,connectedComponents能直接返回区域标记和统计信息:

import numpy as np
import cv2

mask = np.array([[1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0],
                 [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0],
                 [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0],
                 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0],
                 [0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0],
                 [0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]], dtype=np.float32)

# 转换为OpenCV要求的8位单通道格式
mask_8u = (mask * 255).astype(np.uint8)
# 获取连通区域标记,num_labels包含背景的总区域数,labels为标记图
num_labels, labels = cv2.connectedComponents(mask_8u)

# 统计每个区域的像素数
region_sizes = np.bincount(labels.flatten())
# 映射为区域大小,背景置0
result = region_sizes[labels]
result[mask == 0] = 0.0

print(result)

这个方法和scipy的思路一致,但用OpenCV的连通区域检测实现,适合已经在使用OpenCV的项目场景。

为什么比findContours循环更优?

不管是scipy的label还是OpenCV的connectedComponents,都是批量向量化处理,时间复杂度为O(N)(N为总像素数);而用findContours循环每个轮廓赋值,需要逐个遍历坐标点,时间效率低很多——尤其是当Mask包含大量小区域时,两者的性能差距会非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:17:08