YUV数据格式详解
最近看代碼對 plane 存疑惑,幸虧這篇文章!!!
轉自: http://www.xuebuyuan.com/1541892.html?? & ?http://www.techbulo.com/256.html
?
?
YUV格式有兩大類:planar和packed。
對于planar的YUV格式,先連續存儲所有像素點的Y,緊接著存儲所有像素點的U,隨后是所有像素點的V。
對于packed的YUV格式,每個像素點的Y,U,V是連續交*存儲的。
?
YUV,分為三個分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。
??? 與我們熟知的RGB類似,YUV也是一種顏色編碼方法,主要用于電視系統以及模擬視頻領域,它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視的兼容問題。并且,YUV不像RGB那樣要求三個獨立的視頻信號同時傳輸,所以用YUV方式傳送占用極少的頻寬。
YUV碼流的存儲格式其實與其采樣的方式密切相關,主流的采樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0,關于其詳細原理,可以通過網上其它文章了解,這里我想強調的是如何根據其采樣格式來從碼流中還原每個像素點的YUV值,因為只有正確地還原了每個像素點的YUV值,才能通過YUV與RGB的轉換公式提取出每個像素點的RGB值,然后顯示出來。
??? 用三個圖來直觀地表示采集的方式吧,以黑點表示采樣該像素點的Y分量,以空心圓圈表示采用該像素點的UV分量。
?
先記住下面這段話,以后提取每個像素的YUV分量會用到。
- YUV?4:4:4采樣,每一個Y對應一組UV分量。
- YUV?4:2:2采樣,每兩個Y共用一組UV分量。?
- YUV?4:2:0采樣,每四個Y共用一組UV分量。?
2.? 存儲方式
??? 下面我用圖的形式給出常見的YUV碼流的存儲方式,并在存儲方式后面附有取樣每個像素點的YUV數據的方法,其中,Cb、Cr的含義等同于U、V。
(1) YUVY 格式 (屬于YUV422)
?
YUYV為YUV422采樣的存儲格式中的一種,相鄰的兩個Y共用其相鄰的兩個Cb、Cr,分析,對于像素點Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00,其他的像素點的YUV取值依次類推。
(2) UYVY 格式 (屬于YUV422)
UYVY格式也是YUV422采樣的存儲格式中的一種,只不過與YUYV不同的是UV的排列順序不一樣而已,還原其每個像素點的YUV值的方法與上面一樣。
?
(3) YUV422P(屬于YUV422)
?
YUV422P
?
YUV422P也屬于YUV422的一種,它是一種Plane模式,即平面模式,并不是將YUV數據交錯存儲,而是先存放所有的Y分量,然后存儲所有的U(Cb)分量,最后存儲所有的V(Cr)分量,如上圖所示。其每一個像素點的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即兩個Y共用一個UV。比如,對于像素點Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00。
(4)YV12,YU12格式(屬于YUV420)
YV12,YU12格式
?
YU12和YV12屬于YUV420格式,也是一種Plane模式,將Y、U、V分量分別打包,依次存儲。其每一個像素點的YUV數據提取遵循YUV420格式的提取方式,即4個Y分量共用一組UV。注意,上圖中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次類推。
(5)NV12、NV21(屬于YUV420)
NV12、NV21
?
NV12和NV21屬于YUV420格式,是一種two-plane模式,即Y和UV分為兩個Plane,但是UV(CbCr)為交錯存儲,而不是分為三個plane。其提取方式與上一種類似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
YUV420 planar數據, 以720×488大小圖象YUV420 planar為例,( 注:表示 720*488 個像素點)
其存儲格式是: 共大小為(720×480×3>>1)字節,
分為三個部分:Y,U和V
Y分量:????(720×480)個字節??
U(Cb)分量:(720×480>>2)個字節
V(Cr)分量:(720×480>>2)個字節
?
Y U V Y U V
Y U V Y U V???????? 4Y + 4 U + 4V? ---> 12
-------Y 的數量不變,U V 各只取1/4-->
Y U Y
Y V Y?????????? ? Y---?4? + ?U --1 +? V ---1? ->?6?? 壓縮一半 , 因此在計算YUV420 大小時,通常會(W*H *3)/2? (3 表示一個像素點有YUV各一個,除以2表示壓縮一半)
保存的時候是 Y單獨存貯一個數組, UV 打包存貯一個數組??? --- 2個 plane的形式
?
三個部分內部均是行優先存儲,三個部分之間是Y,U,V 順序存儲。
即YUV數據的0--720×480字節是Y分量值, ????????
720×480--720×480×5/4字節是U分量 ???
720×480×5/4 --720×480×3/2字節是V分量。
4 :2: 2 和4:2:0 轉換:
最簡單的方式:
YUV4:2:2 ---> YUV4:2:0??Y不變,將U和V信號值在行(垂直方向)在進行一次隔行抽樣。 YUV4:2:0 ---> YUV4:2:2??Y不變,將U和V信號值的每一行分別拷貝一份形成連續兩行數據。
在YUV420中,一個像素點對應一個Y,一個4X4的小方塊對應一個U和V。對于所有YUV420圖像,它們的Y值排列是完全相同的,因為只有Y的圖像就是灰度圖像。YUV420sp與YUV420p的數據格式它們的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是說UV它們是連續的。而420sp它是UV、UV這樣交替存放的。(見下圖) 有了上面的理論,我就可以準確的計算出一個YUV420在內存中存放的大小。
width * hight =Y(總和) U = Y / 4 ? V = Y / 4
?
所以YUV420 數據在內存中的長度是 width * hight * 3 / 2,
假設一個分辨率為8X4的YUV圖像,它們的格式如下圖:
??????????????????????YUV420sp格式如下圖??????????????????????????????????????????????????????????
?
? ? ? ??? ? ?
?????????????????????? ?YUV420p數據格式如下圖
? ? ? ? ? ?
旋轉90度的算法:
public static void rotateYUV240SP(byte[] src,byte[] des,int width,int height)
{
int wh = width * height;
//旋轉Y
int k = 0;
for(int i=0;i<width;i++)
{
for(int j=0;j<height;j++)
{
des[k] = src[width*j + i];
k++;
}
}
for(int i=0;i<width;i+=2)
{
for(int j=0;j<height/2;j++)
{
des[k] = src[wh+ width*j + i];
des[k+1]=src[wh + width*j + i+1];
k+=2;
}
}
}
YV12和I420的區別???????
?一般來說,直接采集到的視頻數據是RGB24的格式,RGB24一幀的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV標準格式4:2:0)的數據量是 size=width×heigth×1.5 Bit。 ? ? ? 在采集到RGB24數據后,需要對這個格式的數據進行第一次壓縮。即將圖像的顏色空間由RGB2YUV。因為,X264在進行編碼的時候需要標準的YUV(4:2:0)。但是這里需要注意的是,雖然YV12也是(4:2:0),但是YV12和I420的卻是不同的,在存儲空間上面有些區別。如下:
YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
可以看出,YV12和I420基本上是一樣的,就是UV的順序不同。
繼續我們的話題,經過第一次數據壓縮后RGB24->YUV(I420)。這樣,數據量將減少一半,為什么呢?呵呵,這個就太基礎了,我就不多寫了。同樣,如果是RGB24->YUV(YV12),也是減少一半。但是,雖然都是一半,如果是YV12的話效果就有很大損失。然后,經過X264編碼后,數據量將大大減少。將編碼后的數據打包,通過RTP實時傳送。到達目的地后,將數據取出,進行解碼。完成解碼后,數據仍然是YUV格式的,所以,還需要一次轉換,這樣windows的驅動才可以處理,就是YUV2RGB24。
YUY2?
是 4:2:2??[Y0 U0 Y1 V0]
?
yuv420p 和 YUV420的區別 在存儲格式上有區別
yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv
???? YUV420P,Y,U,V三個分量都是平面格式,分為I420和YV12。I420格式和YV12格式的不同處在U平面和V平面的位置不同。在I420格式中,U平面緊跟在Y平面之后,然后才是V平面(即:YUV);但YV12則是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12與NV21類似,U 和 V 交錯排列,不同在于UV順序。
I420: YYYYYYYY UU VV??? =>YUV420P
YV12: YYYYYYYY VV UU??? =>YUV420P
NV12: YYYYYYYY UVUV???? =>YUV420SP
NV21: YYYYYYYY VUVU???? =>YUV420SP
?
YUV是指亮度參量和色度參量分開表示的像素格式,而這樣分開的好處就是不但可以避免相互干擾,還可以降低色度的采樣率而不會對圖像質量影響太大。YUV是一個比較籠統地說法,針對它的具體排列方式,可以分為很多種具體的格式。
YUV格式解析1(播放器——project2)
根據板卡api設計實現yuv420格式的視頻播放器 打開*.mp4;*.264類型的文件,實現其播放。 使用的視頻格式是YUV420格式 YUV格式通常有兩大類:打包(packed)格式和平面(planar)格式。前者將YUV分量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而后者使用三個數組分開存放YUV三個分量,就像是一個三維平面一樣。表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。(注意:在介紹各種具體格式時,YUV各分量都會帶有下標,如Y0、U0、V0表示第一個像素的YUV分量,Y1、U1、V1表示第二個像素的YUV分量,以此類推。) MEDIASUBTYPE_YUY2 YUY2格式,以4:2:2方式打包 MEDIASUBTYPE_YUYV YUYV格式(實際格式與YUY2相同) MEDIASUBTYPE_YVYU YVYU格式,以4:2:2方式打包 MEDIASUBTYPE_UYVY UYVY格式,以4:2:2方式打包 MEDIASUBTYPE_AYUV 帶Alpha通道的4:4:4 YUV格式 MEDIASUBTYPE_Y41P Y41P格式,以4:1:1方式打包 MEDIASUBTYPE_Y411 Y411格式(實際格式與Y41P相同) MEDIASUBTYPE_Y211 Y211格式 MEDIASUBTYPE_IF09 IF09格式 MEDIASUBTYPE_IYUV IYUV格式 MEDIASUBTYPE_YV12 YV12格式 MEDIASUBTYPE_YVU9 YVU9格式 ?????????????? 表2.3
YUV 采樣
YUV 的優點之一是,色度頻道的采樣率可比 Y 頻道低,同時不會明顯降低視覺質量。有一種表示法可用來描述 U 和 V 與 Y 的采樣頻率比例,這個表示法稱為 A:B:C 表示法:
| ? |
4:4:4 表示色度頻道沒有下采樣。 |
| ? |
4:2:2 表示 2:1 的水平下采樣,沒有垂直下采樣。對于每兩個 U 樣例或 V 樣例,每個掃描行都包含四個 Y 樣例。 |
| ? |
4:2:0 表示 2:1 的水平下采樣,2:1 的垂直下采樣。 |
| ? |
4:1:1 表示 4:1 的水平下采樣,沒有垂直下采樣。對于每個 U 樣例或 V 樣例,每個掃描行都包含四個 Y 樣例。與其他格式相比,4:1:1 采樣不太常用,本文不對其進行詳細討論。 |
圖 1 顯示了 4:4:4 圖片中使用的采樣網格。燈光樣例用叉來表示,色度樣例則用圈表示。
4:2:2 采樣的這種主要形式在 ITU-R Recommendation BT.601 中進行了定義。圖 2 顯示了此標準定義的采樣網格。
4:2:0 采樣有兩種常見的變化形式。其中一種形式用于 MPEG-2 視頻,另一種形式用于 MPEG-1 以及 ITU-T recommendations H.261 和 H.263。圖 3 顯示了 MPEG-1 方案中使用的采樣網格,圖 4 顯示了 MPEG-2 方案中使用的采樣網格。
與 MPEG-1 方案相比,在 MPEG-2 方案與為 4:2:2 和 4:4:4 格式定義的采樣網格之間進行轉換更簡單一些。因此,在 Windows 中首選 MPEG-2 方案,應該考慮將其作為 4:2:0 格式的默認轉換方案。
表面定義
本節講述推薦用于視頻呈現的 8 位 YUV 格式。這些格式可以分為幾個類別:
| ? |
4:4:4 格式,每像素 32 位 |
| ? |
4:2:2 格式,每像素 16 位 |
| ? |
4:2:0 格式,每像素 16 位 |
| ? |
4:2:0 格式,每像素 12 位 |
首先,您應該理解下列概念,這樣才能理解接下來的內容:
| ? |
表面原點。對于本文講述的 YUV 格式,原點 (0,0) 總是位于表面的左上角。 |
| ? |
跨距。表面的跨距,有時也稱為間距,指的是表面的寬度,以字節數表示。對于一個表面原點位于左上角的表面來說,跨距總是正數。 |
| ? |
對齊。表面的對齊是根據圖形顯示驅動程序的不同而定的。表面始終應該 DWORD 對齊,就是說,表面中的各個行肯定都是從 32 位 (DWORD) 邊界開始的。對齊可以大于 32 位,但具體取決于硬件的需求。 |
| ? |
打包格式與平面格式。YUV 格式可以分為打包 格式和平面 格式。在打包格式中,Y、U 和 V 組件存儲在一個數組中。像素被組織到了一些巨像素組中,巨像素組的布局取決于格式。在平面格式中,Y、U 和 V 組件作為三個單獨的平面進行存儲。 |
4:4:4 格式,每像素 32 位
推薦一個 4:4:4 格式,FOURCC 碼為 AYUV。這是一個打包格式,其中每個像素都被編碼為四個連續字節,其組織順序如下所示。
標記了 A 的字節包含 alpha 的值。
4:2:2 格式,每像素 16 位
支持兩個 4:2:2 格式,FOURCC 碼如下:
| ? |
YUY2 |
| ? |
UYVY |
兩個都是打包格式,其中每個巨像素都是編碼為四個連續字節的兩個像素。這樣會使得色度水平下采樣乘以系數 2。
YUY2
在 YUY2 格式中,數據可被視為一個不帶正負號的 char 值組成的數組,其中第一個字節包含第一個 Y 樣例,第二個字節包含第一個 U (Cb) 樣例,第三個字節包含第二個 Y 樣例,第四個字節包含第一個 V (Cr) 樣例,如圖 6 所示。
如果該圖像被看作由兩個 little-endian WORD 值組成的數組,則第一個
WORD 在最低有效位 (LSB) 中包含 Y0,在最高有效位 (MSB) 中包含 U。第二個 WORD 在 LSB 中包含 Y1,在 MSB 中包含 V。
YUY2 是用于 Microsoft DirectX? Video Acceleration (DirectX VA) 的首選 4:2:2 像素格式。預期它會成為支持 4:2:2 視頻的 DirectX VA 加速器的中期要求。
UYVY
此格式與 YUY2 相同,只是字節順序是與之相反的 — 就是說,色度字節和燈光字節是翻轉的(圖 7)。如果該圖像被看作由兩個 little-endian
WORD 值組成的數組,則第一個 WORD 在 LSB 中包含 U,在 MSB 中包含 Y0,第二個
WORD 在 LSB 中包含 V,在 MSB 中包含 Y1。
4:2:0 格式,每像素 16 位
推薦兩個 4:2:0 每像素 16 位格式,FOURCC 碼如下:
| ? |
IMC1 |
| ? |
IMC3 |
兩個 FOURCC 碼都是平面格式。色度頻道在水平方向和垂直方向上都要以系數 2 來進行再次采樣。
IMC1
所有 Y 樣例都會作為不帶正負號的 char 值組成的數組首先顯示在內存中。后面跟著所有 V (Cr) 樣例,然后是所有 U (Cb) 樣例。V 和 U 平面與 Y 平面具有相同的跨距,從而生成如圖 8 所示的內存的未使用區域。
IMC3
此格式與 IMC1 相同,只是 U 和 V 平面進行了交換:
4:2:0 格式,每像素 12 位
推薦四個 4:2:0 每像素 12 位格式,FOURCC 碼如下:
| ? |
IMC2 |
| ? |
IMC4 |
| ? |
YV12 |
| ? |
NV12 |
在所有這些格式中,色度頻道在水平方向和垂直方向上都要以系數 2 來進行再次采樣。
IMC2
此格式與 IMC1 相同,只是 V (Cr) 和 U (Cb) 行在半跨距邊界處進行了交錯。換句話說,就是色度區域中的每個完整跨距行都以一行 V 樣例開始,然后是一行在下一個半跨距邊界處開始的 U 樣例(圖 10)。此布局與 IMC1 相比,能夠更加高效地利用地址空間。它的色度地址空間縮小了一半,因此整體地址空間縮小了 25%。在各個 4:2:0 格式中,IMC2 是第二首選格式,排在 NV12 之后。
IMC4
此格式與 IMC2 相同,只是 U (Cb) 和 V (Cr) 行進行了交換:
YV12
所有 Y 樣例都會作為不帶正負號的 char 值組成的數組首先顯示在內存中。此數組后面緊接著所有 V (Cr) 樣例。V 平面的跨距為 Y 平面跨距的一半,V 平面包含的行為 Y 平面包含行的一半。V 平面后面緊接著所有 U (Cb) 樣例,它的跨距和行數與 V 平面相同(圖 12)。
NV12
所有 Y 樣例都會作為由不帶正負號的 char 值組成的數組首先顯示在內存中,并且行數為偶數。Y 平面后面緊接著一個由不帶正負號的
char 值組成的數組,其中包含了打包的 U (Cb) 和 V (Cr) 樣例,如圖 13 所示。當組合的 U-V 數組被視為一個由 little-endian
WORD 值組成的數組時,LSB 包含 U 值,MSB 包含 V 值。NV12 是用于 DirectX VA 的首選 4:2:0 像素格式。預期它會成為支持 4:2:0 視頻的 DirectX VA 加速器的中期要求。
YUV格式解析2
又確認了一下H264的視頻格式——H264支持4:2:0的連續或隔行視頻的編碼和解碼 YUV(亦稱YCrCb)是被歐洲電視系統所采用的一種顏色編碼方法(屬于PAL)。YUV主要用于優化彩色視頻信號的傳輸,使其向后兼容老式黑白電視。與RGB視頻信號傳輸相比,它最大的優點在于只需占用極少的帶寬(RGB要求三個獨立的視頻信號同時傳輸)。其中“Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V”表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。“亮度”是通過RGB輸入信號來創建的,方法是將RGB信號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面—色調與飽和度,分別用Cr和CB來表示。其中,Cr反映了GB輸入信號紅色部分與RGB信號亮度值之間的差異。而CB反映的是RGB輸入信號藍色部分與RGB信號亮度值之同的差異。?? 補充一下場的概念—— 場的概念不是從DV才開始有的,電視系統已經有了(當然,DV和電視的關系大家都知道)歸根結底還是掃描的問題,具體到PAL制式是:
每秒25幀,每幀兩場,掃描線(包括電視機的電子束)自上而下先掃描一場,然后再自上而下掃描第二場
之所以引入場的概念,我的理解是主要為了在有限的帶寬和成本內使畫面運動更加平滑和消除閃爍感。
這兩個場的掃描線是一條一條互相間隔開的,比如說對于一個幀來講,最上面一條線編號為0,緊挨著的是1,再下來是2,3,4,5,6。。。。那么第一場也許是0,2,4,6;也許是1,3,5,7——這就是隔行掃描
在逐行掃描模式下,就是掃描線按照0,1,2,3,4,5的順序依次掃描,很明顯,這時候就不存在場的概念了。 下面區分一下YUV和YCbCr YUV色彩模型來源于RGB模型, 該模型的特點是將亮度和色度分離開,從而適合于圖像處理領域。 應用:模擬領域 Y'= 0.299*R' + 0.587*G' + 0.114*B' U'= -0.147*R' - 0.289*G' + 0.436*B' = 0.492*(B'- Y') V'= 0.615*R' - 0.515*G' - 0.100*B' = 0.877*(R'- Y') R' = Y' + 1.140*V' G' = Y' - 0.394*U' - 0.581*V' B' = Y' + 2.032*U' YCbCr模型來源于YUV模型。YCbCr是 YUV 顏色空間的偏移版本. 應用:數字視頻,ITU-R BT.601建議 Y’ = 0.257*R' + 0.504*G' + 0.098*B' + 16 Cb' = -0.148*R' - 0.291*G' + 0.439*B' + 128 Cr' = 0.439*R' - 0.368*G' - 0.071*B' + 128 R' = 1.164*(Y’-16) + 1.596*(Cr'-128) G' = 1.164*(Y’-16) - 0.813*(Cr'-128) - 0.392*(Cb'-128) B' = 1.164*(Y’-16) + 2.017*(Cb'-128) PS: 上面各個符號都帶了一撇,表示該符號在原值基礎上進行了伽馬校正,伽馬校正有助于彌補在抗鋸齒的過程中,線性分配伽馬值所帶來的細節損失,使圖像細節更加豐富。在沒有采用伽馬校正的情況下,暗部細節不容易顯現出來,而采用了這一圖像增強技術以后,圖像的層次更加明晰了。 所以說H264里面的YUV應屬于YCbCr.
下面再仔細談談YUV格式, YUV格式通常有兩大類:打包(packed)格式和平面(planar)格式。前者將YUV分量存放在同一個數組中,通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而后者使用三個數組分開存放YUV三個分量,就像是一個三維平面一樣。 我們常說得YUV420屬于planar格式的YUV,
顏色比例如下: Y0U0V0???????????? Y1???????????????? Y2U2V2????????????????????? Y3 Y4???????????????? Y5???????????????? Y6????????????????????????? Y7 Y8U8V8???????????? Y9???????????????? Y10U10V10?????????????????? Y11 Y12??????????????? Y13??????????????? Y14???????????????????????? Y15 其他格式YUV可以點這里查看詳細內容, 而在YUV文件中YUV420又是怎么存儲的呢? 在常見H264測試的YUV序列中,例如CIF圖像大小的YUV序列(352*288),在文件開始并沒有文件頭,直接就是YUV數據,先存第一幀的Y信息,長度為352*288個byte, 然后是第一幀U信息長度是352*288/4個byte, 最后是第一幀的V信息,長度是352*288/4個byte, 因此可以算出第一幀數據總長度是352*288*1.5,即152064個byte,
如果這個序列是300幀的話, 那么序列總長度即為152064*300=44550KB,這也就是為什么常見的300幀CIF序列總是44M的原因.
4:4:4采樣就是說三種元素Y,Cb,Cr有同樣的分辨率,這樣的話,在每一個像素點上都對這三種元素進行采樣.數字4是指在水平方向上對于各種元素的采樣率,比如說,每四個亮度采樣點就有四個Cb的Cr采樣值.4:4:4采樣完整地保留了所有的信息值.4:2:2采樣中(有時記為YUY2),色度元素在縱向與亮度值有同樣的分辨率,而在橫向則是亮度分辨率的一半(4:2:2表示每四個亮度值就有兩個Cb和Cr采樣.)4:2:2視頻用來構造高品質的視頻彩色信號.
在流行的4:2:0采樣格式中(常記為YV12)Cb和Cr在水平和垂直方向上有Y分辨率的一半.4:2:0有些不同,因為它并不是指在實際采樣中使用4:2:0,而是在編碼史中定義這種編碼方法是用來區別于4:4:4和4:2:2方法的).4:2:0采樣被廣泛地應用于消費應用中,比如視頻會議,數字電視和DVD存儲中。因為每個顏色差別元素中包含了四分之一的Y采樣元素量,那么4:2:0YCbCr視頻需要剛好4:
4:4或RGB視頻中采樣量的一半。
4:2:0采樣有時被描述是一個"每像素12位"的方法。這么說的原因可以從對四個像素的采樣中看出. 使用4:4:4采樣,一共要進行12次采樣,對每一個Y,Cb和Cr,就需要12*8=96位,平均下來要96/4=24位。使用4:2:0就需要6*8 =48位,平均每個像素48/4=12位。
在一個4:2:0隔行掃描的視頻序列中,對應于一個完整的視頻幀的Y,Cb,Cr采樣分配到兩個場中。可以得到,隔行掃描的總采樣數跟漸進式掃描中使用的采樣數目是相同的。
對比一下: Y41P(和Y411)(packed格式)格式為每個像素保留Y分量,而UV分量在水平方向上每4個像素采樣一次。一個宏像素為12個字節,實際表示8個像素。圖像數據中YUV分量排列順序如下: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y8 … IYUV格式(planar)為每個像素都提取Y分量,而在UV分量的提取時,首先將圖像分成若干個2 x 2的宏塊,然后每個宏塊提取一個U分量和一個V分量。YV12格式與IYUV類似,但仍然是平面模式。 YUV411、YUV420格式多見于DV數據中,前者用于NTSC制,后者用于PAL制。YUV411為每個像素都提取Y分量,而UV分量在水平方向上每4個像素采樣一次。YUV420并非V分量采樣為0,而是跟YUV411相比,在水平方向上提高一倍色差采樣頻率,在垂直方向上以U/V間隔的方式減小一半色差采樣,如下圖所示。 (好像顯示不出來突下圖像)
各種格式的具體使用位數的需求(使用4:2:0采樣,對于每個元素用8個位大小表示):
格式: Sub-QCIF 亮度分辨率: 128*96?? 每幀使用的位: 147456
格式: QCIF?? 亮度分辨率: 176*144?? 每幀使用的位: 304128
格式: CIF?? 亮度分辨率: 352*288?? 每幀使用的位: 1216512
格式: 4CIF?? 亮度分辨率: 704*576?? 每幀使用的位: 4866048
?
?
另:關于 RGB 和 YUV & RAW
http://www.360doc.com/content/12/1220/15/6973384_255299820.shtml
在Camera Sensor中,最常用的YUV模型是 YUV422格式,因為它采用4個字節描述兩個像素,能和RGB565模型比較好的兼容。有利于Camera Sensor和Camera controller的軟硬件接口設計 ---------- 看代碼HAL層好像用的是 YUV420SP?????????????????????? (8:4:4 ---> 2個字節一個像素 ,而YUV420 一般為 16位或12位 ,16位怎么理解 ?)
多數情況下,我們需要的還是YUV2RGB的轉換,因為從Sensor得到的數據通常我們會用YUV數據,此外JPG和MPEG實際上也是基于YUV格式編碼的,所以要顯示解碼后的數據需要的也是YUV2RGB的運算
?
RGB
對一種顏色進行編碼的方法統稱為“顏色空間”或“色域”。用最簡單的話說,世界上任何一種顏色的“顏色空間”都可定義成一個固定的數字或變量。RGB(紅、綠、藍)只是眾多顏色空間的一種。採用這種編碼方法,每種顏色都可用三個變量來表示─紅色、綠色以及藍色的強度。記錄及顯示彩色圖像時, RGB是最常見的一種方案。但是,它缺乏與早期黑白顯示系統的良好相容性。因此,大多電子電器廠商普遍採用的做法是,將RGB轉換成YUV顏色空間,以維持相容性,再根據需要換回RGB格式,以便在電腦顯示器上顯示彩色圖形。
YUV
YUV(亦稱YCrCb)是被歐洲電視系統所採用的一種顏色編碼方法(屬於PAL)。在現代彩色電視系統中,通常採用三管彩色攝影機或彩色CCD攝影機進行取像,然後把取得的彩色圖像信號經分色、分別放大校正後得到RGB,再經過矩陣變換電路得到亮度信號Y和兩個色差信號R-Y(即U)、B-Y(即V),最後發送端將亮度和色差三個信號分別進行編碼,用同一信道發送出去。這種色彩的表示方法就是所謂的YUV色彩空間表示。採用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。如果只有 Y信號分量而沒有U、V信號分量,那麼這樣表示的圖像就是黑白灰度圖像。彩色電視採用YUV空間正是為了用亮度信號Y解決彩色電視機與黑白電視機的相容問題,使黑白電視機也能接收彩色電視信號。YUV主要用於優化彩色視頻信號的傳輸,使其向後相容老式黑白電視。與RGB視頻信號傳輸相比,它最大的優點在於只需佔用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)。其中“Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏色。“亮度”是透過RGB輸入信號來建立的,方法是將RGB信號的特定部分疊加到一起。“色度”則定義了顏色的兩個方面─色調與飽和度,分別用Cr和CB來表示。其中,Cr反映了GB輸入信號紅色部分與RGB信號亮度值之間的差異。而CB反映的是RGB輸入信號藍色部分與RGB信號亮度值之同的差異。
YUV與RGB相互轉換的公式如下(RGB取值範圍均為0-255)︰
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
?
http://itbbs.pconline.com.cn/dc/15987147.html
關于 RAW 文件
RAW英文譯為原料。理解RAW格式,首先需要大致了解數碼相機的實際成像過程。我們按下快門后,光線通過鏡頭照射到相機的感光元件上,感光元件將其轉換為形成影像數據的電子信號。簡而言之,這些電子信號就是組成RAW文件的主要原料。和JPEG格式不同的是,RAW格式并沒有一個統一的標準。各大廠各行其是,使用的RAW文件格式各不相同,甚至同一廠商不同型號相機之間使用的標準也不一樣。RAW文件是一個數據包文件,而非圖像文件。我們的電腦并不知道應該如何解讀這種數據包,和JPEG等標準格式不同的是,RAW文件并不包含供電腦解碼所需的信息。
?
?
http://blog.chinaunix.net/uid-20424888-id-96045.html
YUV圖像格式
數碼圖像以色差端子來說,分為3個部分,Y,Cb,Cr(Y,U,V),而我們對這三個部分中的亮度最為敏感,為了減小這種圖片或視頻的大小,人們就用了偷工減料的方法,將U,V減少,達到減小存儲的空間.常見的YUV格式為YUV422,YUV420,YUV444;YUV格式通常有兩大類:打包(packed)格式和平面(planar)格式。前者將YUV分量存放在同一個數組中(就是數組中yuv混合存放),通常是幾個相鄰的像素組成一個宏像素(macro-pixel);而planar模式使用三個數組分開存放YUV三個分量,如先存放Y,再存U再存V;
1)YUV444格式是完全沒有刪減最逼真的格式,每4個Y,配有4個V,4個U.每個pixel 32bit
?
2)YUV422格式則是UV減半的格式,既是4個Y搭2個U兩個V。每個pixel 16bit
?2-1 YUV2
如下YUV2格式中,數據可被視為一個不帶正負號的 char 值組成的數組,其中第一個字節包含第一個 Y 樣例,第二個字節包含第一個 U (Cb) 樣例,第三個字節包含第二個 Y 樣例,第四個字節包含第一個 V (Cr) 樣例
?
2-2 UYVY
此格式與 YUY2 相同,只是字節順序是與之相反的 — 就是說,色度字節和燈光字節是翻轉的(圖 7)。如果該圖像被看作由兩個 little-endian WORD 值組成的數組,則第一個 WORD 在 LSB 中包含 U,在 MSB 中包含 Y0,第二個 WORD 在 LSB 中包含 V,在 MSB 中包含 Y1。
3)YUV420格式則是UV減為1/4的格式,既是4個Y搭1個V,1個U,一般為16位或12位.
YUV2:這個格式又被寫為YUYV,屬于YUV422的一種
這里使用的是YUV2格式,像素數據的使用packed模式打包的,意思就是所有的Y/U/V數據都在一個數組內存儲。存儲的格式如下面的簡圖所示:
| Y0 | U0 | Y1 | V0 | Y2 | U2 | Y3 | V2 | Y4 | U4 | Y5 | V4 | … |
如上圖所示,Y0-U0-Y1-V0是一個宏像素,但是其中缺少U1和V1,這就是YUV422的原理,對于四個像素,只采樣其中的兩個像素的U和 V,這里是采樣了偶數下標像素的U和V,所以需要用相鄰的像素中的U和V來補全單數下標像素的U和V。這里簡單的采用相鄰補全的算法。既U1和V1將由 U0/U2和V0/V2的和的均值補全。采用這種算法速度很快,簡單,但將丟失圖像列上的U/V信息。
所以
單數下標的U/V的公式如下:
U1 = (U0+U2)/2
V1 = (V0+V2)/2
對于邊界的處理,既每一行的最后一個像素的U和V,則直接取前一個像素的U,V
?
?
總結
- 上一篇: Codeforces Round #58
- 下一篇: Codeforces Round #58