如何统计背景减除分割结果中各前景区域的像素数量
前景区域像素数统计与小区域过滤方案(基于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
相关产品推荐
相关产品推荐

