YUV格式到底是什麼?

簡介

YUV是視頻、圖片、相機等應用中使用的一類圖像格式,實際上是所有“YUV”像素格式共有的顏色空間的名稱。 與RGB格式(紅 - 綠 - 藍)不同,YUV是用一個稱爲Y(相當於灰度)的“亮度”分量和兩個“色度”分量表示,分別稱爲U(藍色投影)和V(紅色投影),由此得名。

YUV也可以稱爲YCbCr,雖然這些術語意味着略有不同,但它們往往會混淆並可互換使用。

Y表示亮度分量:如果只顯示Y的話,圖像看起來會是一張黑白照。

U(Cb)表示色度分量:是照片藍色部分去掉亮度(Y)。

V(Cr)表示色度分量:是照片紅色部分去掉亮度(Y)。

要說清楚YUV,得分別說清楚以下兩點:

  • YUV的採樣格式:即我們在採集圖片、視頻幀時,是如何獲取每個像素的Y、U、V三個分量的。
  • YUV的存儲格式:即Y、U、V三個分量的值,是以什麼方式存儲在內存或者文件中的。

爲了理解這兩點,破費功夫,只因沒有在網上找到比較讓人滿意的解讀。最後找到了兩篇文檔:

VLC提供的wiki和微軟家提供的Video Rendering with 8-Bit YUV Formats

YUV採樣格式

什麼是掃描線(scan line)

爲了說明採樣格式,先說明一下待會兒會用的的概念:掃描線

什麼是掃描線?這是關於電視顯示的術語,用來描述電視是如何顯示畫面的。wiki中是這麼解釋的:

電視螢幕由電子槍射出的電子,經由磁場偏向後打在屏幕上而發光,因此每一個圖框都由電子槍的掃描線畫出來。

大概意思如下圖:圖片來源
在這裏插入圖片描述

電子槍的掃描線從左上角像素點到右下角像素點順序移動,噴射電子顯像。

我猜,這種像素的顯示方式也對像素的採樣方式產生了影響,YUV採樣格式中就大量提到了掃描線,至於這中間是否有什麼歷史"恩怨",大家如果知道,不妨留言分享。

宏像素 (macropixels)

像素是視頻顯示的基本單位,因爲它代表了屏幕上一個"點"的色彩,通常也會被形象地稱爲"像素點"。通常RGB格式像素點,會有Red、Green、Blue三個基本像素分量組成。也就是說,只要確定了紅、綠、藍三個像素分量就能確定這個像素將要顯示什麼。

同理,YUV格式也可以分爲三個分量,即Y、U、V一一對應。

但和RGB不一樣的是,利用人體眼睛對亮度分量(Y)敏感,而對色度分量(U和V)不敏感的原理,視頻可以通過降低色度分量的採樣數據,達到降低視頻數據量而人眼很難分辨的目的。所以,目前流行的YUV採樣,基本都是降低色度分量的採集。

也就是說,一個視頻幀中,亮度分量Y的採樣數不會被改變,但色度分量U和V會被降低採樣數(downsampling)。如此一來,Y、U、V三個分量將無法達到和RGB一樣一一對應的效果。

好在YUV所有的格式中,U、V分量的採樣數是相等的,只是不同的Y分量之間,需要共享數量不足的UV分量,爲了讓這個共享更好的表達,YUV出現了宏像素的概念。即:當前格式下,至少需要x個像素點的採樣數據,才能將這x個像素點完整表達,這幾個像素點組成了一個宏像素,每個像素點稱爲宏像素點。所謂的完整表達,也就是讓所有的Y分量都有對應的UV分量可以使用。

如果看到這裏,還不是很懂,你可以先跳過這節,這對後文的閱讀影響不是很大。

宏像素的概念,是從微軟家的那個文檔看到的,但他家沒做任何解釋,網上也沒有。這一節的內容,實際上是本人自己琢磨了好久才總結出來的。受限知識水平,請大家謹慎參考,如果有大神發現有誤,請留言幫幫小弟,一拜……再拜……

YUV4:4:4

YUV格式,採用A:B:C表示法用於描述UV色度分量相對於Y分量的採樣率。這怎麼理解呢,以YUV4:4:4爲例。

YUV4:4:4的採樣方式表示:各採樣分量在掃面每個像素點時,都不會降低採樣率。

在這裏插入圖片描述

如圖,一個方格表示一個像素點,方格中的YUV分別表示有在該像素點採YUV分量。之所以用四個方格顯示,是因爲YUV格式中,UV分量最小時需要四個像素共享一個UV分量對。同時,共享一個UV分量對的像素點,在平面上和UV分量都有臨近的關係,所以這四個像素點不會是同一條掃面線上的點,而是分佈在兩條掃描線上。

所以,一個宏像素最多容納四個宏像素點。而在YUV4:X:X的表示法中,的4表達的也是這個意思。

從圖可以看出,YUV4:4:4的採樣方式,是對每個像素點進行Y、U、V分量的全採樣。

