1. 程式人生 > >YUV格式&像素

YUV格式&像素

組成 只需要 數據壓縮 alt 2個 完整 ycbcr 映射 left

一幅彩色圖像的基本要素是什麽?

說白了,一幅圖像包括的基本東西就是二進制數據,其容量大小實質即為二進制數據的多少。一幅1920x1080像素的YUV422的圖像,大小是1920X1080X2=4147200(十進制),也就是3.95M大小。這個大小跟多少個像素點和數據的存儲格式有關。下面簡述yuv與像素的關系:

YUV與像素的關系:

YUV是利用一個亮度(Y)、兩個色差(U,V)來代替傳統的RGB三原色來壓縮圖像。傳統的RGB三原色使用紅綠藍三原色表示一個像素,每種原色占用一個字節(8bit),因此一個像素用RGB表示則需要8*3=24bit。如果使用YUV表示這個像素,假設YUV的采樣率為:4:2:0,即每一個像素對於亮度Y的采樣頻率為1,對於色差U和V,則是每相鄰的兩個像素各取一個U和V。對於單個的像素來說,色差U和V的采樣頻率為亮度的一半。如有三個相鄰的像素,如果用RGB三原色表示,則共需要占用:8*3*3=72bits;如果采用YUV(4:2:0)表示,則只需要占用:8*3(Y)+ 8*3*0.5(U)+8*3*0.5(V)= 36bits。只需原來一半的空間,就可以表示原來的圖像,數據率壓縮了一倍,而圖像的效果基本沒發生變化。

一般描述一幅圖像的參數時我們會考慮以下幾點:

1、寬:一行有多少個像素點。2、高:一列有多少個像素點。3、YUV格式還是RGB格式?4、一行多少個字節?5、圖像大小是多少?6、圖像的分辨率是多少?

以下對YUV422、YUV420和YUV444進行初步解析:

YUV422格式。

分為很多小類,按照U、V的排列可以有YUYV,YVYU,UYVY,VYUY四種,其中,YUYVY一般又稱作yuv2格式。

而這四種YUV422格式,每種又可以分為2小類,按Y和UV的排列可以有打包格式和平面格式。例如,一個640×480×2的YUV文件,打包格式就是YUYVYUYV這樣一直排列下去,平面格式就是先640×480個Y排列完,然後是640×240個U,然後是640×240個V這樣排列,如下

圖:

技術分享

假如有一幅640×480的圖片,用yuv422來表示,那麽,采樣方式就是每個像素采樣Y信號,U,V信號隔一個采樣,這樣算下來,就有640×480個Y,640×240個U,640×240個V,一幅640×480大小的YUV圖片占的總字節數為640×480×2個字節,每像素2個字節,也就是16位。

在內存種中這樣排列:Y0U0Y1V0 Y2U1Y3V1...

第一個像素的YUV值為:Y0 U0 V0

第二個像素的YUV值為: Y1 U0 V0

第三個像素的YUV值為: Y2 U1 V1

.....其他以此推類,也就是說每兩個像素是共用了UV的;在一行上來看,每個像素的YUV值中Y值被采樣,UV值采樣0後,跳到3,然後5,所以每行上Y有640個,U,V各320個。

主要的采樣格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比較常用,其含義為:每個點保存一個 8bit 的亮度值(也就是Y值), 每 2x2 個點保存一個 Cr 和Cb 值, 圖像在肉眼中的感覺不會起太大的變化。所以, 原來用 RGB(R,G,B 都是 8bit unsigned) 模型, 4 個點需要 8x3=24 bites(如下圖第一個圖). 而現在僅需要 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字節內存(亮度2個字節,兩個色度各1個字節)。

下面的四個像素為: [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:1的色度抽樣,是在水平方向上對色度進行4:1抽樣。對於低端用戶和消費類產品這仍然是可以接受的。對非壓縮的8比特量化的視頻來說,每個由4個水平方向相鄰的像素組成的宏像素需要占用6字節內存(亮度4個字節,兩個色度各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)YUV4:2:0

4: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字節內存(亮度4個字節,兩個色度各1個字節)。

下面八個像素為:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2][Y3 U3 V3]

[Y5U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]

存放的碼流為:Y0 U0 Y1 Y2 U2 Y3

Y5V5 Y6 Y7 V7 Y8

映射出的像素點為:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]

[Y5U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]

YUV格式&像素