目錄
- 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 也稱為 YCbCr纺裁,其中诫肠,Cb司澎、Cr的含義等同于U欺缘、V,C 可以理解為 component 或者 color挤安。
RGB 轉(zhuǎn) YUV 的公式能更好地反應(yīng) YUV 與 RGB 的關(guān)系谚殊,以及為什么稱為 YCbCr:
RGB與YUV的變換公式如下:
有時(shí)候遇到播放問題會(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ì)亮度的敏感超過色度穆刻。將圖像的亮度信息和顏色信息分離置尔,并使用不同的分辨率進(jìn)行存儲(chǔ),這樣在對(duì)主觀感覺影響很小的前提下氢伟,可以更加有效地存儲(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中稱之為“mpeg”范圍飞傀。
- 以JPEG為代表的標(biāo)準(zhǔn)中,Y泣刹、U助析、V的取值范圍都是0-255。FFmpeg中稱之為“jpeg” 范圍椅您。
實(shí)際中最常見的是第1種取值范圍的YUV(可以自己觀察一下YUV的數(shù)據(jù)外冀,會(huì)發(fā)現(xiàn)其中亮度分量沒有取值為0、255這樣的數(shù)值)掀泳。很多人在這個(gè)地方會(huì)有疑惑雪隧,為什么會(huì)去掉“兩邊”的取值呢?
原因:
- 在廣播電視系統(tǒng)中不傳輸很低和很高的數(shù)值员舵,實(shí)際上是為了防止信號(hào)變動(dòng)造成過載脑沿,因而把這“兩邊”的數(shù)值作為“保護(hù)帶”[4]。
下面這張圖是數(shù)字電視中亮度信號(hào)量化后的電平分配圖马僻。從圖中可以看出庄拇。
- 對(duì)于8bit量化來說,信號(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ù)流中的屈张。
與之類似擒权,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格式有兩大類: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ǔ)方式
下面用圖的形式給出常見的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取值依次類推。
(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带膀,其他依次類推。在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佩谷。其提取方式與上一種類似,即Y'00监嗜、Y'01谐檀、Y'10、Y'11共用Cr00裁奇、Cb00稚补,其他依次類推。
假設(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ǔ)
常見的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ǔ)沒有冗余,計(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開始的兩個(gè)字節(jié):
-------------低地址---->高地址--------------
00011111 000000 01
(2)yuv420p10be的數(shù)據(jù)格式的16進(jìn)制的顯示:
比如地址019f7040h開始的兩個(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