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

如何统计背景减除分割结果中各前景区域的像素数量

前景区域像素数统计与小区域过滤方案(基于Python+OpenCV)

背景减除输出示例掩码

核心逻辑

你已经通过背景减除法得到了二值分割结果,直接通过连通域分析即可快速统计每个独立前景区域的像素总数,同时完成像素数<20的小区域过滤。

具体实现步骤

  • 二值掩码预处理
    背景减除输出的结果可能存在灰度噪声,先做阈值处理得到纯二值图:前景像素赋值为255,背景像素赋值为0
    示例代码:
    import cv2
    import numpy as np
    
    # 读取背景减除输出的掩码图
    mask = cv2.imread("你的背景减除输出掩码路径.png", 0)
    # 阈值二值化消除中间灰度噪声
    _, binary_mask = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)
    
  • 连通域属性统计
    调用OpenCV内置的connectedComponentsWithStats接口,直接输出每个连通域的像素数等属性
    示例代码:
    # 参数说明:
    # num_labels:总连通域数量(包含背景区域)
    # labels:和原图尺寸一致的矩阵,每个位置的值对应所属连通域的编号
    # stats:每个连通域的统计数组,第4列为对应区域的像素总数
    # centroids:每个连通域的中心点坐标
    # connectivity=8表示对角相邻的像素也判定为同一区域,可按需改为4(仅上下左右相邻判定)
    num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_mask, connectivity=8)
    
  • 过滤小像素区域
    编号为0的连通域默认为背景,仅需要遍历编号≥1的前景区域即可
    示例代码:
    # 初始化过滤后的掩码
    filtered_mask = np.zeros_like(binary_mask)
    
    for label_id in range(1, num_labels):
        # 提取当前前景区域的像素总数
        pixel_count = stats[label_id, cv2.CC_STAT_AREA]
        # 仅保留像素数≥20的区域
        if pixel_count >= 20:
            filtered_mask[labels == label_id] = 255
    

其他开发环境的对应方案

  • C++ OpenCV:调用cv::connectedComponentsWithStats即可,参数逻辑和Python版本完全一致
  • MATLAB:使用bwconncomp获取连通域对象,再通过regionprops读取Area属性即可得到每个区域的像素数

内容的提问来源于stack exchange,提问作者Putra Yudha Pranata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:08