openCV (iOS)中顏色空間轉換cvtColor()

一個蘿蔔壹個坑發表於2017-12-27

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

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

引數解釋:

(1)InputArray src: 輸入影象即要進行顏色空間變換的原影象,可以是Mat類

(2)OutputArray dst: 輸出影象即進行顏色空間變換後儲存影象,也可以Mat類

(3)int code: 轉換的程式碼或標識,即在此確定將什麼制式的圖片轉換成什麼制式的圖片,後面會詳細將

(4)int dstCn = 0: 目標影象通道數,如果取值為0,則由src和code決定

函式的作用是將一個影象從一個顏色空間轉換到另一個顏色空間,但是從RGB向其他型別轉換時,必須明確指出影象的顏色通道,前面我們也提到過,在opencv中,其預設的顏色制式排列是BGR而非RGB。所以對於24位顏色影象來說,前8-bit是藍色,中間8-bit是綠色,最後8-bit是紅色。常見的R,G,B通道的取值範圍為:

. 0-255 :CV_8U型別圖片

. 0-65535: CV_16U型別圖片

. 0-1: CV_32F型別圖片

對於線性變換來說,這些取值範圍是無關緊要的。但是對於非線性轉換,輸入的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型別同時列出,以供參考:

openCV (iOS)中顏色空間轉換cvtColor()

上圖中出現的RGBA格式圖片,RGBA是代表Red(紅色)、Green(綠色)、Blue(藍色)和Alpha的色彩空間。雖然它有時候被描述為一個顏色空間,但是它其實是RGB模型附加了額外的資訊,可以屬於任何一種RGB顏色空間。Alpha引數一般用作不透明度引數,如果一個畫素的alpha通道數值為0%,那它就是完全透明的也就是肉眼不可見,而數值為100%則意味著一個完全不透明的畫素,傳統的數字影象就是alpha值為100%.

程式碼實現

NSString *image = @"456.png";

UIImage *image1 = [UIImage imageNamed:image];

//  Mat im = [self cvMatFromUIImage:image1];

Mat im;

UIImageToMat(image1, im);

if (im.empty()) {

return;

}

Mat grayImage;

cvtColor(im, grayImage,CV_BGR2GRAY);//COLOR_BGR2HSV

self.secondImageView.image = MatToUIImage(grayImage);

效果

openCV (iOS)中顏色空間轉換cvtColor()

相關文章