RGB,YUV的來歷及其相互轉換

2021-05-23 15:36:27 字數 3512 閱讀 4501

人類眼睛的色覺,具有特殊的特性,早在上世紀初,young(1809)和helmholtz(1824)就提出了視覺的三原色學說,即:視網膜存 在三種視錐細胞,分別含有對紅、綠、藍三種光線敏感的視色素,當一定波長的光線作用於視網膜時,以一定的比例使三種視錐細胞分別產生不同程度的興奮,這樣 的資訊傳至中樞,就產生某一種顏色的感覺。

70年代以來,由於實驗技術的進步,關於視網膜中有三種對不同波長光線特別敏感的視錐細胞的假說,已經被許多出色的實驗所證實。 例如:①有人用不超過單個視錐直徑的細小單色光束,逐個檢查並繪製在體(最初實驗是在金魚和蠑螈等動物進行,以後是人)視錐細胞的光譜吸收曲線,發現所有 繪製出來的曲線不外三種型別,分別代表了三類光譜吸收特性不同的視錐細胞,一類的吸收峰值在420nm處,一類在534nm處,一類在564nm處,差不 多正好相當於藍、綠、紅三色光的波長。與上述視覺三原色學說的假設相符。②用微電極記錄單個視錐細胞感受器電位的方法,也得到了類似的結果,即不同單色光 所引起的不同視錐細胞的超極化型感受器電位的大小也不同,峰值出現的情況符合於三原色學說。

於是,在彩色顯示器還沒有發明的時候,人類已經懂得使用三原色光調配出所有顏色的光。並不是說三原色混合後產生了新的頻率的光,而是給人眼睛的感覺是這樣。

在顯示器發明之後,從黑白顯示器發展到彩色顯示器,人們開始使用發出不同顏色的光的螢光粉(crt,等離子體顯示器),或者不同顏色的濾色片 (lcd),或者不同顏色的半導體發光器件(oled和led大型全彩顯示牌)來形成色彩,無一例外的選擇了red,green,blue這3種顏色的發 光體作為基本的發光單元。通過控制他們發光強度,組合出了人眼睛能夠感受到的大多數的自然色彩。

計算機顯示彩色影象的時候也不例外,最終顯示的時候,要控制乙個畫素中red,green,blue的值,來確定這個畫素的顏色。計算機中無法模擬連續的 儲存從最暗到最亮的量值,而只能以數字的方式表示。於是,結合人眼睛的敏感程度,使用3個位元組(3*8位)來分別表示乙個畫素裡面的red,green和 blue的發光強度數值,這就是常見的rgb格式。我們可以開啟畫圖板,在自定義顏色工具框中,輸入r,g,b值,得到不同的顏色。

無論中間處理過程怎樣,最終都是為了展示給人**,這樣的更改,也是從人眼睛的特性出發,和發明rgb三原色表示方法的出發點是一樣的。

於是我們使用y,cb,cr模型來表示顏色。iain的書中寫道:the human visual system (hvs) is less sensitive to colour than to luminance (brightness).人類視覺系統(其實就是人的眼睛)對亮度的感覺比對顏色更加敏感。

在rgb色彩空間中,三個顏色的重要程度相同,所以需要使用相同的解析度進行儲存,最多使用rgb565這樣的形式減少量化的精度,但是3個顏色需要按照 相同的解析度進行儲存,資料量還是很大的。所以,利用人眼睛對亮度比對顏色更加敏感,將影象的亮度資訊和顏色資訊分離,並使用不同的解析度進行儲存,這樣 可以在對主觀感覺影響很小的前提下,更加有效的儲存影象資料。

ycbcr色彩空間和它的變形(有時被稱為yuv)是最常用的有效的表示彩色影象的方法。y是影象的亮度(luminance/luma)分量,使用以下公式計算,為r,g,b分量的加權平均值:

y = kr r + kgg + kbb

其中k是權重因數。

上面的公式計算出了亮度資訊,還有顏色資訊,使用色差(color difference/chrominance或chroma)來表示,其中每個色差分量為r,g,b值和亮度y的差值:

cb = b -y

cr = r -y

cg = g- y

其中,cb+cr+cg是乙個常數(其實是乙個關於y的表示式),所以,只需要其中兩個數值結合y值就能夠計算出原來的rgb值。所以,我們僅儲存亮度和藍色、紅色的色差值,這就是(y,cb,cr)。

