0.引言
本篇文章主要講解YUV格式和記憶體排列,看完本篇文章,能夠快速對YUV格式有個更清楚的認識。
從下圖就可以看出,YUV4:1:1,YUV4:2:0,就壓縮的最厲害。通常在網路傳輸時,一般在送到編碼之前,都轉換成為這2種格式。
1.YUV簡述
yuv是歐洲電視系統採用的顏色編碼方法之一,包含一個亮度訊號Y和兩個色差訊號U、V。yuv格式能夠最佳化彩色影片訊號資料的儲存方式。與RGB格式相比,最大的優勢在於只需佔用極少的資料儲存空間,使得資料傳輸更為簡易。
yuv中,“Y”表示明亮度,也就是灰階值;而“U”和“V”表示的則是色度,色度的作用是記錄影象色彩及飽和度。“亮度”是透過輸入訊號來建立的,方法是將訊號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面─色調與飽和度,分別用Cr和Cb來表示。其中,Cr反映了RGB輸入訊號紅色部分與RGB訊號亮度值之間的差異。而Cb反映的是RGB輸入訊號藍色部分與RGB訊號亮度值之間的差異。
採用yuv色彩空間的重要性是它的亮度訊號y和色度訊號u、v是分離的。如果只有y訊號分量而沒有u、v分量,那麼這樣表示的影象就是黑白灰度影象。彩色電視採用yuv空間正是為了用亮度訊號y解決彩色電視機與黑白電視機的相容問題,使黑白電視機也能接收彩色電視訊號。
2.YUV取樣格式
主要的取樣格式有YCbCr:4:4:4、YCbCr:4:2:2、YCbCr:4:2:0、以及YCbCr:4:2:1,舉例說明中YCbCr:4:1:1為常用的取樣格式,其含義為:每個點儲存一個8bit的亮度值(也就是Y值),每4個點儲存一個Cr和Cb值,Cr和Cb畫素點在肉眼中的感覺不會起太大的變化。所以,原來用RGB(R,G,B都是8bit unsigned)模型,即1個點需要24bits。如果按YCbCr:4:1:1取樣後,平均每個點僅需要8+8/4+8/4=12bits。這樣就把影象的資料壓縮了一半。下面對這幾種格式做詳細介紹。
(1)YUV 4:4:4
YUV三個取樣資料完整儲存,不存在任何資料損失與壓縮,當然資料儲存大小不變,與格式相同。如下圖:
每一個交叉表示一個Y值資料,每一個圓圈表示一個U值與V值資料,圖中為每個Y值對應一個U值與V值,整體為一個畫素點,該畫素點資料儲存完整。
YUV 4:4:4影象
交錯格式儲存如下:
YUV資料在記憶體中的儲存方式,每3個為一組,為方便32位計算機的按位直接讀取,通常在每組YUV值後會填充一個A值,使得每次讀取數值為32位,增加讀取速度。
YUV 4:4:4記憶體儲存方式
(2)YUV 4:2:2
灰度值資料Y完整讀取,色度U與V僅保留原本的一半,取每行畫素點的奇數位的UV值進行儲存。此處UV資料壓縮百分之五十,Y資料不變,壓縮比為1-(4+2+2)/(4+4+4)*100%=33.33%)。因畫素點在螢幕顯示後,影象顏色的失真對於觀察者來說並不會影響影象的質量與觀賞度,所以能夠按此法進行壓縮。如下圖所示:
YUV 4:2:2影象
交錯格式儲存如下:
YUV 4:2:2 記憶體儲存方式
每一個交叉表示一個Y值資料,每一個圓圈表示一個U值與V值資料,圖中為每兩個Y值對應一個U值與V值,整體為兩個畫素點,兩畫素點共用一個相同的色度差,利用物體顏色在兩個畫素的距離內不會變化過大的原理,合理壓縮影象資料。
為YUV資料在記憶體中的儲存方式,每4個為一組,其中奇數位為Y值,偶數位為U值與V值,32位計算機在讀取時能夠一次恰好讀取一組YUV資料,其中包括兩個Y值與其共用的一個U值與V值。
(3)YUV 4:1:1
灰度值資料Y依舊完整讀取,而色度U與V僅保留原本的四分之一,取每兩行畫素點的左上位置的UV值進行儲存。此處資料壓縮百分之七十五,Y資料不變,壓縮比為1-(4+1+1)/(4+4+4)*100%=50%)。同樣利用因畫素點在螢幕顯示後,影象顏色的失真對於觀察者來說並不會影響影象的質量與觀賞度,既然YUV4:2:2能夠橫向壓縮,所以YUV 4:1:1能夠增加縱向壓縮,達到更加高的壓縮比例,但需要付出資料較難處理的代價。如下圖所示:
每一個交叉表示一個Y值資料,每一個圓圈表示一個U值與V值資料,圖中為每四個Y值對應一個U值與V值,整體為四個畫素點,四個畫素點共用一個相同的色度差,同樣利用物體顏色在兩個畫素的距離內不會變化過大的原理,合理壓縮影象資料。記憶體排列如下圖所示:
記憶體儲存方式YUV 4:1:1記憶體儲存方式
上圖中,為YUV 4:1:1資料在記憶體中的儲存方式,與YUV 4:4:4、YUV 4:2:2不同的是,雖然YUV 4:1:1壓縮比最大,需要儲存的資料最少,但是其儲存方式是最為複雜的,需要使用三個Buffer依次存取Y,U,V,三值,此儲存方式節約了儲存記憶體空間與資料進行傳送時的網路傳輸頻寬,增加了程式設計人員對資料還原顯示處理的難度。
確定影象的儲存方式關係到資料在記憶體中的儲存方式,當進行影象合併時,需要對記憶體中的資料進行修改,以達到合併影象的效果,所以瞭解影象儲存方式至關重要。
注意:儘管上面列舉出了一些常用的格式,但是還是有很多格式也是有用到的,實際遇到採集與編碼格式不同,或解碼與播放格式不同,就需要進行格式轉換。理解清楚這些格式轉換就知道怎麼去轉換了,當然如果搞不清這種資料關係,也有庫可以用。
3.其它
如WebRTC庫中原始碼對於影象類的命名為I420,初步猜測為YUV4:2:0格式。但在interface檔案I420videoframe.h中觀察建立影象的方法與其引數:
int CreateFrame(int size_y,const uint8_t & buffer_y,int size_U,const uint8_t & buffer_U, int size_V,const uint8_t & buffer_V,int width,int heigth, int stride_y,int stride_u,int stride_v)
推斷其實際儲存方式為YUV4:1:1,因為引數中包含三個Buffer,分別為bufferY,bufferU以及bufferV,以及他們對應的大小。
事實上,WebRTC作為影片通話的開發庫,其考慮最優先的必然是最大化壓縮資料,減少需要網路傳輸的資料,減少影片通話與現實中的延遲,在使得影片通話順暢的基礎上,再進行畫質的改善。因此WebRTC選擇YUV4:1:1為合理選擇,但此影象格式處理的方式較為困難,後面文章再介紹下怎麼轉換的演算法。
4.總結