更改色彩空间

优质
小牛编辑
126浏览
2023-12-01

一、目标

  • 在本教程中,您将学习如何将图像从一个颜色空间转换为另一个颜色空间,如BGR <-> leftrightarrow Gray, BGR <-> leftrightarrow HSV等。
  • 除此之外,我们还将创建一个提取视频中彩色对象的应用程序
  • 您将学习以下函数:cv2.cvtColor(), cv2.inRange()等。

二、改变颜色空间

OpenCV中有150多种颜色空间转换方法。但我们将只研究两种最广泛使用的产品,BGR <-> GrayBGR <-> HSV

对于色变换,我们使用cv2.cvtColor(input_image, flag)功能,其中flag转换的类型。

对于BGR -> Gray转换,我们使用标志cv2.COLOR_BGR2GRAY。同样对于BGR -> HSV,我们使用标志cv2.COLOR_BGR2HSV。要获取其他标志,只需在Python终端中运行以下命令:

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

注意

对于HSV,色调范围是[0,179],饱和范围是[0,255],值范围是[0,255]。不同的软件使用不同的规模。因此,如果要将OpenCV值与它们进行比较,则需要对这些范围进行标准化。

三、对象跟踪

现在我们知道如何将BGR图像转换为HSV,我们可以使用它来提取彩色对象。在HSV中,表示颜色比RGB颜色空间更容易。在我们的应用程序中,我们将尝试提取蓝色对象。所以这是方法:

  • 拍摄视频的每一帧
  • 从BGR转换为HSV颜色空间
  • 我们将HSV图像阈值为一系列蓝色
  • 现在单独提取蓝色对象,我们可以对我们想要的图像做任何事情。

以下是详细评论的代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # Take each frame
    _, frame = cap.read()

    # Convert BGR to HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # Threshold the HSV image to get only blue colors
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Bitwise-AND mask and original image
    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值,而不是传递图像。例如,要查找GreenHSV值,请在Python终端中尝试以下命令:

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

现在分别将[H-10, 100,100][H+10, 255, 255]作为下限和上限。除了这种方法,您可以使用任何图像编辑工具,如GIMP或任何在线转换器来查找这些值,但不要忘记调整HSV范围。

五、其他资源

练习
1、尝试找到一种方法来提取多个彩色物体,例如,同时提取红色,蓝色,绿色物体。