我正在尝试制作一个检测到红色的程序。但是有时它比平时更暗,所以我不能只使用一个值。 检测不同深红色的最佳范围是多少? 我目前使用的范围是128、0、0-255、60、60,但有时甚至无法检测到放在其前面的红色物体。
答案 0 :(得分:5)
RGB
并不是用于特定颜色检测的良好颜色空间。 HSV
将是一个不错的选择。
对于红色,您可以使用以下颜色图选择HSV范围(0,50,20) ~ (5,255,255)
和(175,50,20)~(180,255,255)
。当然,RED range
并不那么精确,但是还可以。
从另一个答案中提取的代码:Detect whether a pixel is red or not
#!/usr/bin/python3
# 2018.07.08 10:39:15 CST
# 2018.07.08 11:09:44 CST
import cv2
import numpy as np
## Read and merge
img = cv2.imread("ColorChecker.png")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
## Gen lower mask (0-5) and upper mask (175-180) of RED
mask1 = cv2.inRange(img_hsv, (0,50,20), (5,255,255))
mask2 = cv2.inRange(img_hsv, (175,50,20), (180,255,255))
## Merge the mask and crop the red regions
mask = cv2.bitwise_or(mask1, mask2 )
croped = cv2.bitwise_and(img, img, mask=mask)
## Display
cv2.imshow("mask", mask)
cv2.imshow("croped", croped)
cv2.waitKey()
相关答案:
当然,对于特定问题,也许其他颜色空间也可以。
答案 1 :(得分:2)
您可以检查红色部分是否最大,其他两个部分都明显更低:
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
)
使用numpy可以非常有效地实现这一点。
“正确的方法”是将其完全转换为HSV并在那里进行检查,但这会变得更慢且有些棘手(色相是一个角度,因此您不能只求取差值的绝对值,而且像( 255、254、254),即使被认为是白人,也将被认定为“红色”。
还要注意,人类视觉系统往往会补偿平均值,因此即使最大的成分确实是红色,也可以将其视为“蓝色”,但是图像中的所有内容都是红色,因此“不算”为我们的大脑。
在下面的图片中,如果您问一个人,圆圈区域中的部分是什么颜色,大多数人会说“蓝色”,而实际上最大的部分是红色:
答案 2 :(得分:1)
请使用HSV或HSL(色相,饱和度,亮度)代替RGB,在HSV中,可以使用某个阈值内的hue
值轻松检测红色。
答案 3 :(得分:1)
红色表示红色值高于蓝色和绿色。
因此您可以检查红色和蓝色,红色和绿色之间的区别。
您可以简单地将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)
希望它可以解决您的问题。
谢谢。