RGB颜色空间基于对红,绿,蓝三原色的使用。这些颜色被选中是因为当它们结合在一起时,可以生成广阔色域中的颜色。RGB空间通常是在数字图像领域的默认颜色空间,因为这正是它们获取的方式。捕获的光线穿过红绿蓝虑光器。此外,在数字图像中,红色,绿色,蓝色通道经过调整,当它们的量相等时,能够得到一个灰度强度,即从黑色(0,0,0)到白色(255,255,255)。不幸的是,使用RGB颜色空间来计算颜色之前的距离并不是衡量颜色相似度最好的方法。因为RGB并不是一个感知上均匀分布分色彩空间,这意味着在相同的距离下,两个颜色可能看起来非常相似,而另外两个颜色去截然不同。
这时候就需要颜色的空间转换,转换到感知上均匀分布的色彩空间。特别的,CIEL*a*b*就是一个颜色均匀分布分彩色空间。通过转换我们的图像到这个空间,图像像素和目标色之间的欧拉距离在描述颜色的相似性上才有意义。通过使用opencv提供的cv::cvtColor函数来完成。cv::cvtColor(image, convered, CV_BGR2Lab);就可以完成转换。变量convered包含颜色空间转换后的图像。
原理
当图像从一个颜色空间转换到另一个,线性和非线性将作用于每个输入像素,以产生输出像素。输出图像的像素类型将匹配输入图像的像素类型之一。即使大多数时间我们使用的是8位像素,我们仍可以对浮点图像(像素值通常位于0-1.0的小数)或整数图像(像素一般位于0-65535)使用颜色转换,但像素的确切值域取决于特定的颜色空间。例如,在CIE L*a*b*颜色空间,L通道位于0-100,而色度分量a和b则位于-127-127.
opencv提供了最常用的颜色空间。这只是一个传递正确的掩码给opencv函数的问题。YCrCb,该颜色空间用于JPEG压缩。从BGR到YCrCb转换所需要的参数是CV_BGR2YCrCb。注意,三原色红绿蓝可以在RGB次序或BGR次序中使用。
HSV和HLS颜色空间也很有用,因为它们可以分解成色调(Hue)饱和度(Saturation)明度(Value)或亮度(Luminance)分量。对人类而言,用它来描述颜色更加自然。
我们也可以将彩色图像灰度化,输出结果将会是一个单通道的图像:cv::cvtColor(color,gray, CV_BGR2Gray);也可以进行反方向的转换,但是生成的三通道彩色图像中的每个通道都是同样充满着相应灰度图像中的值。