【OpenCV图像处理】色彩空间变换

图像色彩空间变换OpenCV官网文档

目标:

  • 通过本文,你可以学习如何将图像从一种彩色空间转换到另外一种,比如BGR和GRAY,BGR和HSV互换
  • 在此基础上,我们会创建一个能从视频图像中提取特定色彩目标的应用
  • 你将会学到下函数:cv2.cvtColor(),cv2.inRange()等

转换色彩空间

在OpenCV里总共有150种色彩空间转换方法,但是我们只探索其中最常用的两种,BGR 和Gray ,BGR 和 HSV互换

我们使用cv2.cvtColor(input_image,flag)函数来转换图像色彩,参数flag决定了转换的类型。

我们可以设定flag=cv2.COLOR_BGR2GRAY进行BGR图像到Gray图像的变换,类似的将BGR转至HSV,flag=cv2.COLOR_BGR2HSV,想查看其它flag类型可以在你的Python终端里使用下列命令:

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

提示:对于HSV,H范围[0,179],S[0,255],V[0,255]

目标跟踪

我们学会将BGR图像转换为HSV图像后,我们就可以提取彩色目标了,在HSV空间里,表示一个色彩更加容易。在我们的应用里,我们会尝试提取蓝色目标。下面是提取方法:

  1. 取得图像中的每一帧
  2. 完成BGR到HSV转换
  3. 为HSV图像中的蓝色目标设定色彩范围阈值
  4. 然后提取蓝色目标,做自己的想要的处理

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这里修改了官网的代码
    #将lower_green修改为lower_blue
    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()

下面的图像展示了跟踪蓝色目标的结果
【OpenCV图像处理】色彩空间变换_第1张图片

  • 注意:图像中有噪声点,我们在之后的篇章会讲如何消除它,这只是目标追踪最简单的方法。等你学了轮廓函数,你可以做更多更有意思的事。

怎样设置用来跟踪的HSV色彩值?

这是一个在stackoverflow.com上常见的问题,这很简单,你可以同样使用cv2.cvtColor()。除了传递图像参数,你也可以仅仅传递一个色彩值。例如,找到HSV对应的绿色,你可以试试下面的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或者其它在线转换器来查找此类色彩,但是别忘了调整范围。

你可能感兴趣的:(【OpenCV图像处理】色彩空间变换)