關於內存佔用,因爲YUV模式的每個分量都是存儲在一個字節(8bit)中的。

所以,對於四個像素,YUV4:4:4格式需要4*8 + 4*8 + 4*8 = 96位,因此,每個像素深度爲24位

YUV4:2:2

YUV4:2:2的採樣方式表示:水平方向Y分量與UV分量2:1採樣,垂直方向不降低採樣率。也就是這樣:

在這裏插入圖片描述

水平方向上的兩個像素點組成了一個宏像素,兩個像素點共享一對UV像素分量。

至於U和V分量是從水平方向第一個像素採集,還是分開到兩個像素採集。如果是分開採集,是先採U分量還是先採集V分量,這個可能需要更專業的解釋了。根據我搜索到的資料,最準確的說法只是,在掃描線上,水平方向上的UV分量是Y分量的一半。

對於四個像素,YUV4:2:2格式需要4*8 + 2*8 + 2*8 = 64位,每個像素深度爲16位

YUV4:2:0

YUV4:2:2的採樣方式表示:水平和垂直方向上Y分量和UV分量對的採樣比都是2:1。

目前YUV4:2:0有兩種變體,一種用於MPEG-1標準如下圖:

在這裏插入圖片描述

另一個常用語MPEG-2標準,我們經常見到的4:2:0通常都是這種。如下圖:

在這裏插入圖片描述

對於四個像素,YUV4:2:0格式需要4*8 + 8 + 8 = 48位,每個像素深度爲12位

YUV存儲格式

YUV的存儲格式分爲打包格式(packet formats)和平面格式(planar formats)。

在打包格式中,Y,U和V組件存儲在單個數組中,YUV三個分量是順序交錯存儲。 像素被組織成宏像素組,其佈局取決於採樣格式。

在平面格式中,Y,U和V分量存儲在三個不同的平面(數組)中。YUV三個分量被分開存儲在三個不同的數組中。

4:4:4,24位像素深度

YUV4:4:4實際上表達的是:採樣模式位4:4:4的打包存儲的數據。它的存儲方式如圖:

在這裏插入圖片描述

一個小方格代表一個字節,一組連續的小方格代表一個像素。

4:2:2,16位像素深度

4:2:2的採樣格式共有兩種存儲方式

  • YUY2
  • UYVY

它們的存儲方式都是打包格式,其中每個宏像素是兩個像素,編碼爲四個連續字節。

YUY2

在YUY2格式中,中第一個字節包含第一個Y樣本,第二個字節包含第一個U(Cb)樣本,第三個字節包含第二個Y樣本,以及 第四個字節包含第一個V(Cr)樣本,如圖所示:

在這裏插入圖片描述

UYVY

這種格式與YUY2相同,只是字節順序顛倒了 - 也就是說,色度和亮度字節被翻轉,如圖:

在這裏插入圖片描述

4:2:0,12位像素深度

下面要介紹的4:2:0格式都採用了平面存儲模式,共有四種:

  • IMC2
  • IMC4
  • YV12
  • NV12

所有的4:2:0模式,色度分量無論是在水平還是垂直方向上,採樣數都是亮度分量的1/4。

IMC2

IMC2格式的存儲方式如圖:

在這裏插入圖片描述

每個分量以一個字節存儲,平面存儲格式的意思就是,先存儲視頻幀中所有的Y分量。Y分量存儲完之後,纔開始存儲色度分量。在IMC2格式中,YUV三分量的存儲關係是:先存所有的Y分量、再存所有的V分量,最後存儲U分量。

爲了便於處理和表達,通常在代碼中會以三個數組來分別裝着三個分量。

另外需要提一嘴,在IMC2格式中,存儲UV分量的內存空間步長分別是存儲Y分量的一半。另外因爲色度分量的採樣書是Y分量的1/4,所以,及時色度分量佔用空間是亮度分量的一半,也會有一些空閒的內存。

IMC4

在這裏插入圖片描述

和IMC2格式類似,只是U、V兩個色度分量的存儲順序對調了一下。

YV12&I420

在這裏插入圖片描述

YV12格式的存儲方式又有變化,存儲色度分量的內存步幅是亮度分量的一半,首先Y分量數據以unsigned char數組的形式存儲,緊跟着後面存V分量,最後存U分量。

I420和YV12的存儲方式差不多,區別的地方在於,I420的Y分量後,存儲的是U分量,最後存V分量,色度分量的存儲順序替換了一下。另外I420也被稱爲YUV420P。

YV12、I420、YUV420p這三個名詞在多媒體開發中,是出現頻率比較高的是那個了。大家不妨記憶一下

NV12

在這裏插入圖片描述

NV12格式首先存儲Y分量平面,作爲具有偶數行的無符號字符值數組。 Y平面後面緊跟着一個無符號字符值數組,其中包含打包的U(Cb)和V(Cr)樣本。

劇終

本文以理解爲主,部分講述並不代表事實,在生產場景這已經夠用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章