使用OpenCV识别HSV中的颜色范围

15
我正在使用Python中的OpenCV来识别黄色。我已经到了定义HSV中黄色的下限和上限的步骤。
定义蓝色范围的示例:
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])

HSV通常以百分比来定义。我如何像示例那样定义黄色的范围?
这是我一直在跟随的颜色空间教程
上述提到的博客中有一些建议,但它没有给我想要的输出。

1
请查看http://i.stack.imgur.com/gCNJp.jpg。色调值以度为单位给出。Opencv使用0..180的范围,而不是0..360,因此您需要将度数值除以2。选择围绕目标值的任何范围。例如,黄色的色调值为60度。因此,您的色调范围可能是从60/2-10到60/2+10,或者从60/2-5到60/2+5,这取决于您希望离完美的黄色有多远。 - Micka
6个回答

20

这很简单。你可以使用函数cv2.cvtColor()

不需要传递图像,只需传递你想要转换为HSV的BGR值。

例如,要找到绿色的HSV值,输入以下命令:

import numpy as np
import cv2

green = np.uint8([[[0, 255, 0]]]) # Here insert the BGR values which you want to convert to HSV
hsvGreen = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsvGreen)

lowerLimit = hsvGreen[0][0][0] - 10, 100, 100
upperLimit = hsvGreen[0][0][0] + 10, 255, 255

print(upperLimit)
print(lowerLimit)

现在,上限将为[H+10, 100,100]上限将为[H-10, 255, 255] 官方文档(请参阅以下网页的最后部分)

在OpenCV中,默认的颜色格式通常被称为RGB,但实际上是BGR(字节顺序相反)。 - undefined

10
请查看此页面。您将找到所需颜色的HSV值。
对于HSV,色调范围是[0,179],饱和度范围是[0,255],亮度范围是[0,255]。不同的软件使用不同的刻度。因此,如果您要将OpenCV的值与它们进行比较,您需要对这些范围进行归一化。
我猜您正在搜索以下类似于黄色的值:
lower_blue = np.array([25,50,50])
upper_blue = np.array([32,255,255])

是的,我正在搜索黄色的这些值。 - Harish

8

您可以使用此示例配色方案。第一个值是上限,第二个值是下限。

color_dict_HSV = {'black': [[180, 255, 30], [0, 0, 0]],
              'white': [[180, 18, 255], [0, 0, 231]],
              'red1': [[180, 255, 255], [159, 50, 70]],
              'red2': [[9, 255, 255], [0, 50, 70]],
              'green': [[89, 255, 255], [36, 50, 70]],
              'blue': [[128, 255, 255], [90, 50, 70]],
              'yellow': [[35, 255, 255], [25, 50, 70]],
              'purple': [[158, 255, 255], [129, 50, 70]],
              'orange': [[24, 255, 255], [10, 50, 70]],
              'gray': [[180, 18, 230], [0, 0, 40]]}

仅仅是为了帮助大家,这里的HSV数组更加有效。与其他的不同,它真的对我很有帮助 :) - Muneeb Ahmad Khurram
红1和红2有什么区别? :) - jaques-sam
OpenCV中HSV的色调范围为0到180,颜色以循环方式变化。红色值大约在0和180之间。请查看HSV色轮以更好地理解。 - Ali Hashemian

3

颜色范围

color_dict_HSV = {'black': [[180, 255, 30], [0, 0, 0]],
              'white': [[180, 18, 255], [0, 0, 231]],
              'red1': [[180, 255, 255], [159, 50, 70]],
              'red2': [[9, 255, 255], [0, 50, 70]],
              'green': [[89, 255, 255], [36, 50, 70]],
              'blue': [[128, 255, 255], [90, 50, 70]],
              'yellow': [[35, 255, 255], [25, 50, 70]],
              'purple': [[158, 255, 255], [129, 50, 70]],
              'orange': [[24, 255, 255], [10, 50, 70]],
              'gray': [[180, 18, 230], [0, 0, 40]]}

鸣谢:

Ali Hashemian

如何使用OpenCV从图像中去除颜色

由于大多数人都想这样做,即在我的例子中,任务是从图像中去除蓝色,我使用了以下代码来去除蓝色印章和蓝色勾选标记,以便使用Tesseract进行正确的OCR。

[颜色去除] 代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# image path:    
#path = "D://opencvImages//"
#fileName = "out.jpg"

# Reading an image in default mode:
inputImage = cv2.imread('0.jpg')

# Convert RGB to grayscale:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Convert the BGR image to HSV:
hsvImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2HSV)

# Create the HSV range for the blue ink:
# [128, 255, 255], [90, 50, 70]
lowerValues = np.array([90, 50, 70])
upperValues = np.array([128, 255, 255])

# Get binary mask of the blue ink:
bluepenMask = cv2.inRange(hsvImage, lowerValues, upperValues)
# Use a little bit of morphology to clean the mask:
# Set kernel (structuring element) size:
kernelSize = 3
# Set morph operation iterations:
opIterations = 1
# Get the structuring element:
morphKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernelSize, kernelSize))
# Perform closing:
bluepenMask = cv2.morphologyEx(bluepenMask, cv2.MORPH_CLOSE, morphKernel, None, None, opIterations, cv2.BORDER_REFLECT101)

# Add the white mask to the grayscale image:
colorMask = cv2.add(grayscaleImage, bluepenMask)
_, binaryImage = cv2.threshold(colorMask, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imwrite('bwimage.jpg',binaryImage)
thresh, im_bw = cv2.threshold(binaryImage, 210, 230, cv2.THRESH_BINARY)
kernel = np.ones((1, 1), np.uint8)
imgfinal = cv2.dilate(im_bw, kernel=kernel, iterations=1)
cv2.imshow(imgfinal)

处理前的图片

Original Image

提取蓝色标记

Blue Tick Marks Determined

最终图片

enter image description here

可以看到,所有的勾号都被几乎完全移除了。这是因为总有改进的空间,但是即使去掉这些小标记,对使用Tesseract的OCR也不会产生深刻的影响。

希望这可以帮助!


2

如果我想要做到这件事,首先需要在画图中使用“编辑颜色”找到黄色的RGB数值。然后使用以下方法将其转换为HSV:

最初的回答:

要做到这一点,首先在画图中使用“编辑颜色”找到黄色的RGB数值,然后使用以下方法将其转换为HSV:

 u = np.uint8([[[0,236,236]]])
 # define range of blue color in HSV
 lower_yellow = np.array(cv2.cvtColor(l,cv2.COLOR_BGR2HSV))
 upper_yellow = np.array( cv2.cvtColor(u,cv2.COLOR_BGR2HSV))```


1

如果您从相机拍照,那将取决于光照条件。如果您的目的是跟踪某些对象,则应始终更新HSV值。我的建议是在您的光照条件下尽可能保持边界窄。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接