3-1 改变色度空间—OpenCV-Python教程翻译

本文介绍如何使用OpenCV进行色彩空间变换,并演示了从视频中提取特定颜色对象的应用实例,包括BGR到HSV的转换及目标追踪的技术细节。

目标

  • 在这一节中,将要学习如何将一张图像从一个色度空间变换到另一个,例如BGR-Gray,BGR-HSV等
  • 将创建一个应用从一个视频中抽取一个有颜色的对象
  • 掌握函数:cv2.cvtColor(), cv2.inRange()等

变换色度空间

在OpenCV中,提供了超过150种色度空间变换方法。但是这里我们将只学习两种最常用的变换,BGR-Gray和BGR-HSV。

对于图像转换,我们使用函数cv2.cvtColor(input_image, flag),其中flag确定转换类型。

对于BGR—>Gray变换,我们使用标志符cv2.COLOR_BGR2GRAY。相似地,对于BGR—>HSV,我们使用标识符cv2.COLOR_BGR2HSV。如果要获得所有的标识符,我们可以在Python终端中输入下面的命令。

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

注意:对于HSV空间,色相范围为[0, 179],饱和度范围为[0, 255],强度值范围为[0, 255]。不同的软件会使用不同的范围,因此,如果我们和其他软件对比OpenCV的时候,最好将这些范围归一化。

目标追踪

现在我们已经知道了如何将一个BGR图像转换为HSV图像了,那我们可以使用这个功能去提取一个有颜色的对象。在HSV空间中,会比BGR颜色空间更加容易表示一种颜色。在这个应用中,我们将提取出一个蓝色物体。具体方法如下:

  • 从视频中提取一帧图像
  • 从BGR空间变换到HSV空间
  • 对HSV图像进行阈值分割,分割范围为蓝色
  • 单独提取出蓝色物体

代码如下:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # 提取每一帧
    _, frame = cap.read()
    # 从BGR变换为HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 在HSV中定义蓝色范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # 根据给定的蓝色范围对HSV图像进行阈值分割
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND掩膜与原始图像
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

下图是追踪蓝色物体的结果

 注意:在图像中有一些噪声,后面的章节中将学习如何去除噪声。这是追踪对象的最简单的方法,如果你学习了边缘函数,则可以实现其他很多功能,比如找到一个物体的中心,追踪对象,在摄像头前仅仅通过移动手来画图等。

如何找到用来追踪的HSV值?

同样使用函数cv2.cvtColor(),这里不是传递一张图片,而是传递你想要的BGR值。例如,如果要找到绿色的HSV值,可以使用下面的命令:

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

接下来,可以将[H-10, 100,100]和[H+10, 255, 255]分别作为下边界和上边界。除了这个方法外,你也可以使用其他任意的图像编辑工具比如GIMP,或者在线工具转换这些值,但是要注意调整HSV范围。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值