RGB與YUV
色彩空間(Color Space)[1]:is a specific organization of colors. In combination with physical device profiling, it allows for reproducible representations of color, in both analog and digital representations. A color space may be arbitrary, with particular colors assigned to a set of physical color swatches and corresponding assigned color names or numbers such as with the Pantone collection, or structured mathematically as with the NCS System, Adobe RGB and sRGB.
色彩模型(Color Model)[1]:is an abstract mathematical model describing the way colors can be represented as tuples of numbers (e.g. triples in RGB or quadruples in CMYK); however, a color model with no associated mapping function to an absolute color space is a more or less arbitrary color system with no connection to any globally understood system of color interpretation. Adding a specific mapping function between a color model and a reference color space establishes within the reference color space a definite "footprint", known as a gamut, and for a given color model this defines a color space.
不同色彩空間的比較
定義色彩空間時,通常使用 CIELAB 或者 CIEXYZ 色彩空間作為參考標准。這兩個色彩空間在設計時便要求包含普通人眼可見的所有顏色。
由於“色彩空間”有着固定的色彩模型和映射函數組合,非正式場合下,這一詞匯也被用來指代色彩模型。這樣的用法嚴格意義上是錯誤的。
1.RGB
RGB色彩空間中的一種顏色是由紅、綠、藍光構成。由R、G、B三個分量組成。RGB顏色分量是跟設備相關的,不論是采集還是顯示。在攝像頭采集中,每個像素的顏色分量不僅取決於場景的顏色和光照,還取決於測量紅、綠藍分量的濾波器的光譜相應。在屏幕顯示中,實際顯示出來的顏色取決於顯示器中紅、綠、藍光源的光譜。(所以,根據所使用的波長不同,可以有許多不同的RGB色彩空間。)
標准的RGB是24bit的,即每個分量8bit。考慮到帶寬限制,也有16bit的RGB,R和B用5bit表示,G用6bit表示(因為人眼對綠色更敏感)。從16bit轉到24bitRGB,不是添加0,而是添加2位(G)或3位(R、B)最高有效位。
為了克服RGB 的設備依賴性,人們又定義了一種不依賴上設備的sRGB,添加了光強與顏色分量數值之間的分線性γ映射。從RGB轉換到sRGB,就是在色彩向量上乘以一個設備相關的紅、綠、藍光譜特性的3x3矩陣。這個變換由標定決定。
常見的RGB格式有RGB888,RGB565,RGB555,RGB24,RGB32(每個分量8比特,剩余8位空着),ARGB32(每個分量8比特,Alpha通道值8bit)等。
RGB的存儲格式通常為BGRBGRBGR的順序。
Bitmap就是在RGB像素數據上加上數據頭形成的文件格式。
2. YUV
YUV is a color encoding system typically used as part of a color image pipeline. It encodes a color image or video taking human perception into account, allowing reduced bandwidth for chrominance components, thereby typically enabling transmission errors or compression artifacts to be more efficiently masked by the human perception than using a "direct" RGB-representation.[2]
Y′UV was invented when engineers wanted color television in a black-and-white infrastructure. They needed a signal transmission method that was compatible with black-and-white (B&W) TV while being able to add color. The luma component already existed as the black and white signal; they added the UV signal to this as a solution.
YUV是被歐洲電視系統所采用的一種顏色編碼方法(屬於PAL,Phase Alternation Line)。(YIQ用於NTSC彩色電視制式,YUV用於PAL制和SECAM彩色電視制式,而YCrCb用於計算機用的顯示器。)
Y代表亮度(Luma,Luminance),UV代表色度(Chroma,Chrominance)。
YUV完全由RGB推到而來,亮度分量Y是RGB分量的組合,顏色分量由差分B-Y,R-Y提供。
二者的轉化公式如下:
ITU-R BT.601定義了如下變量:
歸一化之后的RGB(linear RGB, not gamma corrected RGB or sRGB)轉換到YUV可以表示為:
此時Y、U、V的范圍分別是[0, 1], [−Umax, Umax],[−Vmax, Vmax]。
YIQ將(U,V)旋轉了33度,優點是減少了電視廣播需要的帶寬(因為與I分量相比人類對Q分量比較不敏感),缺點是需要9個乘法而不是上式中的5個。
嚴格來說,YUV是一種模擬表示,相應的數字表示為YCbCr。
YCrCb顏色空是由YUV顏色空間派生的一種顏色空間。YCbCr是在世界數字組織視頻標准研制過程中作為ITU-R BT.601建議的一部分,其實是YUV經過縮放和偏移的翻版。YCrCb中的Y與YUV中的Y含義一致,Cb、Cr同樣都指色彩,只是在表示方法上不同。在YUV家族中,YCbCr是在計算機系統中應用最多的成員,其應用領域很廣泛,JPEG、MPEG均采用此格式。一般人們所講的YUV大多是指YCbCr。
YCbCr的兩種常用格式[3]:
1)ITU-R BT.601 conversion
縮放到具有上下動態裕量的8bit,平移后可以用無符號數表示。
2)JPEG conversion
使用完全的8bit輸出表示每一個分量。
相比RGB,YUV或者YCbCr的優點是減少通道之間的相關性。可以方便的對色彩進行閾值處理;簡化了彩色圖像的增強,例如對比度增強只需要在圖像的Y分量上執行;可以對亮度和色彩進行不同策略的噪聲去除等。
缺點是轉化是RGB坐標系的旋轉,需要浮點或者定點乘法來執行;縮放系數的選擇必須保證每個RGB組合具有一個有效的YCbCr表示,可是逆變換是非真的,有些YCbCr組合落在RGB的有效范圍之外,如果需要計算逆變換,那么意味着YCbCr需要更多位表示。
YUV的常見采樣格式
YUV444:無壓縮,YUV三個信道的采樣率相同,三個分量信息完整(通常為8bit)。每個Y獨享一對UV分量。每個像素3字節。
原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2]
碼流:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
YUV422:2:1的水平取樣,垂直完全采樣。每兩個Y共用一組UV分量。每個像素2字節。
原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2]
碼流:Y0 U0 Y1 V1 Y2 U2 Y3 V3
得到的像素:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
YUV411:4:1的水平取樣,垂直完全采樣。每四個Y共用一組UV分量。每個像素
8+(8/4)+(8/4)=12bits,1.5個字節。
原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2]
碼流:Y0 U0 Y1 Y2 V2 Y3
得到的像素:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
YUV420:2:1的水平取樣,垂直2:1采樣。每四個Y共用一組UV分量。每個像素12bit,采樣方式不一樣了。
原始像素:[Y0 U0 V0][ Y1 U1 V1][ Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7 U7 V7] [Y8 U8 V8]
碼流:Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8
得到的像素:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
下圖中,以黑點表示采樣該像素點的Y分量,以空心圓圈表示采樣該像素點的UV分量。
YUV420比較常用。
U = Y / 4 V = Y / 4
所以YUV420 數據在內存中的長度是 width * height * 3 / 2
什么是4:4:4、4:2:2、4:2:0?
在最近十年中,視頻工程師發現人眼對色度的敏感程度要低於對亮度的敏感程度。在生理學中,有一條規律,那就是人類視網膜上的視網膜桿細胞要多於視網膜錐細胞,說得通俗一些,視網膜桿細胞的作用就是識別亮度,而視網膜錐細胞的作用就是識別色度。所以,你的眼睛對於亮和暗的分辨要比對顏色的分辨精細一些。正是因為這個,在我們的視頻存儲中,沒有必要存儲全部顏色信號。既然眼睛看不見,那為什么要浪費存儲空間(或者說是金錢)來存儲它們呢?
像Beta或VHS之類的消費用錄像帶就得益於將錄像帶上的更多帶寬留給黑—白信號(被稱作“亮度”),將稍少的帶寬留給彩色信號(被稱作“色度”)。
在MPEG2(也就是DVD使用的壓縮格式)當中,Y、Cb、Cr信號是分開儲存的(這就是為什么分量視頻傳輸需要三條電纜)。其中Y信號是黑白信號,是以全分辨率存儲的。但是,由於人眼對於彩色信息的敏感度較低,色度信號並不是用全分辨率存儲的。
色度信號分辨率最高的格式是4:4:4,也就是說,每4點Y采樣,就有相對應的4點Cb和4點Cr。換句話說,在這種格式中,色度信號的分辨率和亮度信號的分辨率是相同的。這種格式主要應用在視頻處理設備內部,避免畫面質量在處理過程中降低。當圖像被存儲到Master Tape,比如D1或者D5的時候,顏色信號通常被削減為4:2:2
其次就是4:2:2,就是說,每4點Y采樣,就有2點Cb和2點Cr。在這種格式中,色度信號的掃描線數量和亮度信號一樣多,但是每條掃描線上的色度采樣點數卻只有亮度信號的一半。當4:2:2信號被解碼的時候,“缺失”的色度采樣,通常由一定的內插補點算法通過它兩側的色度信息運算補充。每個象素都有與之對應的亮度采樣,同時一半的色度采樣被丟棄,所以我們看到,色度采樣信號每隔一個采樣點才有一個。當着張畫面顯示的時候,缺少的色度信息會由兩側的顏色通過內插補點的方式運算得到。就像上面提到的那樣,人眼對色度的敏感程度不如亮度,大多數人並不能分辨出4:2:2和4:4:4顏色構成的畫面之間的不同。
色度信號分辨率最低的格式,也就是DVD所使用的格式,就是4:2:0了。事實上4:2:0是一個混亂的稱呼,按照字面上理解,4:2:0應該是每4點Y采樣,就有2點Cb和0點Cr,但事實上完全不是這樣。事實上,4:2:0的意思是,色度采樣在每條橫向掃描線上只有亮度采樣的一半,掃描線的條數上,也只有亮度的一半!換句話說,無論是橫向還是縱向,色度信號的分辨率都只有亮度信號的一半。舉個例子,如果整張畫面的尺寸是720*480,那么亮度信號是720*480,色度信號只有360*240。在4:2:0中,“缺失”的色度采樣不單單要由左右相鄰的采樣通過內插補點計算補充,整行的色度采樣也要通過它上下兩行的色度采樣通過內插補點運算獲得。這樣做的原因是為了最經濟有效地利用DVD的存儲空間。誠然,4:4:4的效果很棒,但是如果要用4:4:4存儲一部電影,我們的DVD盤的直徑至少要有兩英尺(六十多厘米)!
YUV存儲格式
緊縮格式(packed formats):將YUV分量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel),和RGB的存放方式類似,在這種格式下每個像素點的YUV數據混合放在一個矩陣中。
平面格式(planar formats):使用三個數組分開存放YUV三個分量,就像是一個三維平面一樣。其中Y為width*height,而U、V合占Y的一半。
YUV420中,一些特殊的存儲格式:
YUV420p,planer模式,Y、U、V分別位於不同平面。按U、V存儲順序不同,可以分為
YV12:YYYYVVVUUU
YU12:YYYYUUUVVV,又叫I420。
YUV420p的YU12存儲格式如下:
YUV420sp,bi-planer或者two-planer雙平面,Y在一個平面,UV在同一個平面交叉存儲。
NV12:YYYYUVUVUV
NV21:YYYYVUVUVU,安卓相機標准圖片格式
YUV420sp的NV12存儲格式如下:
OpenCV 中,RGB與YUV的互相轉換:
使用cvtColor函數,在imgproc模塊的types_c.h中查看轉換代碼:
RGB與YUV444互轉:
RGB轉YUV420p的YU12:
RGB轉YUV420p的YV12:
YUV420p轉RGB:
YUV420sp轉RGB:
OpenCV沒有RGB直接轉YUV420sp的函數。