YUV

本文爲網上文章摘錄

Iain的書中寫道:The human visual system (HVS) isless sensitive to colour than to luminance(brightness).人類視覺系統(其實就是人的眼睛)對亮度的感覺比對顏色更加敏感。
   在RGB色彩空間中,三個顏色的重要程度相同,所以需要使用相同的分辨率進行存儲,最多使用RGB565這樣的形式減少量化的精度,但是3個顏色需要按照相同的分辨率進行存儲,數據量還是很大的。所以,利用人眼睛對亮度比對顏色更加敏感,將圖像的亮度信息和顏色信息分離,並使用不同的分辨率進行存儲,這樣可以在對主觀感覺影響很小的前提下,更加有效的存儲圖像數據。
   YCbCr色彩空間和它的變形(有時被稱爲YUV)是最常用的有效的表示彩色圖像的方法。Y是圖像的亮度(luminance/luma)分量,使用以下公式計算,爲R,G,B分量的加權平均值:
        Y = kr R + kgG + kbB
       其中k是權重因數。
    上面的公式計算出了亮度信息,還有顏色信息,使用色差(colordifference/chrominance或chroma)來表示,其中每個色差分量爲R,G,B值和亮度Y的差值:
  Cb = B - Y
  Cr = R - Y
        Cg = G -Y
       其中,Cb+Cr+Cg是一個常數(其實是一個關於Y的表達式),所以,只需要其中兩個數值結合Y值就能夠計算出原來的RGB值。所以,我們僅保存亮度和藍色、紅色的色差值,這就是(Y,Cb,Cr)。
相比RGB色彩空間,YCbCr色彩空間有一個顯著的優點。Y的存儲可以採用和原來畫面一樣的分辨率,但是Cb,Cr的存儲可以使用更低的分辨率。這樣可以佔用更少的數據量,並且在圖像質量上沒有明顯的下降。所以,將色彩信息以低於量度信息的分辨率來保存是一個簡單有效的圖像壓縮方法。
在COLOUR SPACES .17 ITU-R recommendation BT.601中,建議在計算Y時,權重選擇爲
    kr = 0.299,
    kg = 0.587,
    kb = 1 - kr - kg = 0.114。
    於是常用的轉換公式如下:
    Y  = 0.299R + 0.587G + 0.114B
    Cb = 0.564(B - Y )
    Cr = 0.713(R - Y )

    R = Y + 1.402Cr
    G = Y - 0.344Cb - 0.714Cr
    B = Y + 1.772Cb
   有了這個公式,我們就能夠將一幅RGB畫面轉換成爲YUV畫面了,反過來也可以。
   在RGB24格式中,對於寬度爲w,高度爲h的畫面,需要w*h*3個字節來存儲其每個像素的rgb信息,畫面的像素數據是連續排列的。按照r(0,0),g(0,0),b(0,0);r(0,1),g(0,1),b(0,1);…;r(w-1,0),g(w-1,0),b(w-1,0);…;r(w-1,h-1),g(w-1,h-1),b(w-1,h-1)這樣的順序存放起來。
    在YUV格式中,以YUV420格式爲例。寬度爲w高度爲h的畫面,其亮度Y數據需要w*h個字節來表示(每個像素點一個亮度)。而Cb和Cr數據則是畫面中4個像素共享一個Cb,Cr值。這樣Cb用w*h/4個字節,Cr用w*h/4個字節。
YUV文件中,把多個幀的畫面連續存放。就是YUV YUVYUV…..這樣的不斷連續的形式,而其中每個YUV,就是一幅畫面。
   在這單個YUV中,前w*h個字節是Y數據,接着的w*h/4個字節是Cb數據,再接着的w*h/4個字節爲Cr數據。
在由這樣降低了分辨率的數據還原出RGB數據的時候,就要依據像素的位置找到它對應的Y,Cb,Cr值,其中Y值最好找到,像素位置爲x,y的話,Y數據中第y*width+x個數值就是它的Y值。Cb和Cr由於是每2x2像素的畫面塊擁有一個,這樣Cb和Cr數據相當於兩個分辨率爲w/2*h/2的畫面,那麼原來畫面中的位置爲x,y的像素,在這樣的低分辨率畫面中的位置是x/2,y/2,屬於它的Cb,Cr值就在這個地方:(y/2)*(width/2)+(x/2)。


YUV主要的採樣格式

主要的子採樣格式有 YCbCr 4:2:0、YCbCr 4:2:2 、 YCbCr 4:4:4和YCbCr 4:1:1。  

      4:2:0表示每4個像素有4個亮度分量,2個色度分量(YYYYCbCr),僅採樣奇數掃描線,是便攜式視頻設備(MPEG-4)以及電視會議(H.263)最常用格式;4:2:2表示每4個像素有4個亮度分量,4個色度分量(YYYYCbCrCbCr),是DVD、數字電視、HDTV 以及其它消費類視頻設備的最常用格式;4:4:4表示全像素點陣(YYYYCbCrCbCrCbCrCbCr),用於高質量視頻應用、演播室以及專業視頻產品;4:1:1含義爲:每個點保存一個 8bit 的亮度值(也就是Y值), 每 2x2 個點保存一個 Cr 和Cb 值,圖像在肉眼中的感覺不會起太大的變化。所以, 原來用 RGB(R,G,B 都是 8bit unsigned) 模型, 每個點需要 8x3=24bits. 而現在僅需要 8+(8/4)+(8/4)=12bites,平均每個點佔12bites。這樣就把圖像的數據壓縮了一半。

(1) YUV 4:4:4

YUV三個信道的抽樣率相同,因此在生成的圖像裏,每個象素的三個分量信息完整(每個分量通常8比特),經過8比特量化之後,未經壓縮的每個像素佔用3個字節。  
下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]  
 存放的碼流爲: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3

(2) YUV 4:2:2
每個色差信道的抽樣率是亮度信道的一半,所以水平方向的色度抽樣率只是4:4:4的一半。對非壓縮的8比特量化的圖像來說,每個由兩個水平方向相鄰的像素組成的宏像素需要佔用4字節內存。  
下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]  
存放的碼流爲: Y0 U0 Y1 V1 Y2 U2 Y3 V3  
映射出像素點爲:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]

(3) YUV
4:1:1的色度抽樣,是在水平方向上對色度進行4:1抽樣。對於低端用戶和消費類產品這仍然是可以接受的。對非壓縮的8比特量化的視頻來說,每個由4個水平方向相鄰的像素組成的宏像素需要佔用6字節內存  
下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]  
存放的碼流爲: Y0 U0 Y1 Y2 V2 Y3  
映射出像素點爲:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]

(4)YUV4:2:0
並不意味着只有Y,Cb而沒有Cr分量。它指得是對每行掃描線來說,只有一種色度分量以2:1的抽樣率存儲。相鄰的掃描行存儲不同的色度分量,也就是說,如果一行是4:2:0的話,下一行就是4:0:2,再下一行是4:2:0...以此類推。對每個色度分量來說,水平方向和豎直方向的抽樣率都是2:1,所以可以說色度的抽樣率是4:1。對非壓縮的8比特量化的視頻來說,每個由2x2個2行2列相鄰的像素組成的宏像素需要佔用6字節內存。  
下面八個像素爲:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]  
                                [Y5 U5 V5] [Y6 U6 V6] [Y7U7 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]  

而YUV有packed format和planar format兩種。Packed format和plannerformat的區別在於,packedformat中的YUV是混合在一起的,因此就有了UYVY、YUYV等等,他們在碼流中排列的方式有所不同。而對於plannerformat每一個Y分量,U分量和V分量都是以獨立的平面組織的,也就是說所有的U分量都在Y分量之後出現,而V分量在所有的U分量之後。就像三個大色塊一樣。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章