yuv格式有兩大類:planar和packed。
對於planar的yuv格式,先連續儲存所有畫素點的y,緊接著儲存所有畫素點的u,隨後是所有畫素點的v。
對於packed的yuv格式,每個畫素點的y,u,v是連續交*儲存的。
yuv,分為三個分量,「y」表示明亮度(luminance或luma),也就是灰度值;而「u」和「v」 表示的則是色度(chrominance或chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色。
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也屬於yuv422的一種,它是一種plane模式,即平面模式,並不是將yuv資料交錯儲存,而是先存放所有的y分量,然後儲存所有的u(cb)分量,最後儲存所有的v(cr)分量,如上圖所示。其每乙個畫素點的yuv值提取方法也是遵循yuv422格式的最基本提取方法,即兩個y共用乙個uv。比如,對於畫素點y'00、y'01 而言,其cb、cr的值均為 cb00、cr00。
(4)yv12,yu12格式(屬於yuv420)
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屬於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×480×3>>1)位元組,
分為三個部分:y,u和v
y分量: (720×480)個位元組
u(cb)分量:(720×480>>2)個位元組
v(cr)分量:(720×480>>2)個位元組
三個部分內部均是行優先儲存,三個部分之間是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;ii420 : 亮度(行×列) + 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資料格式
yuv422,yuv420相互轉換 yv12和i420的區別 平坦格式大彙總 yuv分為三個分量 有兩種格式,packed和planer 打包就是y0u0v0 y1u1v1 y2u2v2 y3u3v3 平鋪就是y0y1y2y3 u0u1u2u3 v0v1v2v3 平鋪的方式調節亮度和顏色比較方便。打...
詳解YUV資料格式
yuv,是一種顏色編碼方法。常使用在各個影像處理元件中。yuv在對 或影片編碼時,考慮到人類的感知能力,允許降低色度的頻寬。yuv是編譯true color顏色空間 color space 的種類,y uv,yuv,ycbcr,ypbpr等專有名詞都可以稱為yuv,彼此有重疊。y 表示明亮度 lum...
YUV格式詳解
yuv格式通常有兩大類 打包 packed 格式和平面 planar 格式。前者將yuv分量存放在同乙個陣列中,通常是幾個相鄰的畫素組成乙個巨集畫素 macro pixel 而後者使用三個陣列分開存放yuv三個分量,就像是乙個三維平面一樣。yuv pixel formats nv12和nv21屬於y...