在 Python 中使用 OpenCV 进行图像颜色检测
OpenCV 库旨在帮助完成计算机视觉任务,并与各种编程语言兼容。该库实现了不同的有用算法和技术来处理图像。
本教程将演示如何使用 Python 的 OpenCV 库在图像中执行颜色检测。
颜色检测有多种应用。我们可以用它来区分现实生活中的物体。这也可以被认为是一种图像分割技术,因为我们尝试根据相似的特征来标记每个像素。
我们将使用 HSV 颜色空间检测颜色,它代表色相饱和度值。这是一个圆柱形颜色空间,在处理颜色信息时非常有用。
Hue 决定颜色信息,Saturation 表示颜色的强度,Value 根据颜色与黑色混合的多少决定亮度。
在 Python 中使用 OpenCV 库进行图像颜色检测
我们将使用 OpenCV 库中的各种函数进行颜色检测。让我们在下面讨论它们。
我们将检测给定图像中的一种特定颜色,并在检测到的片段周围添加边界。
我们需要将所需图像从 BGR 颜色空间转换为 HSV。要在图像中执行此类转换,我们可以使用 OpenCV 库中的 cvtColor()
函数。
我们需要给定颜色的边界,并返回图像中颜色所在位置的二进制掩码。OpenCV 的 inRange()
函数获取给定图像并根据指定的上限和下限返回颜色当前所在位置的二进制掩码。
此蒙版是检测到颜色的图像子集。
然后我们可以对这个二进制掩码应用形态学运算来过滤不需要的噪声。我们将使用 OpenCV 库中的 morphologyex()
函数来实现这一点。
它在膨胀后执行腐蚀以封闭对象中的小孔。
我们还需要使用这个创建的二进制掩码为图像添加边界。
bitwise_and()
用于分割图像中与给定掩码匹配的部分。使用 mask
参数提供掩码。
它比较源图像中的每个像素并匹配指定掩码中的相应像素。
为了给这个分割的图像添加边界,我们将使用两种方法,findContours()
和 drawContours()
。该轮廓可以被认为是沿着某些分割图像的边界连接点的曲线。
第一个函数返回给定图像的所有轮廓的列表。我们将使用 drawcontours()
函数来绘制轮廓。
现在让我们实现颜色检测的代码,并在下图中找到绿色。
代码:
import cv2
import numpy as np
img = cv2.imread("img3.jpeg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
bound_lower = np.array([25, 20, 20])
bound_upper = np.array([100, 255, 255])
mask_green = cv2.inRange(hsv_img, bound_lower, bound_upper)
kernel = np.ones((7, 7), np.uint8)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_CLOSE, kernel)
mask_green = cv2.morphologyEx(mask_green, cv2.MORPH_OPEN, kernel)
seg_img = cv2.bitwise_and(img, img, mask=mask_green)
contours, hier = cv2.findContours(
mask_green.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
output = cv2.drawContours(seg_img, contours, -1, (0, 0, 255), 3)
cv2.imshow("Result", output)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
现在让我们简要介绍一下实现的代码。
imread()
函数读取图像。我们使用 cvtColor()
函数将该图像的颜色空间从 BGR 转换为 HSV;注意函数中的 cv2.COLOR_BGR2HSV
参数。
然后我们指定上限和下限值来检测图像中的绿色,并使用 inRange()
函数创建二进制掩码。
使用 morphologyEx()
函数从这个掩码中去除噪声两次。
我们第一次使用 cv2.MORPH_CLOSE
参数过滤了黑色部分的白噪声。第二次,我们使用 cv2.MORPH_CLOSE
从白色部分过滤黑噪声。
然后我们在分割部分上画出边界。我们使用 findContours()
确定分割部分及其轮廓,并使用 drawContours()
方法绘制边界。
结论
本教程讨论了如何在 Python 中使用 OpenCV 执行颜色检测。我们使用图像并检测到与绿色匹配的部分。
有几个与此相关的步骤。我们需要将图像转换为正确的 HSV 颜色空间并为所需颜色创建遮罩。
然后我们需要过滤掉这个面具的噪音。然后将此掩码与原始图像一起使用以分割检测到的部分,并在其上绘制边界。
Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.
LinkedIn