如何理解YUV的各種格式

2021-10-04 18:38:10 字數 2778 閱讀 9463

對於乙個 w 寬、h 高的畫素圖,在水平方向,一行有 w 個畫素;在垂直方向,一列有 h 個畫素,整個圖形有 w * h 個畫素。現在來看一下用yuv畫素格式來表示畫素圖,亮度和圖形畫素的關係,色度和圖形畫素的關係到底是怎麼樣的。通常我們對 yuv444,yuv422,yuv420 的解釋是後面三個數字分別對應前面三個字母。拿 yuv422 來說,y 對應 4,表示四個圖形畫素中,每個都有亮度值;u 對應 2,表示四個圖形畫素中,cb 只占用兩個畫素;v 對應 2, 表示四個圖形畫素中, cr 占用兩個畫素。對於 yuv422 模式,這樣解釋是沒有問題。但是對於 yuv420 解釋就不對了,不能說四個圖形畫素中,cr 占用 0 個畫素吧?

現在我們通過下圖來理解一下 yuv 各種格式後面數字的含義。

上圖所示,左側一列每乙個小矩形表示圖形畫素,黑框矩形表示有y分量,小黑點是表示u和v分量(cb+cr),h、v和t代表亮度和色度在水平方向、垂直方向和總體的比例關係。比如,4:4:0 水平方向是1/1,垂直方向是1/2,總體比例是兩者相乘為1/2,表示乙個色度對應了兩個亮度。4:2:2 水平方向是1/2,垂直方向是1/1,總體比例為1/2,表示乙個色度畫素對應了兩個亮度畫素。4:2:0 水平方向是1/2,垂直方向是1/2,總體比例為1/4,表示乙個色度畫素對應了四個亮度畫素。右側一列是二次取樣模式記號表示, 是 j:a:b 模式,實心黑色圓圈表示包含色度畫素(cb+cr),空心圓圈表示不包含色度畫素。對於 j:a:b 模式,主要是圍繞參考塊的概念定義的,這個參考塊是乙個 j x 2 的矩形,j 通常是 4。這樣,此參考塊就是寬度有 4 個畫素、高度有 2 個畫素的矩形。a 表示參考塊的第一行包含的色度畫素樣本數,b 表示在參考塊的第二行包含的色度畫素樣本數。

現在我們發現 yuv444,yuv422,yuv420 yuv 等畫素格式的本質是:每個圖形畫素都會包含亮度值,但是某幾個圖形畫素會共用乙個色度值(uv),這個比例關係就是通過 4 x 2 的矩形參考塊來定的。這樣很容易理解類似 yuv440,yuv420 這樣的格式了。

因此yuv420的格式不代表沒有v分量。我們用ffmpeg將一張轉為yuv420格式,看看實際大小。

ffmpeg的安裝:windows安裝ffmpeg

第二:解壓到指定資料夾下---d:/ffmpeg

第三:新增到環境變數:d:/ffmpeg/bin

第四:檢視ffmpeg版本資訊---ffmpeg.exe -version

執行:ffmpeg.exe -i 1.jpg -s 630x472 -pix_fmt yuvj420p test-yuvj420p.yuv

yuv420 一共有三個平面分別是 y,u,v,每乙個平面都是用 8 bit 二進位制數字表示,我們把 8 bit 稱作位深度。根據前面的介紹,如果用 yuv420來表示解析度為 630 * 472 的,需要占用多少儲存空間呢?每乙個畫素都需要乙個 luma 值,即 y。那麼總共需要 630 * 472 = 297360 bytes。每四個畫素需要乙個 chroma u 值,那麼總共需要 630 * 472 / 4 = 74340 bytes。每四個畫素需要乙個 chroma v 值,那麼總共需要 630 * 472 / 4 = 74340 bytes bytes。把 y、u、v 三個 plane 加起來就是:446040 bytes 約等於435.59kb。

最近定位jpeg的問題,遇到從提取的取樣係數和yuv格式的對應關係,在jpeg中,yuv每個分量都有對應的取樣係數,每個分量8bit,bit0-3為垂直方向的取樣係數,bit4-7為水平方向的取樣係數。根據上文水平方向和垂直方向的比例和對應的yuv格式,可以得到常見的取樣係數和其對應的yuv格式如下:

取樣係數(y_fac,u_fac,v_fac)

yuv格式

備註0x221111

yuv420

水平方向uv和y的比例為1/2;垂直方向uv和y的比例為1/2;總比例1/4

0x211111

yuv422

水平方向uv和y的比例為1/2;垂直方向uv和y的比例為1/1;總比例1/2

0x221212

yuv422

水平方向uv和y的比例為1/2;垂直方向uv和y的比例為1/1;總比例1/2

0x121111

yuv440

水平方向uv和y的比例為1/1;垂直方向uv和y的比例為1/2;總比例1/2

0x222121

yuv440

水平方向uv和y的比例為1/1;垂直方向uv和y的比例為1/2;總比例1/2

0x111111

yuv444

水平方向uv和y的比例為1/1;垂直方向uv和y的比例為1/1;總比例1/1

0x121212

yuv444

水平方向uv和y的比例為1/1;垂直方向uv和y的比例為1/1;總比例1/1

0x212121

yuv444

水平方向uv和y的比例為1/1;垂直方向uv和y的比例為1/1;總比例1/1

0x110000

yuv400

只有y分量有取樣

0x120000

yuv400

只有y分量有取樣

0x210000

yuv400

只有y分量有取樣

0x220000

yuv400

只有y分量有取樣

yuv格式轉換是那個組織定義的 YUV格式詳解

yuv格式通常有兩大類 打包 packed 格式和平面 planar 格式。前者將yuv分量存放在同乙個陣列中,通常是幾個相鄰的畫素組成乙個巨集畫素 macro pixel 而後者使用三個陣列分開存放yuv三個分量,就像是乙個三維平面一樣。表2.3中的yuy2到y211都是打包格式,而if09到yv...

YUV格式到RGB格式的轉換

yuyv格式到rgb格式的轉換 yuyv格式如下 y0u0y1v0 y2u1y3v1.說明 乙個y代表乙個畫素,而乙個y和uv組合起來構成乙個畫素,所以第0個畫素y0和第乙個畫素y1都是共用第0個畫素的u0和v0。而每個分量y,u,v都是占用乙個位元組的儲存空間。所以y0u0y1v0相當於兩個畫素,...

yuv格式轉換是那個組織定義的 YUV資料格式

概要 yuv格式類別 打包 packed 格式 將每個畫素點的y,u,v分量交叉排列並以畫素點為單元連續的存放在同一陣列中,通常幾個相鄰的畫素組成乙個巨集畫素 macro pixel 平面 planar 格式 使用三個陣列分開連續的存放y,u,v三個分量,即y,u,v分別存放在各自的陣列中。yuv取...