我們生活中大多數看到的彩色圖片都是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類型同時列出,以供參考:
需要注意的是cvtColor()函數不能直接將RGB圖像轉換為二值圖像(Binary Image),需要借助threshold()函數,其具體用法請查閱threshold().