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

nom7f22z  于 2023-10-24  发布在  其他
关注(0)|答案(6)|浏览(115)

我正在使用Python中的OpenCV识别黄色。我已经到了这一步,我必须在HSV中定义黄色的下限和上限。
定义蓝色范围的示例:

lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])

HSV通常以百分比定义。我如何定义黄色的范围?
这是我一直在跟踪的the colorspaces tutorial
上面提到的博客中有一些建议,但并没有给我给予想要的输出。

hi3rlvi2

hi3rlvi21#

很简单,你可以用函数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]

Official documentation(参见以下网页的最后一部分)

rlcwz9us

rlcwz9us2#

看看this page。你会发现你想要的颜色的HSV值。
对于HSV,* 色调 * 范围为[0,179],饱和度范围为[0,255],数值范围为[0,255]。不同的软件使用不同的比例。因此,如果您要将OpenCV值与它们进行比较,则需要将这些范围归一化。
我猜你正在搜索下面的黄色值:

lower_blue = np.array([25,50,50])
upper_blue = np.array([32,255,255])
xam8gpfp

xam8gpfp3#

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

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]]}
isr3a4wc

isr3a4wc4#

颜色范围

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)

BEFORE [原图]

蓝标提取

最终镜像

在这里,你可以看到所有的刻度线几乎都被删除了,原因是因为总有改进的空间,但这似乎是我们能得到的最好的结果,因为即使删除这些小标记也不会对使用Tesseract的OCR产生深远的影响。
希望能帮上忙!

lymgl2op

lymgl2op5#

如果我想这样做,首先找到黄色的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))```
lqfhib0f

lqfhib0f6#

如果你用相机拍照,这将取决于光照条件。如果你的目标是跟踪一些物体,你应该总是更新你的HSV值。我的建议是在你的光照条件下保持你的边界尽可能窄。

相关问题