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

YUV格式&畫素

YUV格式&畫素

說白了,一幅影象包括的基本東西就是二進位制資料,其容量大小實質即為二進位制資料的多少。一幅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]