YUV格式分析

Andrew Huang <[email protected]> 轉載請註明作者及聯絡方式

http://www.cnblogs.com/armlinux/archive/2012/02/15/2396763.html


  在攝像頭之類編程經常是會碰到YUV格式,而非大家比較熟悉的RGB格式. 我們可以把YUV看成是一個RGB的變種來理解.

   YUV的原理是把亮度與色度分離,研究證明,人眼對亮度的敏感超過色度。利用這個原理,可以把色度信息減少一點,人眼也無法查覺這一點。

  YUV三個字母中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰階值;而"U"和"V"表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏色。用這個三個字母好象就是通道命令。

 
 

使用YUV的優點有兩個:
   一.彩色YUV圖像轉黑白YUV圖像轉換非常簡單,這一特性用在於電視信號上。

   二.YUV是數據總尺寸小於RGB格式

關於描述YUV格式,寫得比較好是這一篇文件
   <<Video Rendering with 8-Bit YUV Formats>>


一.YUV格式與RGB格式的換算


關於YUV與RGB轉換


以下是標準公式
  1. RGB 轉換成 YUV

  2. Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16

  3. Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128

  4. Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128

  5. YUV 轉換成 RGB

  6. B = 1.164(Y - 16) + 2.018(U - 128)

  7. G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)

  8. R = 1.164(Y - 16) + 1.596(V - 128)

RGB取值範圍均爲0~255,Y=0~255,U=-122~+122,V=-157~+157
以下是經過簡化的公式,運算量比上述公式要小一些。

  1. RGB轉YUV

  2. Y = 0.299R + 0.587G + 0.114B

  3. U'= (BY)*0.565

  4. V'= (RY)*0.713

  5. YUV轉RGB

  6. R = Y + 1.403V'

  7. G = Y - 0.344U' - 0.714V'

  8. B = Y + 1.770U'

   如果只有Y信號分量而沒有U、V分量,那麼這樣表示的圖像就是黑白灰度圖像。因此用YUV格式由彩色轉
黑白信號相當簡單. 
   在技術文檔裏,YUV經常有另外的名字, YCbCr ,其中Y與YUV 中的Y含義一致,Cb , Cr 同樣都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本來理論上的“分量/色差”的標識。C代表分量(是component的縮寫)Cr、Cb分別對應r(紅)、b(藍)分量信號,Y除了g(綠)分量信號,還疊加了亮度信號。

   還有一種格式是YPbPr格式,它與YCbPr格式的區別在於,其中YCbCr是隔行信號,YPbPr是逐行信號。
數字信號都是YCbCr ,其應用領域很廣泛,JPEG、MPEG均採用此格式。在後文中,如無特別指明,講的YUV都是指YCbCr格式。

  而YPbPr一般是模擬信號,我引用兩段來說明兩者區別
  
  1.   什麼是YCbCr?
  2.   YCbCr表示隔行分量端子,是屬於YUV經過縮放和偏移的翻版,常說的YUV也稱作YCbCr。其中Y與YUV 中的Y含義一致,Cb , Cr 同樣都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本來理論上的“分量/色差”的標識。C代表分量(是component的縮寫)Cr、Cb分別對應r(紅)、b(藍)分量信號,Y除了g(綠)分量信號,還疊加了亮度信號。
  3.   其中YCbCr是隔行信號,YPbPr是逐行信號。YCbCr 是在計算機系統中應用最多的一種信號,其應用領域很廣泛,JPEG、MPEG均採用此格式。
  4.   什麼是YPbPr?
  5.   Y'CbCr 在模擬分量視頻(analog component video)中也常被稱爲YPbPr,YPbPr是將模擬的Y、PB、PR信號分開,使用三條線纜來獨立傳輸,保障了色彩還原的準確性,YPbPr表示逐行掃描色差輸出.YPbPr接口可以看做是S端子的擴展,與S端子相比,要多傳輸PB、PR兩種信號,避免了兩路色差混合解碼並再次分離的過程,也保持了色度通道的最大帶寬,只需要經過反矩陣解碼電路就可以還原爲RGB三原色信號而成像,這就最大限度地縮短了視頻源到顯示器成像之間的視頻信號通道,避免了因繁瑣的傳輸過程所帶來的圖像失真,保障了色彩還原的準確,目前幾乎所有大屏幕電視都支持色差輸入。

二.YUV的存儲格式
 
  RGB格式中,一個24bpp像素要佔用4字節空間。在YUV格式中,可以對於UV分量的數據壓縮,但是對圖像整體質量影響不大,這樣YUV所佔的空間就比RGB要小一些
不過RGB中 16bpp的 565格式每一個點只佔2個字節,從這一點看也沒有省多少。不過視頻應用都是清一色的YUV應用。因此YUV的處理還是一個比較重要課題。

  YUV的存儲中與RGB格式最大不同在於,RGB格式每個點的數據是連繼保存在一起的。即R,G,B是前後不間隔的保存在2-4byte空間中。而YUV的數據中爲了節約空間,U,V分量空間會減小。每一個點的Y分量獨立保存,但連續幾個點的U,V分量是保存在一起的,(反正人眼一般也看不出區別).這幾個點合起來稱
