Opencv中有数百种关于在不同色彩空间之间转换的方法。当前,在计算机视觉中有三种常见的色彩空间:灰度,BGR以及HSV(Hue:色调,Saturation:饱和度,Value:黑暗的程度)
1).灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测。
2).BGR,即蓝-绿-红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。网页开发者可能熟悉另一个与之相似的颜色空间:RGB,它们只是在颜色的顺序上不同。
3).HSV,H(Hue)是色调,S(Saturation)是饱和度,V(Value)表示黑暗的程度(或光谱另一端的明亮程度)
BGR的简短说明:当第一次处理BGR色彩空间时,可以不要其中的一个色彩分量,比如像素值[0, 255, 255](没有蓝色,绿色分量取最大值,红色分量取最大值)表示黄色。
PS:计算机所使用的颜色模型具有可加性并且处理的是光照,而绘画遵从的是减色模型,计算机使用显示器发光来做颜色的媒介,故计算机上的软件使用的是加色模型。
1.转换颜色空间
在 OpenCV 中有 超过百种进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。
我们用到的函数是cv2.cvtColor(input_imageflag),其中flag就是转换类型。
对于BGR↔Gray的转换,我们使用的flag就是cv2.COLOR_BGR2GRAY。
同样对于BGR↔HSV的转换我们用的flag就是cv2.COLOR_BGR2HSV。
import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(len(flags)) #274
PS:在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179], S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。但是不同的软件使用的值可能不同。所以当你拿 OpenCV 的 HSV 值与其他软件的 HSV 值对比时,一定要记得归一化。
2.目标跟踪(针对颜色)cv2.inRange() cv2.bitwise_and()
现在我们知道如何将BGR图像转换为HSV,我们可以使用它来提取彩色对象。在HSV中,表示颜色比表示RGB颜色空间更容易。在我们的应用程序中,我们将尝试提取蓝色对象。下面是方法:
import cv2
import numpy as np
img = cv2.imread('pinggai.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #转换到HSV
#设定蓝色的阀值
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
#根据阀值构建掩模
mask = cv2.inRange(hsv,lower_blue,upper_blue)
#对原图和掩模进行位运算
res = cv2.bitwise_and(img,img,mask,mask)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
k = cv2.waitKey()
cv2.destroyAllWindows()
PS:噪点还是很多,想啊哟更好看点,需要消减噪音
3.找到要跟踪对象的HSV值
只需传递所需的BGR值,而不是传递图像
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范围
网友评论