OpenCV-Python学习笔记(六):颜色空间转换(Changing Colorspaces)

OpenCV 图像处理之颜色空间转换
目标
• 你将学习如何对图像进行颜色空间转换,比如从 BGR 到灰度图,或者从BGR 到 HSV 等。
• 我没还要创建一个程序用来从一幅图像中获取某个特定颜色的物体。
• 我们将要学习的函数有: cv2.cvtColor(), cv2.inRange() 等。

1.转换颜色空间


在 OpenCV 中有超过 150 种进行颜色空间转换的方法。但是我们经常用到的也就两种: BGR<-->Gray 和 BGR<-->HSV。
要用到的函数是: cv2.cvtColor(input_image,flag),其中 flag就是转换类型。

对于 BGR->Gray 的转换,我们要使用的 flag 就是 cv2.COLOR_BGR2GRAY
同样对于 BGR->HSV 的转换,我们用的 flag 就是 cv2.COLOR_BGR2HSV。 


注意:在 OpenCV 的 HSV 格式中, H(色彩/色度)的取值范围是 [0, 179],S(饱和度)的取值范围 [0, 255], V(亮度)的取值范围 [0, 255]。但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软件的 HSV 值进行对比时,一定要记得归一化。
 

2 物体跟踪
 

现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在下面的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:

• 从视频中获取每一帧图像
• 将图像转换到 HSV 空间
• 设置 HSV 阈值到蓝色范围。
• 获取蓝色物体,当然我们还可以做其他任何我们想做的事,比如:在蓝色物体周围画一个圈。
代码如下,为简单起见,省略了从视频中获取每一帧图像,直接读入图像:

import cv2
import numpy as np

img = cv2.imread(r'D:\OpenCV_Python\chepai.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)

lower_blue = np.array([120, 100, 100])
upper_blue = np.array([179, 255, 255])


mask = cv2.inRange(hsv, lower_blue, upper_blue)

res = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow('image', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下图:

注意:图像中仍然有一些噪音,我们会在后面的章节中介绍如何消减噪音。


注意:这是物体跟踪中最简单的方法。当你学习了轮廓之后,你就会学到更多相关知识,那是你就可以找到物体的重心,并根据重心来跟踪物体,仅仅在摄像头前挥挥手就可以画出同的图形,或者其他更有趣的事。

3 怎样找到要跟踪对象的 HSV 值?

在上述示例中,我们要用到一个关键的参数,即要跟踪的对象的HSV值,但是怎样找到要跟踪对象的 HSV 值呢?
在OpenCV中,可以这样做:(以标准红绿蓝为例)

import cv2
import numpy as np

“”“
# 注意:下面代码里不能用 [0,255,0],而要用 [[[0,255,0]]]
# 这里的三层括号应该分别对应于 cvArray, cvMat, IplImage
“””

blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print('hsv_blue : ', hsv_blue)

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

red = np.uint8([[[0, 0, 255]]])
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print('hsv_red : ', hsv_red)

 结果如下:

这样,就大概知道了对应HSV的值的范围,现在你可以分别用 [H-100, 100, 100] 和 [H+100, 255, 255] 做上
下阈值。除了这个方法之外,你可以使用任何其他图像编辑软件(例如 GIMP、Photoshop)或者Halcon或者在线转换软件找到相应的 HSV 值,但是最后别忘了调节 HSV 的范围。
 

 这里以OpenCV logo为例,提取其中的蓝色部分:

import cv2
import numpy as np

img = cv2.imread('opencv_logo.jpg')

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_blue = np.array([100, 100, 100])
upper_blue = np.array([140, 255, 255])


mask = cv2.inRange(hsv, lower_blue, upper_blue)

res = cv2.bitwise_and(img, img, mask=mask)

cv2.imshow('image', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果如图:

 

参考文献:《OpenCV-Python 中文教程》(段力辉 译)

图片来源于网络,侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值