相比rgb色彩空間,ycbcr色彩空間有乙個顯著的優點。y的儲存可以採用和原來畫面一樣的解析度,但是cb,cr的儲存可以使用更低的解析度。 這樣可以占用更少的資料量,並且在影象質量上沒有明顯的下降。所以,將色彩資訊以低於量度資訊的解析度來儲存是乙個簡單有效的影象壓縮方法。

在colour spaces .17 itu-r recommendation bt.601 中,建議在計算y時,權重選擇為kr=0.299,kg=0.587,kb=0.114。於是常用的轉換公式如下:

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

有了這個公式,我們就能夠將一幅rgb畫面轉換成為yuv畫面了,反過來也可以。下面將畫面資料究竟是以什麼形式儲存起來的。

在rgb24格式中,對於寬度為w,高度為h的畫面,需要w*h*3個位元組來儲存其每個畫素的rgb資訊,畫面的畫素資料是連續排列的。按照 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資料需要w*h個位元組來表示(每個畫素點乙個亮度)。而cb和cr資料則是畫面中4個畫素共享乙個cb,cr值。這樣cb用w*h/4個位元組,cr用w*h/4個位元組。

yuv檔案中,把多個幀的畫面連續存放。就是yuv yuv yuv…..這樣的不斷連續的形式,而其中每個yuv,就是一幅畫面。

在這單個yuv中,前w*h個位元組是y資料,接著的w*h/4個位元組是cb資料,再接著的w*h/4個位元組為cr資料。

在由這樣降低了解析度的資料還原出rgb資料的時候,就要依據畫素的位置找到它對應的y,cb,cr值,其中y值最好找到,畫素位置為x,y的 話,y資料中第y*width+x個數值就是它的y值。cb和cr由於是每2x2畫素的畫面塊擁有乙個,這樣cb和cr資料相當於兩個解析度為w/2 * h/2的畫面,那麼原來畫面中的位置為x,y的畫素,在這樣的低解析度畫面中的位置是x/2,y/2,屬於它的cb,cr值就在這個地方:(y/2)* (width/2)+(x/2)。

為了直觀起見,再下面的圖中,分別將y畫面(cb,cr=0)和cb,cr畫面(y=128)顯示出來,可見cb,cr畫面的解析度是y畫面的1/4。但是合成乙個畫面之後,我們的眼睛絲毫感覺不到4個畫素是共用乙個cb,cr的。

cb,cr畫面

將cb,cr畫面放大觀察,裡面顏色相同的塊都是2x2大小的。

附件為windows mobile上使用公式進行yuv到rgb轉換的程式。其中需要注意的是cb,cr在計算過程中是會出現負數的,但是從-128到127這些數值都用乙個 位元組表示,讀取的時候就對映0到255這個區間,成為了無符號的值,所以要減去128,才能參與公式計算。這樣的運算有浮點運算,效率是比較低的,所以要 提高效率的話,一般在實用程式中使用整數計算或者查表法來代替。還有,運算後的r,g,b可能會超過0-255的區間,作乙個判斷進行調整就可以了。

不過這裡面的yuv to rgb的演算法,效率實在是低,因為裡面有了浮點運算,解一幀176*144的影象大概需要400ms左右,這是無法忍受的,如果消除浮點運算,只需要10ms左右,效率的提公升真是無法想象.所以大家還是避免在手機上面進行浮點運算.

RGB,YUV的來歷及其相互轉換

人類眼睛的色覺,具有特殊的特性,早在上世紀初,young 1809 和helmholtz 1824 就提出了視覺的三原色學說,即 視網膜存在三種視錐細胞,分別含有對紅 綠 藍三種光線敏感的視色素,當一定波長的光線作用於視網膜時,以一定的比例使三種視錐細胞分別產生不同程度的興奮,這樣的資訊傳至中樞,就...

RGB,YUV 的來歷及其相互轉換

人類眼睛的色覺,具有特殊的特性,早在上世紀初,young 1809 和helmholtz 1824 就提出了視覺的三原色學說,即 視網膜存在三種視錐細胞,分別含有對紅 綠 藍三種光線敏感的視色素,當一定波長的光線作用於視網膜時,以一定的比例使三種視錐細胞分別產生不同程度的興奮,這樣的資訊傳至中樞,就...

latex word相互轉換

有時還是不得不把 latex 寫的文件轉成 word。一些可行的辦法有 1 先用 tth 或 latex2html 之類的工具把 latex 轉成 html,再把 html 轉成word。2 先生成 pdf,再用 pdf2word 轉成word。3 安裝 tex2word 用 word 開啟 lat...