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

如何在OpenCV中填充裁剪图像背景以准确检测白色像素

问题描述

目前我使用OpenCV按照给定的x、y坐标裁剪得到一张图像,正尝试检测该图像上的白色像素并将其展示。现有代码运行正常,但我用于截取截图的示例视频的部分帧中,裁剪得到的背景同样包含白色元素,对检测造成干扰。

我使用的代码如下:

import cv2

img = cv2.imread('Image_crop.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray, 150,255,0)
gray2 = gray.copy()

cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()

裁剪输出效果:
裁剪输出

当前白色像素检测输出效果:
白色像素输出

预期输出效果:
预期输出

请问是否有方法可以填充裁剪图像的背景,或是得到上述预期的输出效果?


解决方案

原代码使用单通道灰度阈值判断白色,仅通过亮度维度筛选,会将背景中亮度较高的浅灰、淡米色等区域误判为白色,可通过以下两种方案优化:

方案1:改用HSV颜色空间筛选白色(精准度更高)

HSV颜色空间可同时限定色相、饱和度、亮度三个维度,能更精准筛选出纯白色/近白色区域:

import cv2
import numpy as np

img = cv2.imread('Image_crop.jpg')
# 转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 设定白色的HSV阈值范围,可根据实际效果调整参数
lower_white = np.array([0, 0, 180])
upper_white = np.array([180, 30, 255])
# 生成白色区域掩膜
mask = cv2.inRange(hsv, lower_white, upper_white)

cv2.imshow('Filtered White', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

参数调整规则:

  • 亮度(第三个数值)下限:漏检目标白色时调低,误检背景多时调高
  • 饱和度(第二个数值)上限:误检彩色亮区时调低

方案2:叠加连通域过滤去除残留噪声

如果筛选后仍有零星背景白色噪点,可通过过滤连通域面积的方式仅保留目标大小的白色区域:

import cv2
import numpy as np

img = cv2.imread('Image_crop.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_white = np.array([0, 0, 180])
upper_white = np.array([180, 30, 255])
mask = cv2.inRange(hsv, lower_white, upper_white)

# 查找所有连通域
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 新建全黑背景的结果掩膜
final_mask = np.zeros_like(mask)
# 仅保留面积符合预期的连通域,面积阈值可根据目标实际大小调整,示例为保留面积大于100的区域
for cnt in contours:
    if cv2.contourArea(cnt) > 100:
        cv2.drawContours(final_mask, [cnt], -1, 255, -1)

cv2.imshow('Final Result', final_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

两种方案组合使用即可实现预期输出效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:45:03