OpenCV 08: 改变颜色空间

307 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

目标

  • 在本教程中,将学习如何将图像从一个色彩空间转换到另一个,像BGR↔灰色,BGR↔HSV等
  • 除此之外,将创建一个应用程序,以提取视频中的彩色对象
  • 学习以下函数:cv2.cvtColorcv2.inRange

改变颜色空间

OpenCV中有超过270种颜色空间转换方法。但是我们研究两个最广泛使用的, BGR↔灰色和BGR↔HSV。

对于颜色转换,使用cv2.cvtColor(input_image, flag),其中flag决定转换的类型。

import cv2
flag = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flag)

在这里插入图片描述

在这里插入图片描述

大概274种。

注意 HSV的色相范围为[0,179],饱和度范围为[0,255],透明度值范围为[0,255]。不同的软件使用不同

的规模。因此,如果要将OpenCV值和它们比较,需要将这些范围标准化。

img = cv2.imread('messi.png')
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', img_hsv)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述 在这里插入图片描述

对象追踪

现在知道了如何将BGR图像转换成HSV,可以使用它来提取一个有颜色的对象。在HSV中比在BGR颜色空间中更容易表示颜色。在应用程序中,将尝试提取一个蓝色的对象的一个简单例子。方法如下: 取视频的每一帧 - 转换从BGR到HSV颜色空间 - 对HSV图像设置蓝色范围的阈值 - 现在单独提取蓝色对象,可以对图像做任何想做的事情。

import cv2
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # 读取帧
    _, frame = cap.read()
    # 转换颜色空间 BGR 到 HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    # 定义HSV中蓝色的范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # 设置HSV的阈值使得只取蓝色
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
    # 将掩膜和图像逐像素相加
    res = cv2.bitwise_and(frame,frame, mask= mask)
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

在这里插入图片描述

注意 图像中有一些噪点。将在后面的章节中看到如何删除它们。 这是对象跟踪中最简单的方法。一旦学习了轮廓,就可以做很多事情,例如找到该对象的质心并使用它来跟踪对象,仅通过将手移到相机前面以及其他许多有趣的东西就可以绘制图表。

如何找到要追踪的HSV值

这是在stackoverflow.com上发现的一个常见问题。它非常简单,你可以使用相同的函数

cv2.cvtColor()。只需传递你想要的BGR值,而不是传递图像。例如,要查找绿色的HSV值,

请在Python终端中尝试以下命令:

green = np.uint8([[[0,255,0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv_green)

# [[[ 60 255 255]]]

现在把 [10,100,100] 和 [10,255, 255] 分别作为下界和上界。除了这个方法之外,可以使用任何图像编辑工具(如GIMP或任何在线转换器)来查找这些值,但是不要忘记调整HSV范围。