彩色空间及cvtColor解析

首先,我们要了解:什么是彩色空间呢?
许多人都知道在绘画时可以使用红色、黄色和蓝色这三种原色生成不同的颜色,这些颜色就定义了一个色彩空间。我们将品红色的量定义为X 坐标轴、青色的量定义为Y坐标轴、黄色的量定义为Z坐标轴,这样就得到一个三维空间,每种可能的颜色在这个三维空间中都有唯一的一个位置。
但是,这并不是唯一的一个色彩空间。例如,当在计算机监视器上显示颜色的时候,通常使用RGB(红色、绿色、蓝色)色彩空间定义,这是另外一种生成同样颜色的方法,红色、绿色、蓝色被当作X、Y和Z坐标轴。另外一个生成同样颜色的方法是使用色相(X轴)、饱和度(Y轴)和明度(Z轴)表示,这种方法称为HSB色彩空间。另外还有许多其它的色彩空间,许多可以按照这种方法用三维(X、Y、Z)、更多或者更少维表示,但是有些根本不能用这种方法表示。


彩色空间及cvtColor解析_第1张图片

下面介绍几种常用的彩色空间:

一、利用原色相混的比例表示的彩色空间

RGB(三原色光模式)采用加法混色法,因为它是描述各种“光”通过何种比例来产生颜色。光线从暗黑开始不断叠加产生颜色。RGB描述的是红绿蓝三色光的数值。RGBA是在RGB上增加阿尔法通道实现透明效果。基于RGB模式的普通色彩空间有sRGB, Adobe RGB和Adobe Wide Gamut RGB。

CMYK(印刷四分色模式)印刷过程中使用减法混色法,因为它描述的是需要使用何种油墨,通过光的反射显示出颜色。它是在一种白色介质(画板,页面等)上使用油墨来体现图像。CMYK描述的是青,品红,黄和黑四种油墨的数值。根据不同的油墨,介质,和印刷特性,存在多种CMYK色彩空间。(可以通过色点扩张或者转换各种油墨数值从而得到不同的外观)。

彩色空间及cvtColor解析_第2张图片

二、利用不同的概念表示的彩色空间
HSV
 (色相hue, 饱和度saturation, 明度value),也称HSB (B指brightness)是艺术家们常用的,因为与加法减法混色的术语相比,使用色相,饱和度等概念描述色彩更自然直观。HSV是RGB色彩空间的一种变形,它的内容与色彩尺度与其出处——RGB色彩空间有密切联系。将RGB转换为HSV的函数是rgb2hsv;

HSV的彩色模型可以用一个圆柱体和展开的圆柱表示,如下图:

彩色空间及cvtColor解析_第3张图片
HSI (色相hue,饱和度saturation,饱和度intensity),也称HSL。该模型将亮度分量与一幅彩色图像中携带的彩色信息分开。因此,HSI模型对于开发基于彩色描述的图像处理算法是一个理想的工具,对人类来说,它们看起来更加自然和直观。

三、不同彩色空间之间的转换

对于彩色图象分割而言,有时需要将RGB变换为HSI坐标,以便反映人类观察彩色的方式,转换公式如下:

彩色空间及cvtColor解析_第4张图片


了解了彩色空间以后,我们就来看一看OpenCV函数里面的cvtColor函数:

函数作用:Converts an image from one color space to another.

C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

C: void cvCvtColor(const CvArr* src, CvArr* dst, int code)
Parameters:  
src – input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ), or single-precision floating-point.
dst – output image of the same size and depth as src.
code – color space conversion code (see the description below).

dstCn – number of channels in the destination image; if the parameter is 0, the number of the channels is derived automatically from src and code .

在OpenCV里面RGB的通道顺序是B、G、R。因此在一个标准(24位)的彩色图像中第一8位就是Blue component,然后是Green, 第三个是Red。而第4、5、6 bytes would then be the second pixel (Blue, then Green, then Red), and so on.

R G B各通道值得范围如下:

  • 0 to 255 for CV_8U images
  • 0 to 65535 for CV_16U images
  • 0 to 1 for CV_32F images

关于cvtColor的源代码,原本我是想贴上去,但是~太长了将近3000行,看的人晕头转向,需要研究的请下载!!

一个应用:

[cpp]  view plain  copy
 
  1. #include   
  2. #include   
  3. #include   
  4. using namespace cv;  
  5. using namespace std;  
  6.   
  7. int main(){  
  8.     string imgpath = "E:\\快盘\\娱乐生活\\素材\\GEM.jpg";  
  9.     Mat img = imread(imgpath);  
  10.     Mat outimg;  
  11.     if (img.empty())  
  12.     {  
  13.         cout<<"Can not load the image!";  
  14.     }  
  15.     imshow("image",img);  
  16.     cvtColor(img,outimg,CV_BGR2GRAY);  
  17.     imshow("Gray",outimg);  
  18.     waitKey();  
  19.     return 0;  
  20. }  

彩色空间及cvtColor解析_第5张图片

你可能感兴趣的:(openCV,opencv,cvtColor)