Python 如何使用OpenCV查找红色区域?
我正在尝试制作一个程序,在其中我检测到红色。然而,有时它比平常暗,所以我不能只使用一个值。 检测不同深浅红色的最佳范围是什么?Python 如何使用OpenCV查找红色区域?,python,opencv,colors,Python,Opencv,Colors,我正在尝试制作一个程序,在其中我检测到红色。然而,有时它比平常暗,所以我不能只使用一个值。 检测不同深浅红色的最佳范围是什么? 我目前使用的范围是128,0,0-255,60,60,但有时它甚至没有检测到我放在它前面的红色物体。您可以检查红色分量是否为最大值,其他分量是否明显较低: def red(r, g, b): threshold = max(r, g, b) return ( threshold > 8 # stay away fr
我目前使用的范围是128,0,0-255,60,60,但有时它甚至没有检测到我放在它前面的红色物体。您可以检查红色分量是否为最大值,其他分量是否明显较低:
def red(r, g, b):
threshold = max(r, g, b)
return (
threshold > 8 # stay away from black
and r == threshold # red is biggest component
and g < threshold*0.5 # green is much smaller
and b < threshold*0.5 # so is b
)
def红色(r、g、b):
阈值=最大值(r、g、b)
返回(
阈值>8#远离黑色
r==阈值#红色是最大的成分
g
这可以使用numpy非常有效地实现
“正确的方法”是对HSV进行完全转换,并在那里进行检查,但速度会慢一些,而且会有点棘手(色调是一个角度,所以你不能只取差值的绝对值,而且像(255,254,254)这样的颜色将被限定为“红色”,即使它们被认为是人类的白色)
还要注意的是,人类的视觉系统往往会对平均值进行补偿,因此即使图像中最大的部分是红色,也可以将某些东西视为“蓝色”,但图像中的所有东西都是红色,因此对我们的大脑来说“不算”
在下图中,如果你问一个人圆圈区域中的部分是什么颜色,大多数人会说“蓝色”,而实际上最大的部分是红色:
请使用HSV或HSL(色调、饱和度、亮度)代替RGB,在HSV中,使用
色调的值可以在一定阈值内轻松检测红色。RGB
不是用于特定颜色检测的良好颜色空间HSV
将是一个不错的选择
对于红色,您可以使用以下颜色映射选择HSV范围(0,50,20)~(5255255)
和(175,50,20)~(180255255)
。当然,红色范围
没有那么精确,但它还可以
代码取自我的另一个答案:
有关答案:
当然,对于具体的问题,也许其他颜色空间也可以
红色表示红色值高于蓝色和绿色
因此,您可以检查红色和蓝色、红色和绿色之间的差异
您可以简单地将RGB分割成单独的通道,然后像这样应用阈值
b,g,r = cv2.split(img_rgb)
rg = r - g
rb = r - b
rg = np.clip(rg, 0, 255)
rb = np.clip(rb, 0, 255)
mask1 = cv2.inRange(rg, 50, 255)
mask2 = cv2.inRange(rb, 50, 255)
mask = cv2.bitwise_and(mask1, mask2)
希望它能解决你的问题
谢谢。只检查色调是行不通的,除非你认为(255254254)是一个完美的“红色”。@6502它比绿色或其他颜色更红。此外,OP在颜色较深方面也存在问题。为什么将BGR转换为HSV会改变颜色?为什么它似乎与基于原始图像的HSV值相匹配?这与opencv的答案类似。他们还建议使用opencv从RGB转换为HSV,并使用色调+/-10和[50255]范围来表示饱和度和似乎的值。为什么所有其他颜色选择器都使用范围为[0360]的度值使用[0180]标量时的色调?对于那些浏览答案的人来说,有一点细微差别就是所有的颜色选择器都使用(百分比)值[01100]%作为饱和度和颜色值。
b,g,r = cv2.split(img_rgb)
rg = r - g
rb = r - b
rg = np.clip(rg, 0, 255)
rb = np.clip(rb, 0, 255)
mask1 = cv2.inRange(rg, 50, 255)
mask2 = cv2.inRange(rb, 50, 255)
mask = cv2.bitwise_and(mask1, mask2)