OpenCV的cvtColor()讓影像在不同色彩空間之中轉換,由於OpenCV從外界讀入圖檔時,比如使用imread()讀取JPEG檔時,Mat內存為BGR而不是RGB格式,所以輸入參數通常使用CV_BGR2XXX、CV_XXX2BGR,代表從BGR色彩空間轉到其他色彩空間,或從其他色彩空間轉到BGR色彩空間,依此類推,CV_RGB2XXX代表從RGB色彩空間轉到其他色彩空間,通常較少使用。
內文索引 [隱藏]
OpenCV 色彩空間轉換
cvtColor(const Mat& src, Mat& dst, int code)
- src:來源圖,支援 CV_8U、CV_16U、或 CV_32F位元深度,1、3、4通道的圖,有些色彩空間轉換無法在16位元上操作,使用前可參考文件。
- dst:目標圖,尺寸大小、深度會和來源圖相同。
- code:指定在何種色彩空間轉換,比如CV_BGR2GRAY、CV_GRAY2BGR、CV_BGR2HSV等。
BGR & Gray
參數:CV_BGR2GRAY、CV_RGB2GRAY、CV_GRAY2BGR、CV_GRAY2RGB
BGR to Gray: Y=0.299R + 0.587G + 0.114*B
Gray to BGR: B=Y,G=Y,R=Y
人眼對綠色的敏感感較大,而對藍色最小,因此綠色權重較大,藍色較小,上述公式為彩色轉灰階的標準。
BGR & YCrCb
參數:CV_BGR2YCrCb、CV_RGB2YCrCb、CV_YCrCb2BGR、CV_YCrCb2RGB
BGR to YCrCb: Y=0.299R + 0.587G + 0.114B,Cr=(R-Y)0.713 + delta,Cb=(B-Y)*0.564 + delta
YCrCb to BGR: R=Y + 1.403(Cr-delta),G=Y – 0.714(Cr-delta) – 0.344(Cb-delta),B=Y + 1.773(Cb-delta)
delta:8位元->128,16位元->32768,浮點數->0.5
其中 Y 是亮度(Luminance),Cb、Cr 是色差(chrominance),Cb是藍色色差 ,Cr是紅色色差,雖然RGB與YCbCr都為三個通道無法節省儲存空間,但實際上可利用人類視覺對亮度比較敏感,而對彩度比較不敏感的特質來減少內存,也就是減少Cb、Cr的取樣個數。取樣格式有4:2:0、4:2:2、4:4:4三種,4:2:0格式代表每2×2的4個像素中,Y 會對每個像素取樣,而色差 CbCr 僅會在第一行兩個像素的中間取樣,因此8位元情況下,原本每個像素需要3byte儲存空間,4個像素需要12個byte,現在只要6個byte,減少了一半的內存,現今像Jpeg、Mpeg4等影像格式,都是利用YCbCr去壓縮的。
BGR & HSV
HSV(hue、saturation、value)用來表示色相、飽和度和明度,這種系統比RGB更接近人對色彩的感知,色相決定顏色的本質,像我們說紅、澄、黃就是指一種色相,飽和度是指顏色的深淺比例,顏色越深飽和度越高,白色所占比例越高,飽和度越低,明度表示顏色的明暗程度,數值越大越亮。
參數:CV_BGR2HSV、CV_RGB2HSV、CV_HSV2BGR、CV_HSV2RGB
BGR to HSV:當我們計算8位元或16位元圖時,R、G、B都轉成0到1之間的浮點數,比如R=R/(R+G+B),接著用下列公式進行轉換,分別得到H、S、V的值。
如果H<0,則H=H+360,讓H範圍0到360,S範圍0到1,V範圍0到1,接著根據圖的形態,轉換到合適的範圍。8位元:H=H/2,S=S255,V=V255。16位元:H=H,S=S65535,V=V65535。浮點數圖:維持不變。
BGR & HSL
HSL(hue、saturation、lightness)用來表示色相、飽和度和亮度,這種系統比RGB更接近人對色彩的感知,色相決定顏色的本質,像我們說紅、澄、黃就是指一種色相,飽和度是指顏色的深淺比例,顏色越深飽和度越高,白色所占比例越高,飽和度越低,亮度表示顏色的明暗程度,數值越大越亮。
參數:CV_BGR2HLS、CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB
BGR to HSV:當我們計算8位元或16位元圖時,R、G、B都轉成0到1之間的浮點數,比如R=R/(R+G+B),接著用下列公式進行轉換,分別得到H、S、L的值。
如果H<0,則H=H+360,讓H範圍0到360,S範圍0到1,L範圍0到1,接著根據圖的形態,轉換到合適的範圍。8位元:H=H/2,S=S255,L=L255。16位元:H=H,S=S65535,L=L65535。浮點數圖:維持不變
BGR & CIE XYZ
在CIE XYZ色彩空間中,有一組X、Y和Z的值,對應於紅色、綠色和藍色,並不是真的紅藍綠,而是使用匹配函數來計算出來。
參數:CV_BGR2XYZ、CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB
BGR & CIE Lab*
參數:CV_BGR2Lab、CV_RGB2Lab、CV_Lab2BGR、CV_Lab2RGB
Lab色彩空間是顏色-對立空間,帶有維度L表示亮度,a和b表示顏色對立維度,基於非線性壓縮的CIE XYZ色彩空間坐標,Lab顏色被設計來接近人類視覺,致力於感知均勻性,L分量密切匹配人類亮度感知,因此可以被用來通過修改a和b分量的輸出色階來做精確的顏色平衡,或使用L分量來調整亮度對比。當我們計算8位元或16位元圖時,R、G、B都轉成0到1之間的浮點數,比如R=R/(R+G+B),接著用下列公式進行轉換,分別得到L、a、b的值。
最後L範圍0到100,a範圍-127到127,b範圍-127到127,接著根據圖的形態,轉換到合適的範圍。8位元:L=L*255/100,a=a+128,b=b+128。16位元:目前不支援。浮點數圖:維持不變。
BGR & CIE Luv*
參數:CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB
當我們計算8位元或16位元圖時,R、G、B都轉成0到1之間的浮點數,比如R=R/(R+G+B),接著用下列公式進行轉換,分別得到L、a、b的值。
最後L範圍0到100,u範圍-134到220,v範圍-140到122,接著根據圖的形態,轉換到合適的範圍。8位元:L=L255/100,u=255/354(u+134),v=255/262*(v+140)。16位元:目前不支援。浮點數圖:維持不變。
转自:http://monkeycoding.com/?p=690