RGB,YUV的来历及其相互转换
在視頻等相關(guān)的應(yīng)用中,YUV是一個(gè)經(jīng)常出現(xiàn)的格式。本文主要以圖解的資料的形式詳細(xì)描述YUV和RGB格式的來由,相互關(guān)系以及轉(zhuǎn)換方式,并對(duì)C語(yǔ)言實(shí)現(xiàn)的YUV轉(zhuǎn)為RGB程序進(jìn)行介紹。
人類眼睛的色覺,具有特殊的特性,早在上世紀(jì)初,Young(1809)和Helmholtz(1824)就提出了視覺的三原色學(xué)說,即:視網(wǎng)膜存在三種視錐細(xì)胞,分別含有對(duì)紅、綠、藍(lán)三種光線敏感的視色素,當(dāng)一定波長(zhǎng)的光線作用于視網(wǎng)膜時(shí),以一定的比例使三種視錐細(xì)胞分別產(chǎn)生不同程度的興奮,這樣的信息傳至中樞,就產(chǎn)生某一種顏色的感覺。
70年代以來,由于實(shí)驗(yàn)技術(shù)的進(jìn)步,關(guān)于視網(wǎng)膜中有三種對(duì)不同波長(zhǎng)光線特別敏感的視錐細(xì)胞的假說,已經(jīng)被許多出色的實(shí)驗(yàn)所證實(shí)。 例如:①有人用不超過單個(gè)視錐直徑的細(xì)小單色光束,逐個(gè)檢查并繪制在體(最初實(shí)驗(yàn)是在金魚和蠑螈等動(dòng)物進(jìn)行,以后是人)視錐細(xì)胞的光譜吸收曲線,發(fā)現(xiàn)所有繪制出來的曲線不外三種類型,分別代表了三類光譜吸收特性不同的視錐細(xì)胞,一類的吸收峰值在420nm處,一類在534nm處,一類在564nm處,差不多正好相當(dāng)于藍(lán)、綠、紅三色光的波長(zhǎng)。與上述視覺三原色學(xué)說的假設(shè)相符。②用微電極記錄單個(gè)視錐細(xì)胞感受器電位的方法,也得到了類似的結(jié)果,即不同單色光所引起的不同視錐細(xì)胞的超極化型感受器電位的大小也不同,峰值出現(xiàn)的情況符合于三原色學(xué)說。
于是,在彩色顯示器還沒有發(fā)明的時(shí)候,人類已經(jīng)懂得使用三原色光調(diào)配出所有顏色的光。并不是說三原色混合后產(chǎn)生了新的頻率的光,而是給人眼睛的感覺是這樣。
在顯示器發(fā)明之后,從黑白顯示器發(fā)展到彩色顯示器,人們開始使用發(fā)出不同顏色的光的熒光粉(CRT,等離子體顯示器),或者不同顏色的濾色片(LCD),或者不同顏色的半導(dǎo)體發(fā)光器件(OLED和LED大型全彩顯示牌)來形成色彩,無一例外的選擇了Red,Green,Blue這3種顏色的發(fā)光體作為基本的發(fā)光單元。通過控制他們發(fā)光強(qiáng)度,組合出了人眼睛能夠感受到的大多數(shù)的自然色彩。
計(jì)算機(jī)顯示彩色圖像的時(shí)候也不例外,最終顯示的時(shí)候,要控制一個(gè)像素中Red,Green,Blue的值,來確定這個(gè)像素的顏色。計(jì)算機(jī)中無法模擬連續(xù)的存儲(chǔ)從最暗到最亮的量值,而只能以數(shù)字的方式表示。于是,結(jié)合人眼睛的敏感程度,使用3個(gè)字節(jié)(3*8位)來分別表示一個(gè)像素里面的Red,Green和Blue的發(fā)光強(qiáng)度數(shù)值,這就是常見的RGB格式。我們可以打開畫圖板,在自定義顏色工具框中,輸入r,g,b值,得到不同的顏色。
但是對(duì)于視頻捕獲和編解碼等應(yīng)用來講,這樣的表示方式數(shù)據(jù)量太大了。需要想辦法在不太影響感覺的情況下,對(duì)原始數(shù)據(jù)的表示方法進(jìn)行更改,減少數(shù)據(jù)量。
無論中間處理過程怎樣,最終都是為了展示給人觀看,這樣的更改,也是從人眼睛的特性出發(fā),和發(fā)明RGB三原色表示方法的出發(fā)點(diǎn)是一樣的。
于是我們使用Y,Cb,Cr模型來表示顏色。Iain的書中寫道:The human visual system (HVS) is less sensitive to colour than to luminance (brightness).人類視覺系統(tǒng)(其實(shí)就是人的眼睛)對(duì)亮度的感覺比對(duì)顏色更加敏感。
在RGB色彩空間中,三個(gè)顏色的重要程度相同,所以需要使用相同的分辨率進(jìn)行存儲(chǔ),最多使用RGB565這樣的形式減少量化的精度,但是3個(gè)顏色需要按照相同的分辨率進(jìn)行存儲(chǔ),數(shù)據(jù)量還是很大的。所以,利用人眼睛對(duì)亮度比對(duì)顏色更加敏感,將圖像的亮度信息和顏色信息分離,并使用不同的分辨率進(jìn)行存儲(chǔ),這樣可以在對(duì)主觀感覺影響很小的前提下,更加有效的存儲(chǔ)圖像數(shù)據(jù)。
YCbCr色彩空間和它的變形(有時(shí)被稱為YUV)是最常用的有效的表示彩色圖像的方法。Y是圖像的亮度(luminance/luma)分量,使用以下公式計(jì)算,為R,G,B分量的加權(quán)平均值:
Y = kr R + kgG + kbB
其中k是權(quán)重因數(shù)。
上面的公式計(jì)算出了亮度信息,還有顏色信息,使用色差(color difference/chrominance或chroma)來表示,其中每個(gè)色差分量為R,G,B值和亮度Y的差值:
Cb = B -Y
Cr = R -Y
Cg = G- Y
其中,Cb+Cr+Cg是一個(gè)常數(shù)(其實(shí)是一個(gè)關(guān)于Y的表達(dá)式),所以,只需要其中兩個(gè)數(shù)值結(jié)合Y值就能夠計(jì)算出原來的RGB值。所以,我們僅保存亮度和藍(lán)色、紅色的色差值,這就是(Y,Cb,Cr)。
相比RGB色彩空間,YCbCr色彩空間有一個(gè)顯著的優(yōu)點(diǎn)。Y的存儲(chǔ)可以采用和原來畫面一樣的分辨率,但是Cb,Cr的存儲(chǔ)可以使用更低的分辨率。這樣可以占用更少的數(shù)據(jù)量,并且在圖像質(zhì)量上沒有明顯的下降。所以,將色彩信息以低于量度信息的分辨率來保存是一個(gè)簡(jiǎn)單有效的圖像壓縮方法。
在COLOUR SPACES .17 ITU-R recommendation BT.601 中,建議在計(jì)算Y時(shí),權(quán)重選擇為kr=0.299,kg=0.587,kb=0.114。于是常用的轉(zhuǎn)換公式如下:
Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y )
Cr = 0.713(R - Y )
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb
有了這個(gè)公式,我們就能夠?qū)⒁环?/span>RGB畫面轉(zhuǎn)換成為YUV畫面了,反過來也可以。下面將畫面數(shù)據(jù)究竟是以什么形式存儲(chǔ)起來的。
在RGB24格式中,對(duì)于寬度為w,高度為h的畫面,需要w*h*3個(gè)字節(jié)來存儲(chǔ)其每個(gè)像素的rgb信息,畫面的像素?cái)?shù)據(jù)是連續(xù)排列的。按照r(0,0),g(0,0),b(0,0);r(0,1),g(0,1),b(0,1);…;r(w-1,0),g(w-1,0),b(w-1,0);…;r(w-1,h-1),g(w-1,h-1),b(w-1,h-1)這樣的順序存放起來。
在YUV格式中,以YUV420格式為例。寬度為w高度為h的畫面,其亮度Y數(shù)據(jù)需要w*h個(gè)字節(jié)來表示(每個(gè)像素點(diǎn)一個(gè)亮度)。而Cb和Cr數(shù)據(jù)則是畫面中4個(gè)像素共享一個(gè)Cb,Cr值。這樣Cb用w*h/4個(gè)字節(jié),Cr用w*h/4個(gè)字節(jié)。
YUV文件中,把多個(gè)幀的畫面連續(xù)存放。就是YUV YUV YUV…..這樣的不斷連續(xù)的形式,而其中每個(gè)YUV,就是一幅畫面。
在這單個(gè)YUV中,前w*h個(gè)字節(jié)是Y數(shù)據(jù),接著的w*h/4個(gè)字節(jié)是Cb數(shù)據(jù),再接著的w*h/4個(gè)字節(jié)為Cr數(shù)據(jù)。
在由這樣降低了分辨率的數(shù)據(jù)還原出RGB數(shù)據(jù)的時(shí)候,就要依據(jù)像素的位置找到它對(duì)應(yīng)的Y,Cb,Cr值,其中Y值最好找到,像素位置為x,y的話,Y數(shù)據(jù)中第y*width+x個(gè)數(shù)值就是它的Y值。Cb和Cr由于是每2x2像素的畫面塊擁有一個(gè),這樣Cb和Cr數(shù)據(jù)相當(dāng)于兩個(gè)分辨率為w/2 * h/2的畫面,那么原來畫面中的位置為x,y的像素,在這樣的低分辨率畫面中的位置是x/2,y/2,屬于它的Cb,Cr值就在這個(gè)地方:(y/2)*(width/2)+(x/2)。
為了直觀起見,再下面的圖中,分別將Y畫面(Cb,Cr=0)和Cb,Cr畫面(Y=128)顯示出來,可見Cb,Cr畫面的分辨率是Y畫面的1/4。但是合成一個(gè)畫面之后,我們的眼睛絲毫感覺不到4個(gè)像素是共用一個(gè)Cb,Cr的。
Y畫面
Cb,Cr畫面
將Cb,Cr畫面放大觀察,里面顏色相同的塊都是2x2大小的。
附件為Windows Mobile上使用公式進(jìn)行YUV到RGB轉(zhuǎn)換的程序。其中需要注意的是Cb,Cr在計(jì)算過程中是會(huì)出現(xiàn)負(fù)數(shù)的,但是從-128到127這些數(shù)值都用一個(gè)字節(jié)表示,讀取的時(shí)候就映射0到255這個(gè)區(qū)間,成為了無符號(hào)的值,所以要減去128,才能參與公式計(jì)算。這樣的運(yùn)算有浮點(diǎn)運(yùn)算,效率是比較低的,所以要提高效率的話,一般在實(shí)用程序中使用整數(shù)計(jì)算或者查表法來代替。還有,運(yùn)算后的r,g,b可能會(huì)超過0-255的區(qū)間,作一個(gè)判斷進(jìn)行調(diào)整就可以了。
http://blog.csdn.net/flycofei/archive/2009/05/09/4160781.aspx
[@more@]來自 “ ITPUB博客 ” ,鏈接:http://blog.itpub.net/24790158/viewspace-1040917/,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任。
轉(zhuǎn)載于:http://blog.itpub.net/24790158/viewspace-1040917/
總結(jié)
以上是生活随笔為你收集整理的RGB,YUV的来历及其相互转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高斯求积分公式matlab,matlab
- 下一篇: vf计算机教程,VF教程,打印版.pdf