如何使用OpenCV查找红色的颜色区域?

时间:2018-07-08 05:32:02

标签: python opencv colors

我正在尝试制作一个检测到红色的程序。但是有时它比平时更暗,所以我不能只使用一个值。 检测不同深红色的最佳范围是多少? 我目前使用的范围是128、0、0-255、60、60,但有时甚至无法检测到放在其前面的红色物体。

4 个答案:

答案 0 :(得分:5)

RGB并不是用于特定颜色检测的良好颜色空间。 HSV将是一个不错的选择。

对于红色,您可以使用以下颜色图选择HSV范围(0,50,20) ~ (5,255,255)(175,50,20)~(180,255,255)。当然,RED range并不那么精确,但是还可以。

enter image description here

从另一个答案中提取的代码: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()

enter image description here

相关答案:

  
      
  1. Choosing the correct upper and lower HSV boundaries for color detection with`cv::inRange` (OpenCV)
  2.   
  3. How to define a threshold value to detect only green colour objects in an image :Opencv
  4.   
  5. How to detect two different colors using `cv2.inRange` in Python-OpenCV?
  6.   
  7. Detect whether a pixel is red or not
  8.   

当然,对于特定问题,也许其他颜色空间也可以。

How to read utility meter needle with opencv?

答案 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),即使被认为是白人,也将被认定为“红色”。

还要注意,人类视觉系统往往会补偿平均值,因此即使最大的成分确实是红色,也可以将其视为“蓝色”,但是图像中的所有内容都是红色,因此“不算”为我们的大脑。

在下面的图片中,如果您问一个人,圆圈区域中的部分是什么颜色,大多数人会说“蓝色”,而实际上最大的部分是红色:

A reddish lenna

答案 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)

希望它可以解决您的问题。

谢谢。