Duanxx的HEVC學習(一)輸入視頻文件YUV文件的分析

一 什麼是YUV文件

         Y'UV的發明是由於彩色電視黑白電視的過渡時期。黑白視訊只有Y(Luma,Luminance)視訊,也就是灰階值。到了彩色電視規格的制定,是以YUV/YIQ的格式來處理彩色電視圖像,把UV視作表示彩度的C(ChrominanceChroma),如果忽略C信號,那麼剩下的Y(Luma)信號就跟之前的黑白電視信號相同,這樣一來便解決彩色電視機與黑白電視機的相容問。YYV文件實際上是將RGB文件拆解成了亮度和色度信息保存,Y'UV最大的優點在於只需佔用極少的帶寬

         RGB文件最大的問題是RGB的視頻文件難以操作,如果我希望降低視頻文件的亮度,RGB文件必須同時處理RGB三色,並且在數據上會存在失真,爲了解決這個問題,YCbCr形式的文件就誕生了,Y是亮度頻道(luminance channel),Cb是藍色色度頻道(Bluechannel),Cr是紅色色度頻道(Red channel)。

 


1.1 YUV文件的採樣方式

         YUV文件的色度頻道的採樣頻率是可以比亮度頻道的採樣頻率低的,但不會明顯的降低視覺質量,於是乎就有一種用於描述YUV文件的採樣頻率比的方法A:B:C

l  444代表沒有亮度和色度都沒有下采樣

l  422表示2:1的水平下采樣,但是沒有垂直下采樣。每行掃描都含有4個Y採樣點,2個U採樣點和兩個V採樣點。即,在水平方向的隔行採樣,垂直方向全採樣。

l  420表示2:1的水平下采樣和2:1的垂直下采樣。每行掃描都好友4個Y採樣點,1個U採樣點和一個V採樣點。即,在水平方向隔行採樣,垂直方向也隔行採樣。



1.2YUV文件的存儲方式

對於8bit深度的數據而言,一個字節就是一個採樣點。10bit或者12bit的數據深度,則需要兩個字節來存儲一個採樣點,此時低位優先,最低有效位數據對齊。即:Y[0]Y[1]表示一個Y採樣數據,那麼其值爲Y[1]*256+Y[0]。

         YUV文件的存儲方式指的是YUV文件中YUV數據在其Byte System中的排布或者說位置。YUV文件的數據存儲方式有兩種Packed format和 Planarformat。

         在Packed format中,YUV文件的Y/U/V數據打包在了一起,依次存放,如下圖所示。


         在Planar format中,YUV的文件存放是分開的,先存放一幀圖片的Y數據,然後存放UV數據。

IMC4,i420格式的文件存放方式:Y + U + V


IMC2、YV12的存放方式:Y + V + U





1.3 YUV和RGB之間的轉換

從RGB到YUV:


從YUV到RGB:


以矩陣表示法(matrix representation),可得到公式:







二 HEVC標準測試視頻文件分析

         HEVC標準測試文件有很多,此處對BasketballDrill_832x480_50.yuv分析其文件格式。

         此文件的分辨率爲832x480,文件數據深度爲8bit,文件格式爲420,總幀數爲501幀。

         在這裏我用了兩個軟件:Elecard和Binary Viewer

         首先用Binary Viewer打開該文件:


         其文件大小爲300119040字節

         計算YUV數據量:(832*480 + 832*480/4 + 832*480/4)*501 =  300119040

         由此可以看出,YUV文件全部是數據,此處就有一個疑惑,它的文件格式,文件名等等信息怎麼存儲的呢?有二進制查看器打開其他的文件,比如一個圖片什麼的,都會找到文件格式、文件名之類的東西,但是YUV文件卻什麼都沒有,只有數據,真心不理解。

         再用Elecard,以YV12顯示的方式打開該文件,並查看其144*15那個點的數據。


         由圖中可以看到,紅色框中的UV值都是一樣的,因爲是420採樣,橫向和縱向都下采樣了,在從420轉換成444時,直接填充。所以纔會出現一個2*2的塊中的UV值都是一樣的。且下標都是從0開始,所以:

Y的位置爲:832*15+145 = 12625

U的位置爲:832*480 + 832/2*(15-1)/2 + 144/2 +1 =402345

V的位置爲:832*480 + 832*480/4 + 832/2*(15-1)/2 + 144/2 +1 = 502185

         從Binary Viewer定位到這些位置,便可以查看到相應的值。需要注意兩點,Binary Viewer中的下標是從0開始的,所以在定位時,需要減1;並且,上面是YV12打開的,所以UV的位置反了。


 

三 Matlab讀取一個YUV文件並查看

         此處我讀取了一幀的數據,然後將YUV420轉爲YUV44最後轉爲RGB顯示出來:

fid=fopen('BasketballDrill_832x480_50.yuv','rb');
width = 832
height = 480
 
%% Read a yuv file ,thefile format is i420
Y = fread(fid,[width,height],'uint8');
U = fread(fid,[width/2,height/2],'uint8');
V = fread(fid,[width/2,height/2],'uint8');
 
%% inital memory for yuv444
YY=zeros(width,height,'uint8');
UU=zeros(width,height,'uint8');
VV=zeros(width,height,'uint8');
 
%% fill the empty of yuv444in U and V
UU(1:2:width-1,1:2:height-1)=U(:,:);
UU(1:2:width-1,2:2:height)=U(:,:);
UU(2:2:width,1:2:height-1)=U(:,:);
UU(2:2:width,2:2:height)=U(:,:);
VV(1:2:width-1,1:2:height-1)=V(:,:);
VV(1:2:width-1,2:2:height)=V(:,:);
VV(2:2:width,1:2:height-1)=V(:,:);
VV(2:2:width,2:2:height)=V(:,:);
 
%% transform the yuv444 toRGB,and show the picture
YUV444=cat(3,Y',UU',VV');
RGB=ycbcr2rgb(YUV444);
imshow(RGB)

最後顯示的圖像如圖所示:


在U/V都爲0時的圖像:

只有U爲0時的圖像:


只有V爲0的圖像:




發佈了28 篇原創文章 · 獲贊 142 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章