OpenCV C++教程目录
1.在Windows Visual Studio中安装OpenCV C++版本
2.图像的基本操作
3.颜色空间转换
4.阈值分割
5.图像变换(缩放、裁剪、仿射变换)
6.图像滤波
7.Canny边缘检测
8.轮廓检测
9.透视变换(perspective transform)
10.光流
今天我们来学习OpenCV中图像的颜色空间转换。内容如下:
- 常用颜色空间 - RGB/YUV/HSV
- 灰度图转换
1.常用颜色空间 - RGB/YUV/HSV
颜色通常用三个独立的属性来描述,用不同的变量来表示一个独立属性,就构成一个空间坐标,这就是颜色空间。
RGB
在RGB颜色空间中,任意色光F都可以用R、G、B三色不同分量的相加混合而成:F=r[R]+r[G]+r[B]。当三基色分量都为时混合为黑色光。当三基色都为最大(值由存储空间决定)时混合为白色光。RGB色彩空间根据每个分量在计算机中占用的存储字节数的不同,可以用不同的表示方法,常见的有:
- RGB565
16位的RGB格式R占用5位,G占用6位,B占用5位。 - RGB888/RGB24
24位的RGB格式, 各个分量分别占据8位。 -
RGB32/RGBA8888
32位的RGB格式,各分量占用8位,剩下的8位用作Alpha通道。
RGB是非常经典的颜色空间表示方法,在电子计算机和显示器中广泛被使用。但是RGB并不适应人的视觉特点。因此产生了其它不同的色彩空间表示法。
YUV
YUV(又叫做YCrCb)中的“Y”表示明亮度(Luma), 也就是灰阶值;而“U”和“V” 表示的则是色度(Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。亮度是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。
人眼对色度的敏感程度低于对亮度的敏感程度。利用这个原理,可以把色度信息减少一点,人眼也无法查觉这一点。例如常用的YUV420,就是对UV分量进行了降采样,从而节省了存储空间。
YUV 4:2:0 并不意味着不采样 V 分量。它指的是对每条扫描线来说,只有一种色度分量以 2:1 的采样率存储,相邻的扫描行存储不同的色度分量。也就是说,如果第一行是 4:2:0,下一行就是 4:0:2,在下一行就是 4:2:0,以此类推。
HSV
HSV模型用色调(hue),饱和度(saturation),亮度(value)表示颜色。它是一种六角锥模型。色调H用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红(洋红)为300°。
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
亮度V表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
OpenCV中使用cvtColor()来进行颜色空间转换。例如:
COLOR_BGR2YCrCb
COLOR_BGR2HSV
COLOR_BGR2GRAY
2.COLOR_BGR2GRAY是常用的转换格式,它将一张彩色图片转换为灰度图。
cvtColor(Image, grayImage, cv::COLOR_BGR2GRAY);
以下为转换前和转换后的结果: