YUV數據格式

原文地址:https://www.cnblogs.com/Youhei/p/5245634.html

概要:

與RGB編碼方法類似,YUV也是一種顏色編碼方法,主要用於電視系統以及模擬視頻領域,它是指將亮度參量(Y:Luminance或Luma)和色度參量(UV:Chrominance或Chroma)分開進行表示的像素編碼格式。而這樣分開的好處就是不但可以避免相互干擾--沒有UV信息一樣可以顯示完整的圖像,因而解決了彩色電視與黑白電視的兼容問題;還可以降低色度的採樣率而不會對圖像質量影響太大,降低了視屏信號傳輸時對頻寬(帶寬)的要求。YUV是一個比較籠統地說法,針對它的具體排列方式,可以分爲很多種具體的格式

YUV格式類別:

  • 打包(packed)格式:將每個像素點的Y,U,V分量交叉排列並以像素點爲單元連續的存放在同一數組中,通常幾個相鄰的像素組成一個宏像素(macro-pixel)
  • 平面(planar)格式:使用三個數組分開連續的存放Y,U,V三個分量,即Y,U,V分別存放在各自的數組中。

 

YUV採樣表示法:

YUV採用A:B:C表示法來描述Y,U,V採樣頻率比例,下圖中黑點表示採樣像素點Y分量, 空心圓表示採樣像素點的UV分量。

  • 4:4:4 表示色度頻道沒有下采樣,即一個Y分量對應着一個U分量和一個V分量。
  • 4:2:2表示 2:1 的水平下采樣,沒有垂直下采樣,即每兩個Y分量共用一個U分量和一個V分量。
  • 4:2:0表示 2:1 的水平下采樣,2:1 的垂直下采樣,即每四個Y分量共用一個U分量和一個V分量。
  • 4:1:1表示 4:1 的水平下采樣,沒有垂直下采樣。即每四個Y分量共用一個U分量或一個V分量,與其他格式相比,4:1:1 採樣不太常用。

 

YUV數據存儲:

下面以每個分量數據存儲在一個char(或byte)中爲例描述YUV的數據存儲方式, 圖中每個方格表示一個chat。

(1). 4:4:4格式,每像素32位

推薦一個 4:4:4 格式,FOURCC 碼爲 AYUV。這是一個打包格式,其中每個像素都被編碼爲四個連續字節,其組織順序如下所示,其中A標示了alpha通道。

 

(2). 4:2:2格式,每像素16位

支持兩個 4:2:2 格式,FOURCC 碼如爲YUY2UYVY。兩個都是打包格式,其中每個巨像素都是編碼爲四個連續字節的兩個像素。這樣會使得色度水平下采樣乘以係數 2

  • YUY2

在 YUY2 格式中,數據可被視爲一個不帶正負號的 char 值組成的數組,其中第一個字節存儲第一個 Y 樣例,第二個字節存儲第一個 U (Cb) 樣例,第三個字節存儲第二個 Y 樣例,第四個字節存儲第一個 V (Cr) 樣例,如下圖。

如果該圖像被看作由兩個 little-endian WORD 值組成的數組,則第一個 WORD 在最低有效位(LSB) 中包含 Y0,在最高有效位 (MSB) 中包含 U0。第二個 WORD 在 LSB 中包含 Y1,在 MSB 中包含 V0

  • UYVY

 

此格式與 YUY2 相同,只是字節順序是與之相反的。

如果該圖像被看作由兩個 little-endian WORD 值組成的數組,則第一個 WORD 在 LSB 中包含 U0,在 MSB 中包含 Y0,第二個 WORD 在 LSB 中包含 V0,在 MSB 中包含 Y1。

 

(3). 4:2:0格式,每像素16位

推薦兩個 4:2:0 每像素 16 位格式,FOURCC 碼:IMC1IMC3兩個 FOURCC 碼都是平面格式。色度頻道在水平方向和垂直方向上都要以係數 2 來進行再次採樣。

  • IMC1

 

所有 Y 樣例都會作爲不帶正負號的 char 值組成的數組首先存儲在內存中。後面跟着存儲所有 V (Cr) 樣例,然後是所有 U (Cb) 樣例。V 和 U 平面與 Y 平面具有相同的跨距(即存儲數組的寬度),從而遺留了如下圖所示的未使用的內存區域。

  • IMC3

 

此格式與 IMC1 相同,只是 U 和 V 平面進行了交換

 

(4). 4:2:0格式,每像素12位

推薦四個 4:2:0 每像素 12 位格式,FOURCC 碼:IMC2, IMC4, YV12, NV12。在所有這些格式中,色度頻道在水平方向和垂直方向上都要以係數 2 來進行再次採樣

  • IMC2

 

此格式與 IMC1 相同,只是 V (Cr) 和 U (Cb) 行在半跨距邊界處進行了交錯。換句話說,就是色度區域中的每個完整跨距行都以一行 V 樣例開始,然後是一行在下一個半跨距邊界處開始的 U 樣例。

此佈局與 IMC1 相比,IMC2能夠更加高效地利用存儲空間。它的色度存儲空間縮小了一半,因此整體存儲空間縮小了 25%。在各個 4:2:0 格式中,IMC2 是第二首選格式,排在 NV12 之後。

  • IMC4

 

此格式與 IMC2 相同,只是 U (Cb) 和 V (Cr) 行進行了交換

  • YV12(YU12格式和YV12存儲格式基本相同,只是UV存儲位置互換)

所有 Y 樣例都會作爲不帶正負號的 char 值組成的數組首先存儲在內存中。此數組後面緊接着存儲所有 V (Cr) 樣例。V 平面的跨距爲 Y 平面跨距的一半,V 平面包含的行爲 Y 平面包含行的一半。V 平面後面緊接着存儲所有 U (Cb) 樣例,它的跨距和行數與 V 平面相同。

  • NV12(NV21格式和NV12存儲格式基本相同,只是UV存儲位置互換)

 

所有 Y 樣例都會作爲由不帶正負號的 char 值組成的數組首先存儲在內存中,並且行數爲偶數。Y 平面後面緊接着一個由不帶正負號的 char 值組成的數組,其中包含了打包的 U (Cb) 和 V (Cr) 樣例。

當組合的 U-V 數組被視爲一個由 little-endian WORD 值組成的數組時,LSB 包含 U 值,MSB包含 V 值。NV12 是用於 DirectX VA 的首選 4:2:0 像素格式。

 

YUV數據轉換:

(1). 4:2:2 -> 4:2:0的有損壓縮轉換

  Y存儲數據不變,對U和V分量在行垂直下采樣進行隔行抽樣。

 

(2). 4:2:0 -> 4:2:2的補足轉換

  Y存儲數據不變,對U和V分量在行垂直下采樣進行隔行拷貝補足下一行色度數據。

在YUV中,一個像素點對應一個Y分量,同一圖像無論是4:4:4, 4:2:2, 4:2:0, 4:1:1的格式,其中Y分量數據都是完全相同的。YUV420sp和YUV420p的數據存儲格式區別在於UV分量排列的順序不同,YUV420p是先存儲完U分量後再存儲V分量,也就是說UV分量各自都是連續的,而YUV420sp則交叉存儲UV分量,因此一個YUV420圖片的存儲空間爲:

  Y分量 = width * hight

  U分量 = Y / 4

  V分量 = Y / 4

  YUV420圖像存儲空間 = width * hight * 3 / 2

例如一張分辨率爲8X4的YUV420圖像,數據存儲格式如下圖:

YUV420sp格式

YUV420p格式

 

YUV圖像旋轉算法:

下面以YUV420sp格式圖像爲例給出旋轉90的算法。

public void rotateYUV420sp(byte[] src,byte[] des, int width, intheight) {
    intlength = width * height;
    intk = 0;
    for(inti = 0; i < width; i++) {
        for(intj = 0; j < height; j++) {
            des[k] = src[width * j + i];
            k++;
        }
    }
 
    for(inti = 0; i < width; i + =2) {
        for(intj = 0; j < height /2; j++) {
            des[k]     = src[length + width * j + i];
            des[k +1] = src[length + width * j + i +1];
            k +=2;
        }
    }
}


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