目錄
- YUV的原理
- YUV的取值范圍
- YUV的存儲(chǔ)格式
- YUV的采樣格式
- 存儲(chǔ)方式
- 10bit YUV數(shù)據(jù)的存儲(chǔ)
- RGB的格式
參考
- [1] 圖文詳解YUV420數(shù)據(jù)格式
- [2] fourcc.org/yuv
- [3] fourcc.org/rgb
- [4] 雷霄驊/最簡(jiǎn)單的基于FFmpeg的libswscale的示例(YUV轉(zhuǎn)RGB)
- [5] zhanghui_cuc/10bit YUV數(shù)據(jù)在內(nèi)存中的存儲(chǔ)格式
- [6] docs.microsoft.com/10-bit and 16-bit YUV Video Formats
1. YUV的原理
YUV 的原理是把亮度(Luma)與色度(Chroma)分離。
“Y”表示亮度,也就是灰度值。
“U”表示藍(lán)色通道與亮度的差值。
“V”表示紅色通道與亮度的差值。
其中 Y 信號(hào)分量除了表示亮度信號(hào)外,還含有較多的綠色通道量,單純的 Y 分量可以顯示出完整的黑白圖像。
U、V 分量分別表示藍(lán) (blue)、紅 (red) 分量信號(hào),只含有色度信息,所以 YUV 也稱(chēng)為 YCbCr,其中,Cb、Cr的含義等同于U、V,C 可以理解為 component 或者 color。
RGB 轉(zhuǎn) YUV 的公式能更好地反應(yīng) YUV 與 RGB 的關(guān)系,以及為什么稱(chēng)為 YCbCr:

RGB與YUV的變換公式如下:

有時(shí)候遇到播放問(wèn)題會(huì)看到純綠色的圖像,可能是由某些錯(cuò)誤導(dǎo)致YUV值為(0,0,0)引起的,YUV(0,0,0)對(duì)應(yīng)RGB為(0,135,0),正好為綠色。
RGB和YUV互轉(zhuǎn)的網(wǎng)頁(yè)小工具:
https://www.mikekohn.net/file_formats/yuv_rgb_converter.php
在RGB色彩空間中,三個(gè)顏色的重要程度相同,所以需要使用相同的比特進(jìn)行存儲(chǔ)。研究發(fā)現(xiàn)人眼對(duì)亮度的敏感超過(guò)色度。將圖像的亮度信息和顏色信息分離,并使用不同的分辨率進(jìn)行存儲(chǔ),這樣在對(duì)主觀感覺(jué)影響很小的前提下,可以更加有效地存儲(chǔ)圖像數(shù)據(jù)。
2. YUV的取值范圍
與RGB每個(gè)像素點(diǎn)的每個(gè)分量取值范圍為0-255不同(每個(gè)分量占8bit),YUV取值范圍有兩種:
- 以Rec.601為代表(還包括BT.709 / BT.2020)的廣播電視標(biāo)準(zhǔn)中,Y的取值范圍是16-235,U、V的取值范圍是16-240。FFmpeg中稱(chēng)之為“mpeg”范圍。
- 以JPEG為代表的標(biāo)準(zhǔn)中,Y、U、V的取值范圍都是0-255。FFmpeg中稱(chēng)之為“jpeg” 范圍。
實(shí)際中最常見(jiàn)的是第1種取值范圍的YUV(可以自己觀察一下YUV的數(shù)據(jù),會(huì)發(fā)現(xiàn)其中亮度分量沒(méi)有取值為0、255這樣的數(shù)值)。很多人在這個(gè)地方會(huì)有疑惑,為什么會(huì)去掉“兩邊”的取值呢?
原因:
- 在廣播電視系統(tǒng)中不傳輸很低和很高的數(shù)值,實(shí)際上是為了防止信號(hào)變動(dòng)造成過(guò)載,因而把這“兩邊”的數(shù)值作為“保護(hù)帶”[4]。
下面這張圖是數(shù)字電視中亮度信號(hào)量化后的電平分配圖。從圖中可以看出。
- 對(duì)于8bit量化來(lái)說(shuō),信號(hào)的白電平為235,對(duì)應(yīng)模擬電平為700mV。
- 黑電平為16,對(duì)應(yīng)模擬電平為0mV。
- 信號(hào)上方的“保護(hù)帶”取值范圍是236至254,而信號(hào)下方的“保護(hù)帶”取值范圍是1-15。
- 最邊緣的0和255兩個(gè)電平是保護(hù)電平,是不允許出現(xiàn)在數(shù)據(jù)流中的。
與之類(lèi)似,10bit量化的時(shí)候,白電平是235*4=940,黑電平是16*4=64。

下面兩張圖是數(shù)字電視中色度信號(hào)量化后的電平分配圖。可以看出:
- 色度最大正電平為240,對(duì)應(yīng)模擬電平為+350mV。
- 色度最大負(fù)電平為16,對(duì)應(yīng)模擬電平為-350mV。
- 需要注意的是,色度信號(hào)數(shù)字電平128對(duì)應(yīng)的模擬電平是0mV。


