图像色彩空间变换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空间里,表示一个色彩更加容易。在我们的应用里,我们会尝试提取蓝色目标。下面是提取方法:
- 取得图像中的每一帧
- 完成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这里修改了官网的代码
#将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()
下面的图像展示了跟踪蓝色目标的结果
- 注意:图像中有噪声点,我们在之后的篇章会讲如何消除它,这只是目标追踪最简单的方法。等你学了轮廓函数,你可以做更多更有意思的事。
怎样设置用来跟踪的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或者其它在线转换器来查找此类色彩,但是别忘了调整范围。