使用 OpenCV 和 Python 检测特定颜色(此处为蓝色)?


对于许多人来说,图像处理可能看起来像是一项可怕而艰巨的任务,但它并不像许多人想象的那么难。在本教程中,我们将使用 Python 在 OpenCV 中进行基本的颜色检测。

计算机上的颜色是如何工作的?

我们通过颜色空间或颜色模型在计算机上表示颜色,这些模型基本上将颜色范围描述为数字元组。

我们不逐个讨论每种颜色,而是讨论我们最常用的颜色空间,即 RGB(红、绿、蓝)和 HSV(色调、饱和度、明度)。

RGB 将颜色描述为三个分量的元组。每个分量可以取 0 到 255 之间的值,其中元组 (0, 0, 0) 表示黑色,(255, 255, 255) 表示白色。例如,如果我们要在屏幕上显示一个纯蓝色的像素,则 R 值将为 0,G 值将为 0,B 值将为 255。

以下是 RGB 颜色的一些示例

颜色RGB 值
红色255, 0, 0
橙色255, 128, 0
粉色255, 153, 255

使用 HSV,像素也由 3 个参数表示,但它们分别是色调、饱和度和明度。但是,与 RGB 不同,HSV 不使用原色来表示像素。相反,它使用色调,即像素的颜色或阴影。

饱和度是颜色的强度,其中饱和度为 0 表示 0,饱和度为 255 表示最大强度。明度将告诉颜色有多亮或多暗。

检测正确的颜色

因此,让我们首先下载我们将要使用的图像,

现在我们已经获得了颜色图像,我们可以开始有趣的部分了。只需打开您喜欢的 Python 文本编辑器或 IDE,然后开始吧。

import cv2
import numpy as np
import imutils
img = cv2.imread('color2.jpg')

在上面的代码行中,前两行处理所有导入。在第三行中,我正在导入 imutils 模块,它有助于调整图像大小并查找颜色范围。在第 4 行中,我们打开了图像。

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

现在我们将图像转换为 HSV 图像,因为 HSV 有助于区分颜色和强度。

lower_range = np.array([110,50,50])
upper_range = np.array([130,255,255])

现在我们定义了要检测的蓝色的上限和下限。要找到这些限制,我们可以使用 imutils 库中的范围检测器脚本。我们将这些值放入 NumPy 数组中。

mask = cv2.inRange(hsv, lower_range, upper_range)

在这里,我们实际上正在使用指定的蓝色创建一个掩码。掩码只是表示图像的特定部分。在这种情况下,我们正在遍历 HSV 图像,并检查颜色是否在较低范围和较高范围之间。匹配的区域将设置为掩码变量的图像。

cv2.imshow('image', img)
cv2.imshow('mask', mask)

while(True):
   k = cv2.waitKey(5) & 0xFF
   if k == 27:
      break

cv2.destroyAllWindows()

最后,我们可以并排显示原始图像和掩码图像以查看差异。如果您想了解代码中 0xFF 的含义,请阅读此内容。然后,代码等待用户按下“Esc”键,这将退出并销毁所有窗口以进行清理。

最终程序

import cv2
import numpy as np
import imutils

img = cv2.imread('color2.jpg')

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_range = np.array([110,50,50])
upper_range = np.array([130,255,255])

mask = cv2.inRange(hsv, lower_range, upper_range)

cv2.imshow('image', img)
cv2.imshow('mask', mask)

while(True):
   k = cv2.waitKey(5) & 0xFF
   if k == 27:
      break

cv2.destroyAllWindows()

输出

在上面,我们看到掩码中有一些黑色斑点,那就是噪声。

更新于: 2019年7月30日

2K+ 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始
广告