天天看點

opencv學習(十六)之顔色空間轉換cvtColor()

我們生活中大多數看到的彩色圖檔都是RGB類型,但是在進行圖像處理時,需要用到灰階圖、二值圖、HSV、HSI等顔色制式,opencv提供了cvtColor()函數來實作這些功能。首先看一下cvtColor函數定義:

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

參數解釋:

. InputArray src: 輸入圖像即要進行顔色空間變換的原圖像,可以是Mat類

. OutputArray dst: 輸出圖像即進行顔色空間變換後存儲圖像,也可以Mat類

. int code: 轉換的代碼或辨別,即在此确定将什麼制式的圖檔轉換成什麼制式的圖檔,後面會詳細将

. int dstCn = 0: 目标圖像通道數,如果取值為0,則由src和code決定 

對于線性變換來說,這些取值範圍是無關緊要的。但是對于非線性轉換,輸入的RGB圖像必須歸一化到其對應的取值範圍來或得最終正确的轉換結果,例如從RGB->L*u*v轉換。如果從一個8-bit類型圖像不經過任何縮放(scaling)直接轉換為32-bit浮點型圖像,函數将會以0-255的取值範圍來取代0-1的取值範圍,是以在使用cvtColor函數之前需要對圖像進行縮放如下:

img *= 1./255;

cvtColor(img, img, CV_BGR2Luv);

如果對8-bit圖像使用cvtColor()函數進行轉換将會由一些資訊丢失。函數可以做下面類型的轉換,需要說明的是在opencv2.x時顔色空間轉換code用的宏定義是CV_字首開頭,而在opencv3.x版本其顔色空間轉換code宏定義更改為COLOR_開頭,而經驗證,2.4.13版本中opencv同僚支援這兩種形式的寫法。故下面表格會将兩種code類型同時列出,以供參考: