YUV格式詳解

  工做中常常會使用一些顏色空間,最主要的就是使用RGB空間和YUV空間,把兩空間的一些知識記錄在此。算法

1. 什麼是RGB?
RGB是紅綠藍三原色的意思,R=Red、G=Green、B=Blue。
2.什麼是YUV/YCbCr/YPbPr?
亮度信號常常被稱做Y,色度信號是由兩個互相獨立的信號組成。視顏色系統和格式不一樣,兩種色度信號常常被稱做U和V或Pb和Pr或Cb和Cr。這些都是由不一樣的編碼格式所產生的,可是實際上,他們的概念基本相同。在DVD中,色度信號被存儲成Cb和Cr(C表明顏色,b表明藍色,r表明紅色)。
3.什麼是4:4:四、4: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。ui

 

在圖中,你能夠看到4:4:4格式的亮度、色度採樣分佈。就像圖中所表示的,畫面中每一個象素都有與之對應的色度和亮度採樣信息。
其次就是4:2:2,就是說,每4點Y採樣,就有2點Cb和2點Cr。在這種格式中,色度信號的掃描線數量和亮度信號同樣多,可是每條掃描線上的色度採樣點 數卻只有亮度信號的一半。當4:2:2信號被解碼的時候,「缺失」的色度採樣,一般由必定的內插補點算法經過它兩側的色度信息運算補充。
看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盤的直徑至少要有兩 英尺(六十多釐米)!
上圖表示了概念上4:2:0顏色格式非交錯畫面中亮度、色度採樣信號的排列狀況。同4:2:2格式 同樣,每條掃描線中,只有一半的色度採樣信息。與4:2:2不一樣的是,不光是橫向的色度信息被「扔掉」了一半,縱向的色度信息也被「扔掉」了一半,整個屏 幕中色度採樣只有亮度採樣的四分之一。請注意,在4:2:0顏色格式中,色度採樣被放在了兩條掃描線中間。爲何會這樣呢?很簡單:DVD盤上的顏色採樣 是由其上下兩條掃描線的顏色信息「平均」而來的。好比,圖三中,第一行顏色採樣(Line 1和Line 2中間夾着的那行)是由Line 1和Line 2「平均」獲得的,第二行顏色採樣(Line 3和Line 4中間夾着的那行)也是一樣的道理,是由Line 3和Line 4獲得的。
雖然文章中屢次提到「平均」這個概念,可是這個「平均」可不是咱們一般意義上的(a+B)/2的平均。顏色的處理有極其複雜的算法保證其最大限度地減小失真,接近原始質量。


關於 RGB 跟 YUV 的轉換:
計算機彩色顯示器顯示色彩的原理與彩色電視機同樣,都是採用R(Red)、G(Green)、B(Blue)相加混色的原理:經過發射出三種不一樣強度的電子束,使屏幕內側覆蓋的紅、綠、藍磷光材料發光而產生色彩。這種色彩的表示方法稱爲RGB色彩空間表示(它也是多媒體計算機技術中用得最多的一種色彩空間表 示方法)。
根據三基色原理,任意一種色光F均可以用不一樣份量的R、G、B三色相加混合而成。
F = r [ R ] + g [ G ] + b [ B ]
其中,r、g、b分別爲三基色參與混合的係數。當三基色份量都爲0(最弱)時混合爲黑色光;而當三基色份量都爲k(最強)時混合爲白色光。調整r、g、b三個係數的值,能夠混合出介於黑色光和白色光之間的各類各樣的色光。
那 麼YUV又從何而來呢?在現代彩色電視系統中,一般採用三管彩色攝像機或彩色CCD攝像機進行攝像,而後把攝得的彩色圖像信號經分色、分別放大校訂後獲得 RGB,再通過矩陣變換電路獲得亮度信號Y和兩個色差信號R-Y(即U)、B-Y(即V),最後發送端將亮度和色差三個信號分別進行編碼,用同一信道發送 出去。這種色彩的表示方法就是所謂的YUV色彩空間表示。
採用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。若是隻有Y信號份量而沒有U、V份量,那麼這樣表示的圖像就是黑白灰度圖像。彩色電視採用YUV空間正是爲了用亮度信號Y解決彩色電視機與黑白電視機的兼容問題,使黑白電視機也能接收彩色電視信號。
YUV與RGB相互轉換的公式以下(RGB取值範圍均爲0-255):
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U

code

PS:貼上兩個網上找到的sourcecode:
RGB->YUV
Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B − Y )
Cr = 0.713(R − Y )
代碼:
uint8_t COL_RgbToYuv(uint8_t R,uint8_t G,uint8_t B, uint8_t *y,int8_t *u,int8_t *v)
{
    float rr=R,bb=B,gg=G;
    float yy,uu,vv;
    yy=0.299*rr+ 0.587*gg+ 0.114*bb;
    uu=-0.169*rr+ -0.331*gg+ 0.5*bb;
    vv=0.5*rr+ -0.419*gg+ -0.081*bb;
    if(uu>127) uu=127;
    if(uu-127) uu=-127;
    *u=(int8_t)floor(uu);
    if(vv>127) vv=127;
    if(vv-127) vv=-127;
    *v=(int8_t)floor(vv);
    if(yy>255) yy=255;
    if(yy0) yy=0;
    *y=(uint8_t)floor(yy);
    return 1;
}
YUV->RGB



R = Y + 1.402Cr
G = Y − 0.344Cb − 0.714Cr
B = Y + 1.772Cb
代碼:
uint8_t COL_YuvToRgb( uint8_t y,int8_t u,int8_t v,uint8_t *r,uint8_t *g,uint8_t *b)
{
    float rr,bb,gg;
    float yy=y,uu=u,vv=v;
    rr= yy+ 1.402*vv;
    gg= yy+ -0.344*uu+ -0.714*vv;
    bb= yy+ 1.772*uu ;
    #define CLIP(x) if(x>255) x=255; else if (x0) x=0;x=x+0.49;
    #define CVT(x,y) CLIP(x);*y=(uint8_t)floor(x);
    CVT(rr,r);
    CVT(gg,g);
    CVT(bb,b);
    return 1;
}視頻

相關文章
相關標籤/搜索