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

图像背景减除时如何去除噪声,得到干净可用的剪影图像?

背景减除生成剪影的噪声去除问题

我正在对图像进行背景减除操作,生成剪影图像用于后续处理,我的图像数据集样例如图所示:
样例图像

目前我已完成的处理代码如下:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:27:05