3. YUV的存儲(chǔ)格式
YUV格式有兩大類(lèi):planar和packed。
對(duì)于 planar 的 YUV 格式,先連續(xù)存儲(chǔ)所有像素點(diǎn)的 Y,緊接著存儲(chǔ)所有像素點(diǎn)的 U,隨后是所有像素點(diǎn)的 V。相當(dāng)于將 YUV 拆分成三個(gè)平面 (plane) 存儲(chǔ)。
對(duì)于 packed 的 YUV 格式,每個(gè)像素點(diǎn)的 Y,U,V 是連續(xù)交替存儲(chǔ)的。
4. YUV的采樣格式
主要的采樣格式有YUV4:4:4、YUV4:2:2、YUV4:2:0 ,其中YUV4:2:0是最常用的采樣格式。
采樣就是根據(jù)一定的間隔取值。其中的比例是指 Y、U、V 表示的像素,三者分別占的比值。
下圖是YUV4:4:4,YUV4:2:2,YUV4:2:0的采樣示意圖。
- YUV 4:4:4采樣,每一個(gè)Y對(duì)應(yīng)一組UV分量。
- YUV 4:2:2采樣,每?jī)蓚€(gè)Y共用一組UV分量。
- YUV 4:2:0采樣,每四個(gè)Y共用一組UV分量。
5. 存儲(chǔ)方式
下面用圖的形式給出常見(jiàn)的YUV數(shù)據(jù)的存儲(chǔ)方式,并在后面附有取樣每個(gè)像素點(diǎn)的YUV數(shù)據(jù)的方法。
(1) YUYV 格式 (屬于YUV422)

相鄰的兩個(gè)Y共用其相鄰的兩個(gè)Cb、Cr,對(duì)于像素點(diǎn)Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00,其他的像素點(diǎn)的YUV取值依次類(lèi)推。
(2) UYVY 格式 (屬于YUV422)

與YUYV不同的是UV的排列順序不一樣,還原其每個(gè)像素點(diǎn)的YUV值的方法與上面一樣。
(3) YUV422P(屬于YUV422)

YUV422P是一種平面模式,其每一個(gè)像素點(diǎn)的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即兩個(gè)Y共用一個(gè)UV。比如,對(duì)于像素點(diǎn)Y'00、Y'01 而言,其Cb、Cr的值均為 Cb00、Cr00。
(4) YUV420P格式(屬于YUV420)

YUV420P,Y,U,V三個(gè)分量都是平面格式,分為I420和YV12。I420格式和YV12格式的不同處在U平面和V平面的位置不同。注意,上圖中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次類(lèi)推。在I420格式中,U平面緊跟在Y平面之后,然后才是V平面(即:YUV);但YV12則是相反(即:YVU)。

I420: YYYYYYYY UU VV
YV12: YYYYYYYY VV UU
(5) NV12、NV21(YUV420sp,屬于YUV420)

這兩種格式的不同在于UV交錯(cuò)排列的順序不同,是一種two-plane模式,即Y和UV分為兩個(gè)Plane,但是UV(CbCr)為交錯(cuò)存儲(chǔ),而不是分為三個(gè)plane。其提取方式與上一種類(lèi)似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次類(lèi)推。
假設(shè)一個(gè)分辨率為8X4的YUV圖像,它們的格式如下圖:
YUV420sp格式如下圖

NV12: YYYYYYYY UVUV
NV21: YYYYYYYY VUVU
以w*h大小圖像的YUV420數(shù)據(jù)為例,
其存儲(chǔ)格式是: 共大小為(w * h * 3/2)字節(jié),
Y分量:(w * h)個(gè)字節(jié)
U(Cb)分量:(w * h/4)個(gè)字節(jié)
V(Cr)分量:(w * h/4)個(gè)字節(jié)
6. 10bit YUV數(shù)據(jù)的存儲(chǔ)
常見(jiàn)的yuv數(shù)據(jù),每個(gè)像素的一個(gè)通道一般是占用一個(gè)字節(jié)即8bit。而HDR常用的標(biāo)準(zhǔn)HDR10,數(shù)據(jù)是10bit的。
10bit數(shù)據(jù)是怎么存儲(chǔ)的呢?我們一般會(huì)有兩種想法:
- 每個(gè)像素的一個(gè)通道占用兩個(gè)字節(jié),其中6個(gè)bit是填充位。
- 每個(gè)像素的一個(gè)通道占用10bit,10bit數(shù)據(jù)和10bit數(shù)據(jù)是挨著排列的。
優(yōu)缺點(diǎn)
- 方式1:便于運(yùn)算處理,有存儲(chǔ)冗余;
- 方式2:存儲(chǔ)沒(méi)有冗余,計(jì)算麻煩。
事實(shí)上,10bit是采用方式1存儲(chǔ)的,并且高有效字節(jié)的前6個(gè)bit是填充的0。
HDR10視頻解碼得到Y(jié)UV數(shù)據(jù)的命令:
//yuv420p10le格式
ffmpeg -i hdr10.mp4 -f rawvideo -pix_fmt yuv420p10be hdr10_yuv420p10le.yuv
//yuv420p10be格式
ffmpeg -i hdr10.mp4 -f rawvideo -pix_fmt yuv420p10be hdr10_yuv420p10le.yuv
(1)yuv420p10le的數(shù)據(jù)格式的16進(jìn)制的顯示:

比如地址019f7040h開(kāi)始的兩個(gè)字節(jié):
-------------低地址---->高地址--------------
00011111 000000 01
(2)yuv420p10be的數(shù)據(jù)格式的16進(jìn)制的顯示:

比如地址019f7040h開(kāi)始的兩個(gè)字節(jié):
-------------低地址---->高地址--------------
000000 01 00011111
工具推薦:一個(gè)可以播放10bit yuv流的播放器YUV Player
7. RGB格式
- BGR24圖像格式
BGR24圖像格式是一種采用24bpp(bit per pixel)的格式。每個(gè)顏色通道B、G、R各占8bpp。
排列方式如:
B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R
B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R
B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R
B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R ? B G R