一、学习目标
- 了解什么是色彩空间
- 了解opencv中色彩空间的转换
二、了解OpenCV中常见的色彩空间
2.1 什么是色彩空间
色彩空间又可以叫做色域,英文是Color Sapce,是一种人为建立,用于表示色彩的一种“坐标系统”,或者说是一种色彩访问的取值系统,用于描述色彩。了解色彩空间对我们今后使用opencv进行图像处理很重要,在今后对图像处理时将会涉及到色彩空间的内容,所以学习了解色彩空间是有必要的。
2.2 RGB颜色空间
首先我们了解RGB颜色空间,RGB颜色空间常用于显示器。我们在之前的学习中,已经了解了计算机中的图片也是由RGB值进行描述的。RGB利用了三种物理学中的三原色,相互进行叠加融合,生成各式各样的颜色,最终构成一张多彩图像。
在RGB中,三种颜色每种都有一个通道,并且值小,则越黑,值大则越亮。我们在之前的学习中,通过实践已经知道通道都为0则为黑,通道都为255则为白,取中间值147则为灰,这也是由于“值小,则越黑,值大则越亮”这个原因。
RGB色彩空间用一个正方体进行描述,这个正方体是笛卡尔积。笛卡尔积是指两个集合进行相乘而得到的所有有可能的序列,这个序列用笛卡尔坐标系进行表示。由于在opencv中,RGB的数据类型为uint8,那么就可以有256256256=16777216种颜色,这些颜色都在这个笛卡尔坐标系中进行表示。
以下是RGB的色彩空间图,图片来源于网络。
以上图只能查看一面,其实在该立方体中,有3个定点表示三原色,也就是红、绿、蓝;还有3个顶点表示品红、黄以及青;与原点(0,0)距离最远的顶点颜色为白色,其中灰度则为黑色顶点与白色顶点形成的连线的横纵竖坐标数值大小相等的位置。
2.3 HSV颜色空间
HSV颜色空间是一种表示色调、饱和度以及亮度的颜色空间,其中H(hue)指的是色调,就是平常一些颜色,如黄色、绿色、红色等;S(saturation)指的是饱和度、V(value)指的是亮度。HSV是一种更接近于人类感知的一种颜色空间,它是根据人对色彩的观察从而产生的。
其中H色调是描述纯色,S饱和度是与白光叠加后的描述。
以下是HSV的色彩空间图,图片来源于网络。
从图中得知,色调Hue的取值为0到360,但是在opencv中取值为0-180,这点是有一定区别;S饱和度S取值范围为0.0~1.0,在opencv中取值为0-255;V亮度取值范围为0.0-1.0,在opencv在opencv中取值为0-255,0则是为黑,255则是为白。从图中我们可以得知,Value值越小则越黑,Hue则是色彩范围,S则是值越大颜色更加纯。
有一个与HSV非常相似的色彩空间,名为HSL。HSL中的L则表示为Lightness,两者类似在此不做过多讲解。
2.4 YUV颜色空间
YUV是一种色彩的编码方式,其中Y表示明亮度、U是色度、V是浓度,U和V决定了颜色。YUV一般用于优化视频信号,如彩色视频信号的传输,使信号能够与老式的黑白电视进行兼容,并且可以在传输时极大的减少频宽。
以下是YUV的色彩空间图,图片来源于网络。
2.5 opencv 色彩空间的相互转换
在opencv中,提供了图像对于不同色彩空间的转换方法,我们可以通过这些方法对图像进行不同色彩空间的转化。首先我们需要读取一张图片。代码如下:
代码语言:javascript复制import cv2
img = cv2.imread(r'C:UsersmxDesktop1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_AUTOSIZE)
cv2.imshow("Image", img)
随后我们通过cvColor方法对图片进行不同色彩空间的转换。cvColor方法接收4个参数,在此讲解此节所用到的2个参数,这两个参数分别是src与dst;src指输入的图像,类型为Array;dst指输入的图像需要转换成的色彩空间。我们首先尝试将改图片转换为HSV色彩空间图。COLOR_BGR2HSV为转换为HSV色彩空间。我们在以上代码末行加入以下代码:
代码语言:javascript复制hsvImage=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow("hsvImage", hsvImage)
cv2.waitKey (0)
cv2.destroyAllWindows()
我们接着添加转换各个色彩空间,查看效果,整体代码如下:
代码语言:javascript复制import cv2
img = cv2.imread(r'C:UsersmxDesktop1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("hsvImage",cv2.WINDOW_NORMAL)
cv2.namedWindow("COLOR_BGR2YUV",cv2.WINDOW_NORMAL)
cv2.namedWindow("COLOR_BGR2GRAY",cv2.WINDOW_NORMAL)
hsvImage=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)#BGR to HSV
COLOR_BGR2YUV=cv2.cvtColor(img,cv2.COLOR_BGR2YUV)#BGR to YUV
COLOR_BGR2GRAY=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#BGR to GRAY
cv2.imshow("Image", img)
cv2.imshow("hsvImage", hsvImage)
cv2.imshow("YUV", COLOR_BGR2YUV)
cv2.imshow("GRAY", COLOR_BGR2GRAY)
cv2.waitKey (0)
cv2.destroyAllWindows()
运行结果如下: GRAY灰度:
HSV:
YUV:
该系列文章首发于易百纳
三、总结
- 了解色彩空间是一种对色彩的描述标准
- 了解常见色彩空间RGB、HSV、YUV
- 了解使用opencv对图片实现不同色彩空间的转换
- 了解了色彩空间各个取值对色彩的影响