彩色空間及cvtColor解析

首先,我們要了解:什麼是彩色空間呢?
許多人都知道在繪畫時可以使用紅色、黃色和藍色這三種原色生成不同的顏色,這些顏色就定義了一個色彩空間。我們將品紅色的量定義爲X 座標軸、青色的量定義爲Y座標軸、黃色的量定義爲Z座標軸,這樣就得到一個三維空間,每種可能的顏色在這個三維空間中都有唯一的一個位置。
但是,這並不是唯一的一個色彩空間。例如,當在計算機監視器上顯示顏色的時候,通常使用RGB(紅色、綠色、藍色)色彩空間定義,這是另外一種生成同樣顏色的方法,紅色、綠色、藍色被當作X、Y和Z座標軸。另外一個生成同樣顏色的方法是使用色相(X軸)、飽和度(Y軸)和明度(Z軸)表示,這種方法稱爲HSB色彩空間。另外還有許多其它的色彩空間,許多可以按照這種方法用三維(X、Y、Z)、更多或者更少維表示,但是有些根本不能用這種方法表示。



下面介紹幾種常用的彩色空間:

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

RGB(三原色光模式)採用加法混色法,因爲它是描述各種“光”通過何種比例來產生顏色。光線從暗黑開始不斷疊加產生顏色。RGB描述的是紅綠藍三色光的數值。RGBA是在RGB上增加阿爾法通道實現透明效果。基於RGB模式的普通色彩空間有sRGB, Adobe RGB和Adobe Wide Gamut RGB。

CMYK(印刷四分色模式)印刷過程中使用減法混色法,因爲它描述的是需要使用何種油墨,通過光的反射顯示出顏色。它是在一種白色介質(畫板,頁面等)上使用油墨來體現圖像。CMYK描述的是青,品紅,黃和黑四種油墨的數值。根據不同的油墨,介質,和印刷特性,存在多種CMYK色彩空間。(可以通過色點擴張或者轉換各種油墨數值從而得到不同的外觀)。


二、利用不同的概念表示的彩色空間
HSV
 (色相hue, 飽和度saturation, 明度value),也稱HSB (B指brightness)是藝術家們常用的,因爲與加法減法混色的術語相比,使用色相,飽和度等概念描述色彩更自然直觀。HSV是RGB色彩空間的一種變形,它的內容與色彩尺度與其出處——RGB色彩空間有密切聯繫。將RGB轉換爲HSV的函數是rgb2hsv;

HSV的彩色模型可以用一個圓柱體和展開的圓柱表示,如下圖:


HSI (色相hue,飽和度saturation,飽和度intensity),也稱HSL。該模型將亮度分量與一幅彩色圖像中攜帶的彩色信息分開。因此,HSI模型對於開發基於彩色描述的圖像處理算法是一個理想的工具,對人類來說,它們看起來更加自然和直觀。

三、不同彩色空間之間的轉換

對於彩色圖象分割而言,有時需要將RGB變換爲HSI座標,以便反映人類觀察彩色的方式,轉換公式如下:



瞭解了彩色空間以後,我們就來看一看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
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <opencv.hpp>  
  3. #include <string>  
  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. }  

發佈了8 篇原創文章 · 獲贊 18 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章