如何检测图像中黑白方框的轮廓?现有方案存在区域缺失问题
嘿,我来帮你搞定这个黑白方框检测的问题!你现在的需求是识别图像里方框的外部区域,但用HSV空间没法捕捉到黑白方框,换成HLS后虽然多识别了3个,但还是缺2个对吧?我来给你梳理下解决方案~
解决黑白方框区域检测的问题
首先得说,黑白颜色在HSV空间里确实不好精准定位——黑色的H、S值都偏低,白色的S值低、V值高,很容易和背景的浅色/深色区域混淆;而HLS的L通道是亮度维度,天生更适合区分黑白这类靠亮度区分的颜色,但你的阈值范围可能没覆盖到所有黑白(包括过渡的灰色)区域。
调整HLS阈值的具体方案
我们可以分别定义黑色和白色的HLS阈值,然后合并掩码,再反转得到方框外部区域:
import cv2 import numpy as np img = cv2.imread("1.png") # 转换为HLS色彩空间 img_hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS) # 定义黑色的HLS阈值:覆盖纯黑到深灰区域 lower_black = np.array([0, 0, 0]) upper_black = np.array([180, 255, 60]) # 定义白色的HLS阈值:覆盖纯白到浅灰区域 lower_white = np.array([0, 190, 0]) upper_white = np.array([180, 255, 255]) # 生成黑白区域的掩码 mask_black = cv2.inRange(img_hls, lower_black, upper_black) mask_white = cv2.inRange(img_hls, lower_white, upper_white) # 合并两个掩码,得到所有黑白方框区域 mask = cv2.bitwise_or(mask_black, mask_white) # 反转掩码:得到我们需要的方框外部区域 mask_inv = cv2.bitwise_not(mask) # 提取外部区域 result = cv2.bitwise_and(img, img, mask=mask_inv) cv2.imwrite("final_result.png", result)
额外优化小技巧
如果调整阈值后还是有遗漏,可以试试这些操作:
- 高斯模糊降噪:先对原图做
cv2.GaussianBlur(img, (5,5), 0),减少图像里的细碎噪声,让黑白方框的边缘更连贯 - 形态学补漏:用膨胀操作
cv2.dilate(mask, np.ones((3,3), np.uint8), iterations=1)填补掩码里的小漏洞,让黑白区域的掩码更完整 - 亮度均衡:如果图像有光照不均的情况,可以单独对HLS的L通道做直方图均衡化,提升黑白区域和背景的对比度
为什么之前的HLS方案还有遗漏?
大概率是你之前设置的HLS阈值范围太窄了——有些边框是浅灰或者深灰,它们的L值不在你原来的阈值区间里,所以把黑色的上限L值调高一点,白色的下限L值调低一点,就能覆盖到这些过渡的灰色区域啦。
内容的提问来源于stack exchange,提问作者dip deb
相关产品推荐
相关产品推荐

