前言
????????最近在學(xué)習(xí)一個(gè)開源算法庫:libyuv。看到這個(gè)名字的時(shí)候我很懵逼,“l(fā)ib”自然是靜態(tài)鏈接庫的意思,那么“yuv”又是個(gè)什么鬼東西?
????在本文中你將會(huì)看到以下內(nèi)容:
????1、YUV 的含義及歷史
????2、YUV 的格式及數(shù)據(jù)存儲(chǔ)
????3、YUV?與?RBG 的關(guān)系
????4、本文參考資料
YUV 的含義及歷史
????????在我最初看《計(jì)算機(jī)程序設(shè)計(jì)藝術(shù)》的時(shí)候很不理解為什么高德納要在開始花費(fèi)大量力氣去探究 "Algorithm" 一詞的由來。現(xiàn)在我有點(diǎn)明白了,當(dāng)人們第一次接觸一個(gè)概念時(shí),總是竭力想要在腦海中構(gòu)建一個(gè)相關(guān)的模型。比如我說“蘋果”的時(shí)候,你腦海中會(huì)浮現(xiàn)一個(gè)蘋果的樣子;當(dāng)我說“RGB”的時(shí)候,你腦海中很快會(huì)浮現(xiàn)紅、綠、藍(lán)三原色。這樣你就能很快明白我要講的是什么概念。那么,如果我說“埃弗頓”,你知道我要說什么嗎?實(shí)際上我自己都不知道“埃弗頓”是什么意思,因?yàn)檫@三個(gè)字是我隨便敲擊的 :)
? ? ? ? 所以為了弄明白“YUV”是什么,我必須知道“YUV”這三個(gè)字母組合的由來。
? ? ? ? 首先是度娘給的答案:

????????之后在英文縮寫網(wǎng)上查到:

? ? ? ? 最后結(jié)合libyuv開源項(xiàng)目指導(dǎo)文檔:

我終于明白了我糾結(jié)的“YUV”到底是什么了:一種顏色編碼方法!
????????那么為什么需要這種編碼方式呢?
? ? ? ? YUV的發(fā)明是在彩色電視與黑白電視的過渡時(shí)期。黑白視頻只有Y(Luma,Luminance)視頻,也就是灰階值。到了彩色電視規(guī)格的制定,是以YUV/YIQ的格式來處理彩色電視圖像,把UV視作表示彩度的C(Chrominance或Chroma),如果忽略C信號(hào),那么剩下的Y(Luma)信號(hào)就跟之前的黑白電視頻號(hào)相同,這樣一來便解決彩色電視機(jī)與黑白電視機(jī)的兼容問題。
? ? ? ? 好吧,總結(jié)一下:
? ? ? ? Y:表示顏色的明亮度,即灰階值
? ? U/V:表示顏色的亮度,其中U是藍(lán)色分量,V是紅色分量。
? ?YUV:共同描述了一個(gè)點(diǎn)的顏色,和RGB類似。
? ? ? ? 所以,YUV不是我以為的“三個(gè)單詞的首字母縮寫”!
????????YUV又被叫做 YCbCr,這里的‘Y’仍然表示亮度或灰度(luminance),‘Cb’表示"blue"部分去掉亮度的色度(Chrominance或Chroma)分量,?‘Cr’表示"red"部分去掉亮度的色度分量。
YUV 的格式及數(shù)據(jù)存儲(chǔ)
? ??????YUV碼流的存儲(chǔ)格式其實(shí)與其采樣的方式密切相關(guān),主流的采樣方式有三種,YUV 4:4:4,YUV 4:2:2,YUV 4:2:0。我們需要根據(jù)其采樣格式來從碼流中還原每個(gè)像素點(diǎn)的YUV值,因?yàn)橹挥姓_地還原了每個(gè)像素點(diǎn)的YUV值,才能通過YUV與RGB的轉(zhuǎn)換公式提取出每個(gè)像素點(diǎn)的RGB值,然后顯示出來。
? ? ? ? 我們用三張圖來解釋YUV的三種采樣方式,黑點(diǎn)表示采樣該像素點(diǎn)的Y分量,以空心圓圈表示采用該像素點(diǎn)的UV分量:

