图像背景减除时如何去除噪声,得到干净可用的剪影图像?
背景减除生成剪影的噪声去除问题
我正在对图像进行背景减除操作,生成剪影图像用于后续处理,我的图像数据集样例如图所示:
目前我已完成的处理代码如下:
import cv2 import numpy as np frame = cv2.imread("test.png") hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_blue = np.array([0, 0, 120]) upper_blue = np.array([180, 38, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) result = cv2.bitwise_and(frame, frame, mask=mask) b, g, r = cv2.split(result) filter = g.copy() ret,mask = cv2.threshold(filter,10,255, 1) frame[ mask == 0] = 255 cv2.imwrite("123.png", mask)
当前得到的处理结果如图所示:
后续我尝试使用轮廓查找方法优化效果,代码如下,但未达到预期:
contours_mask, hierachy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for contour in range(len(contours_mask)): # create mask if contour != 1: cv2.fillConvexPoly(mask_b, contours_mask[contour], (0, 0, 0))
请问有什么方法可以去除噪声,得到如图所示的理想处理结果?
解决方案
你之前的轮廓优化逻辑存在两处明显问题:一是没有初始化空白的mask_b变量,二是用固定索引contour !=1筛选轮廓完全不可靠,轮廓的排序和数量受噪点影响是随机的。推荐用形态学预处理+面积过滤轮廓的组合方案实现需求,具体代码如下:
import cv2 import numpy as np # 原有逻辑得到初始mask frame = cv2.imread("test.png") hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_blue = np.array([0, 0, 120]) upper_blue = np.array([180, 38, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) result = cv2.bitwise_and(frame, frame, mask=mask) b, g, r = cv2.split(result) filter = g.copy() ret,mask = cv2.threshold(filter,10,255, 1) # 新增优化逻辑 # 1. 形态学开运算去除小噪点 kernel = np.ones((5,5), np.uint8) mask_clean = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2) # 2. 查找外轮廓,只保留面积最大的主体轮廓 contours, hierarchy = cv2.findContours(mask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 按轮廓面积降序排序 contours = sorted(contours, key=cv2.contourArea, reverse=True) # 新建空白mask,只绘制最大的人形轮廓 final_mask = np.zeros_like(mask) if contours: cv2.drawContours(final_mask, [contours[0]], -1, 255, thickness=cv2.FILLED) # 输出结果 cv2.imwrite("123.png", final_mask)
优化逻辑说明
- 形态学开运算可以先腐蚀掉小面积的白噪点,再膨胀恢复主体轮廓的边缘,不会影响人形主体的形态
- 按轮廓面积排序后取第一个,直接过滤所有小噪点生成的无效轮廓,稳定性远高于固定索引筛选
- 用
cv2.drawContours直接填充最大轮廓,不需要逐个填充非目标轮廓,运行效率更高
内容的提问来源于stack exchange,提问作者Alex Hales
相关产品推荐
相关产品推荐

