OpenCV 检测颜色

Ammar Ali 2024年2月15日
OpenCV 检测颜色

本教程将讨论在 Python 中使用 OpenCV 的 inRange() 函数检测图像中的颜色。

在 Python 中使用 OpenCV 的 inRange() 函数检测图像上的颜色

我们可以使用 OpenCV 的 inRange() 函数检测和提取图像中存在的颜色。有时,出于某种原因,我们想从图像中删除或提取颜色。

我们可以使用 OpenCV 的 inRange() 函数来创建颜色掩码,或者换句话说,我们可以使用该颜色的范围来检测颜色。颜色以 RGB 三元组值格式存储在彩色图像中。

要创建它的蒙版,我们必须使用该颜色的明暗版本的 RGB 三元组值。例如,在 BRG 图像中,如果我们要提取红色,我们可以使用 (0,0,50) 表示浅红色,使用 (255,50,50) 表示深红色来创建红色蒙版.

我们可以传递图像和上下 BRG 值来创建蒙版。

例如,让我们读取包含一些不同颜色的圆圈的图像,并创建一个红色蒙版和一个绿色蒙版。请参阅下面的代码。

import cv2

img = cv2.imread("download.png")

# mask of red color
mask1 = cv2.inRange(img, (0, 0, 50), (50, 50, 255))

# mask of blue color
mask2 = cv2.inRange(img, (50, 0, 0), (255, 50, 50))

cv2.imshow("Original Image", img)
cv2.imshow("mask red color", mask1)
cv2.imshow("mask blue color", mask2)
cv2.waitKey(0)

输出:

使用 inrange 制作蒙版

我们可以将这两个蒙版与原始图像进行比较,以了解它们是否包含正确的颜色。我们可以看到掩码一在红色之上,而掩码二在蓝色之上。

inRange() 函数创建一个与原始图像相似的新二值图像。如你所见,蒙版图像中只有白色和黑色两种颜色。

inRange() 函数将颜色的值设置为 1,如果颜色存在于给定的颜色范围内,则设置为白色,如果颜色不存在于指定的颜色范围内,则设置为 0。上图采用 BRG 色标。

这就是我们在 inRange() 函数中使用 BRG 值的原因,但我们也可以将图像转换为其他色标,例如 HSV,在这种情况下,我们将使用 HSV 标度值来创建蒙版。现在让我们从图像中提取红色和蓝色。

要提取这两种颜色,我们必须使用 OpenCV 的 bitwise_or() 函数将两个蒙版组合起来以创建一个蒙版。之后,我们可以使用 OpenCV 的 bitwise_and() 函数从图像中提取颜色,使用图像作为第一个和第二个参数,掩码作为第三个参数。

请参阅下面的代码。

import cv2

img = cv2.imread("download.png")

# mask of red color
mask1 = cv2.inRange(img, (0, 0, 50), (50, 50, 255))

# mask of blue color
mask2 = cv2.inRange(img, (50, 0, 0), (255, 50, 50))

# final mask
mask = cv2.bitwise_or(mask1, mask2)
target = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow("Original Image", img)
cv2.imshow("mask red color", mask1)
cv2.imshow("mask blue color", mask2)
cv2.imshow("mask of both colors", mask)
cv2.imshow("target colors extracted", target)
cv2.waitKey(0)

输出:

从图像中提取颜色

从给定的图像中成功提取了红色和蓝色,如上一张图像所示。要将一种颜色空间转换为另一种颜色空间,我们可以使用 OpenCV 的 cvtColor() 函数。

如果我们有一张带有 HSV 颜色空间的图像,我们必须使用 HSV 值来创建蒙版。在 HSV 中,颜色具有定义颜色的三个值 Hue、Saturation 和 Value。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - Python OpenCV

相关文章 - OpenCV Image