爲macro-pixel, 這種存儲格式稱爲Packed格式。
  另外一種存儲格式是把一幅圖像中Y,U,V分別用三個獨立的數組表示。這種模式稱爲planar模式。

  這裏我們主要使用第一種Packed格式。

2.1 採樣格式
   表示YUV格式,一般用Y,U,V三者的比率來表示不同格式,比如YUV420 表示三者是比值此是 4:4:4
   即一個點數據點,Y,U,V的空間都是一樣大小。目前主要有如下比例,注意所有格式中Y比值都是4,佔一個字節,表示沒有減少採樣。不同格式中,減小隻是UV的採樣值.

  
  • 4:4:4 表示色度值(UV)沒有減少採樣。即Y,U,V各佔一個字節,加上Alpha通道一個字節,總共佔4字節.這個格式其實就是24bpp的RGB格式了。
  • 4:2:2 表示UV分量採樣減半,比如第一個像素採樣Y,U,第二個像素採樣Y,V,依次類推,這樣每個點佔用2個字節.二個像素組成一個宏像素.
  • 4:2:0  這種採樣並不意味着只有Y,Cb而沒有Cr分量,這裏的0說的U,V分量隔行才採樣一次。比如第一行採樣 4:2:0 ,第二行採樣 4:0:2 ,依次類推...在這種採樣方式下,每一個像素佔用16bits或10bits空間.
  • 4:1:1 可以參考4:2:2分量,是進一步壓縮,每隔四個點才採一次U和V分量。一般是第0點採Y,U,第1點採Y,第3點採YV,第四點採Y,依次類推。

   除了4:4:4採樣,其餘採樣後信號重新還原顯示後,會丟失部分UV數據,只能用相臨的數據補齊,但人眼對UV不敏感,因此總體感覺損失不大。
4:2:2示例
   如果原始數據三個像素是 Y0 U0 V0 ,Y1 U1 V1,Y2 U2 V2,Y3 U3 V3
   經過4:2:2採樣後,數據變成了 Y0 U0 ,Y1 V1 ,Y2 U2,Y3 V3
   如果還原後,因爲某一些數據丟失就補成 Y0 U0 V1,Y1 U0 V1,Y2 U2V3 ,Y3 U3 Y2

  4:1:1示例
   原來四個像素爲: [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:2:0示例
下面八個像素爲:[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 4:4:4格式內存佈局,每一個像素擁有完整的YUV,加上A(Alpha)
  

YUV 4:2:2 小端字節序排列
 

2.2 Four CC 碼
  關於YUV444,YUV422,YUV420的名稱還有別外一種命名方式,FOURCC 碼,上文中用就是這個命令,這Four CC使用四個字母的命名,
   FourCC全稱Four-Character Codes,是由4個字符(4 bytes)組成,是一種獨立標示視頻數據流格式的四字節,在wav、avi檔案之中會有一段FourCC來描述這個AVI檔案,是利用何種codec來編碼的。因此wav、avi大量存在等於“IDP3”的FourCC

按fourcc的命名.

YUV444 的FourCC 稱爲 AYUV
YUV422 的FourcCC 按字節序分爲YUY2 和UYVY
YUV420 的FourcCC 按字節序分爲IMC1IMC2

2.3 V4L2 採用編碼
  我們一般是在V4L驅動裏使用這一些編碼,而且V4L2也有一類對應的編碼.參見vedio2dev.h,在編程中要與實際排列對應上.它後面的定義值實際就是FourCC 碼.

  #define V4L2_PIX_FMT_YVU420  v4l2_fourcc('Y', 'V', '1', '2') /* 12  YVU 4:2:0     */
#define V4L2_PIX_FMT_YUYV    v4l2_fourcc('Y', 'U', 'Y', 'V') /* 16  YUV 4:2:2     */
#define V4L2_PIX_FMT_UYVY    v4l2_fourcc('U', 'Y', 'V', 'Y') /* 16  YUV 4:2:2     */
#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4', '2', '2', 'P') /* 16  YVU422 planar */
#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4', '1', '1', 'P') /* 16  YVU411 planar */
#define V4L2_PIX_FMT_Y41P    v4l2_fourcc('Y', '4', '1', 'P') /* 12  YUV 4:1:1     */
#define V4L2_PIX_FMT_YUV444  v4l2_fourcc('Y', '4', '4', '4') /* 16  xxxxyyyy uuuuvvvv */
#define V4L2_PIX_FMT_YUV555  v4l2_fourcc('Y', 'U', 'V', 'O')
比如在CMOS攝像頭裏 支持
  V4L2_PIX_FMT_YVU420 ,它對應的是YV12 格式,查相應文檔,它是Plane格式,即Y,U,V分三個區排列
 
YV12 0x32315659 12 8 bit Y plane followed by 8 bit 2x2 subsampled V and U planes.

This is the format of choice for many software MPEG codecs. It comprises an NxM Y plane followed by (N/2)x(M/2) V and U planes.

  Horizontal Vertical
Y Sample Period 1 1
V Sample Period 2 2
U Sample Period 2 2

 

Positive biHeight implies top-down image (top line first)


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