如何在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
相关产品推荐
相关产品推荐