????????很容易看出來:
? ? ? ? YUV 4:4:4 采樣是對(duì)每個(gè)像素點(diǎn)都進(jìn)行Y、UV分量采樣;每一個(gè)Y對(duì)應(yīng)一個(gè)UV分量。
? ? ? ? YUV 4:2:2 采樣是在行?或?列進(jìn)行Y分量全采,每兩個(gè)Y分量取一UV分量;每兩個(gè)Y分量對(duì)應(yīng)一個(gè)UV分量。例如圖中的A、B像素共用一個(gè)UV分量。
? ? ? ? YUV 4:2:0 采樣是在行?及?列進(jìn)行Y分量全采,每兩個(gè)Y分量取一UV分量;這樣每4個(gè)Y分量對(duì)應(yīng)一個(gè)UV分量。例如圖中的C、D、E、F像素共用一個(gè)UV分量。
? ? ? ? 我們知道YUV的采樣方式了,那么YUV數(shù)據(jù)在內(nèi)存中是怎么存儲(chǔ)呢?這里需要先了解兩個(gè)概念:planar、packed。
? ??????YUV planar(平面) 格式:先連續(xù)存儲(chǔ)所有像素點(diǎn)的Y,緊接著存儲(chǔ)所有像素點(diǎn)的U,隨后是所有像素點(diǎn)的V。
????????YUV two-planar?格式:先連續(xù)存儲(chǔ)所有像素點(diǎn)的Y,緊接著存儲(chǔ)所有像素點(diǎn)的UV。
????????YUV packed(打包) 格式:連續(xù)存儲(chǔ)所有像素點(diǎn)的 YUV。

????????結(jié)合采樣方式以及數(shù)據(jù)存儲(chǔ)格式,會(huì)有跟多YUV格式,這里簡(jiǎn)單列舉幾個(gè)YUV格式:
? ? ? ? 約定:下訴大小針對(duì) m * n 的圖片,其中 m 表示圖片的高,m表示圖片的寬,單位像素。
? ? ? ? ? ? ? ? ? ? size、sizeY、sizeU、sizeV 分別表示整幅圖片、Y、U、V分量占用的內(nèi)存大小,單位字節(jié)。
1、AYUV
????????采樣方式:4:4:4????????存儲(chǔ)格式:packed? ? ? ? 補(bǔ)充:A表示 Alpha

? ? ? ? size = m * n * 4;????sizeA =?sizeY =?sizeU =?sizeV =?m * n
2、YUYV
? ??????采樣方式:4:2:2

? ??????size = m * n * 3 / 2;? ? sizeY =?m * n;????sizeU =?sizeV =?m * n / 2
3、UYVY
????????采樣方式:4:2:2

????????size = m * n * 3 / 2;? ? sizeY =?m * n;????sizeU =?sizeV =?m * n / 2
? ? ? ? 是的,你沒有看錯(cuò),UYVY 與 YUYV 區(qū)別只是UV的排列順序不一樣。
4、YUV422P
? ??????采樣方式:4:2:2????????存儲(chǔ)格式:planar

????????size = m * n * 3 / 2;? ? sizeY =?m * n;????sizeU =?sizeV =?m * n / 2
5、YV12,YU12
????????采樣方式:4:2:0? ? ? ? 存儲(chǔ)格式:planar

????????size = m * n * 5 / 4;? ? sizeY =?m * n;????sizeU =?sizeV =?m * n / 4
6、NV12、NV21
????????采樣方式:4:2:0? ? ? ? 存儲(chǔ)格式:?two-planar

????????size = m * n * 5 / 4;? ? sizeY =?m * n;????sizeU =?sizeV =?m * n / 4
????????Camera 返回的YUV數(shù)據(jù)一般是NV21和YV12兩種。
????????Camera 返回的YUV數(shù)據(jù)一般是NV21和YV12兩種。
????????Camera 返回的YUV數(shù)據(jù)一般是NV21和YV12兩種。
YUV?與?RBG 的關(guān)系
????????對(duì)RGB,我們并不陌生,從初中開始接觸的色光的三原色,告訴我們我們可以看到的光可以由這三種顏色按一定的比例去混合得到;RGB 模型是目前常用的一種彩色信息表達(dá)方式,它使用紅、綠、藍(lán)三原色的亮度來定量表示顏色。該模型也稱為加色混色模型,是以RGB三色光互相疊加來實(shí)現(xiàn)混色的方法,因而適合于顯示器等發(fā)光體的顯示。
? ? ? ? 而YUV則是根據(jù)人眼的視覺特點(diǎn)提出的模型:人眼對(duì)亮度更敏感,對(duì)位置、色彩相對(duì)來說不敏感。
? ? ? ? 既然RGB、YUV都是對(duì)顏色的建模、編碼處理,那么他們之間能不能相互轉(zhuǎn)換呢?別急先來看張圖:

當(dāng)我們改變 Y(亮度)值會(huì)發(fā)生什么變化呢?且看:

????????這里列一個(gè)YUV與RGB的換算公式:

? ? ? ? 實(shí)際上更具不同的標(biāo)準(zhǔn),YUV和RGB之間的轉(zhuǎn)換會(huì)有所不同,更詳細(xì)請(qǐng)看參考質(zhì)料《YUV與RGB互轉(zhuǎn)各種公式》。