使用 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()
输出
在上面,我们看到掩码中有一些黑色斑点,那就是噪声。