色彩空間轉換(cvtColor)

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的值。

HSV

如果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的值。

HSL

如果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

CIE XYZ


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的值。

CIE 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位元:目前不支援。浮點數圖:維持不變。

enter image description here

回到首頁

回到OpenCV教學


參考資料:

OpenCV 教程

CIE 1931色彩空間

Lab色彩空間