opencv颜色空间转换

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()

opencv颜色空间转换_第1张图片

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范围

你可能感兴趣的:(opencv颜色空间转换)