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格式的換算
- RGB 轉換成 YUV
- Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
- Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
- Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
- YUV 轉換成 RGB
- B = 1.164(Y - 16) + 2.018(U - 128)
- G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
- R = 1.164(Y - 16) + 1.596(V - 128)
RGB取值範圍均爲0~255,Y=0~255,U=-122~+122,V=-157~+157
以下是經過簡化的公式,運算量比上述公式要小一些。
- RGB轉YUV
- Y = 0.299R + 0.587G + 0.114B
- U'= (BY)*0.565
- V'= (RY)*0.713
- YUV轉RGB
- R = Y + 1.403V'
- G = Y - 0.344U' - 0.714V'
- 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一般是模擬信號,我引用兩段來說明兩者區別
- 什麼是YCbCr?
- YCbCr表示隔行分量端子,是屬於YUV經過縮放和偏移的翻版,常說的YUV也稱作YCbCr。其中Y與YUV 中的Y含義一致,Cb , Cr 同樣都指色彩,,只是在表示方法上不同而已,Cb Cr 就是本來理論上的“分量/色差”的標識。C代表分量(是component的縮寫)Cr、Cb分別對應r(紅)、b(藍)分量信號,Y除了g(綠)分量信號,還疊加了亮度信號。
- 其中YCbCr是隔行信號,YPbPr是逐行信號。YCbCr 是在計算機系統中應用最多的一種信號,其應用領域很廣泛,JPEG、MPEG均採用此格式。
- 什麼是YPbPr?
- Y'CbCr 在模擬分量視頻(analog component video)中也常被稱爲YPbPr,YPbPr是將模擬的Y、PB、PR信號分開,使用三條線纜來獨立傳輸,保障了色彩還原的準確性,YPbPr表示逐行掃描色差輸出.YPbPr接口可以看做是S端子的擴展,與S端子相比,要多傳輸PB、PR兩種信號,避免了兩路色差混合解碼並再次分離的過程,也保持了色度通道的最大帶寬,只需要經過反矩陣解碼電路就可以還原爲RGB三原色信號而成像,這就最大限度地縮短了視頻源到顯示器成像之間的視頻信號通道,避免了因繁瑣的傳輸過程所帶來的圖像失真,保障了色彩還原的準確,目前幾乎所有大屏幕電視都支持色差輸入。
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 按字節序分爲IMC1
和IMC2
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)