工作中經常會使用一些顏色空間,最主要的就是使用rgb空間和yuv空間,把兩空間的一些知識記錄在此。
在圖中,你可以看到4:4:4格式的亮度、色度取樣分布。就像圖中所表示的,畫面中每個象素都有與之對應的色度和亮度取樣資訊。
其次就是4:2:2,就是說,每4點y取樣,就有2點cb和2點cr。在這種格式中,色度訊號的掃瞄線數量和亮度訊號一樣多,但是每條掃瞄線上的色度取樣點 數卻只有亮度訊號的一半。當4:2:2訊號被解碼的時候,「缺失」的色度取樣,通常由一定的內插補點演算法通過它兩側的色度資訊運算補充。
看4:2:2格式亮度、色度取樣的分布情況。在這裡,每個象素都有與之對應的亮度取樣,同時一半的色度取樣被丟棄,所以我們看到,色度取樣訊號每隔 乙個取樣點才有乙個。當著張畫面顯示的時候,缺少的色度資訊會由兩側的顏色通過內插補點的方式運算得到。就像上面提到的那樣,人眼對色度的敏感程度不如亮 度,大多數人並不能分辨出4:2:2和4:4:4顏色構成的畫面之間的不同。
色度訊號解析度最低的格式,也就是***所使用的 格式,就是4:2:0了。事實上4:2:0是乙個混亂的稱呼,按照字面上理解,4:2:0應該是每4點y取樣,就有2點cb和0點cr,但事實上完全不是 這樣。事實上,4:2:0的意思是,色度取樣在每條橫向掃瞄線上只有亮度取樣的一半,掃瞄線的條數上,也只有亮度的一半!換句話說,無論是橫向還是縱向, 色度訊號的解析度都只有亮度訊號的一半。舉個例子,如果整張畫面的尺寸是720*480,那麼亮度訊號是720*480,色度訊號只有360*240。在 4:2:0中,「缺失」的色度取樣不單單要由左右相鄰的取樣通過內插補點計算補充,整行的色度取樣也要通過它上下兩行的色度取樣通過內插補點運算獲得。這 樣做的原因是為了最經濟有效地利用***的儲存空間。誠然,4:4:4的效果很棒,但是如果要用4:4:4儲存一部電影,我們的***盤的直徑至少要有兩 英呎(六十多厘公尺)!
上圖表示了概念上4:2:0顏色格式非交錯畫面中亮度、色度取樣訊號的排列情況。同4:2:2格式 一樣,每條掃瞄線中,只有一半的色度取樣資訊。與4:2:2不同的是,不光是橫向的色度資訊被「扔掉」了一半,縱向的色度資訊也被「扔掉」了一半,整個屏 幕中色度取樣只有亮度取樣的四分之一。請注意,在4:2:0顏色格式中,色度取樣被放在了兩條掃瞄線中間。為什麼會這樣呢?很簡單:***盤上的顏色取樣 是由其上下兩條掃瞄線的顏色資訊「平均」而來的。比如,圖三中,第一行顏色取樣(line 1和line 2中間夾著的那行)是由line 1和line 2「平均」得到的,第二行顏色取樣(line 3和line 4中間夾著的那行)也是同樣的道理,是由line 3和line 4得到的。
雖然文章中多次提到「平均」這個概念,但是這個「平均」可不是我們通常意義上的(a+b)/2的平均。顏色的處理有極其複雜的演算法保證其最大限度地減少失真,接近原始質量。
關於 rgb 跟 yuv 的轉換:
計算機彩色顯示器顯示色彩的原理與彩色電視機一樣,都是採用r(red)、g(green)、b(blue)相加混色的原理:通過發射出三種不同強度的電子束,使螢幕內側覆蓋的紅、綠、藍磷光材料發光而產生色彩。這種色彩的表示方法稱為rgb色彩空間表示(它也是多**計算機技術中用得最多的一種色彩空間表 示方法)。
根據三基色原理,任意一種色光f都可以用不同分量的r、g、b三色相加混合而成。
f = r [ r ] + g [ g ] + b [ b ]
其中,r、g、b分別為三基色參與混合的係數。當三基色分量都為0(最弱)時混合為黑色光;而當三基色分量都為k(最強)時混合為白色光。調整r、g、b三個係數的值,可以混合出介於黑色光和白色光之間的各種各樣的色光。
那 麼yuv又從何而來呢?在現代彩色電視系統中,通常採用三管彩色攝像機或彩色ccd攝像機進行攝像,然後把攝得的彩色影象訊號經分色、分別放大校正後得到 rgb,再經過矩陣變換電路得到亮度訊號y和兩個色差訊號r-y(即u)、b-y(即v),最後傳送端將亮度和色差三個訊號分別進行編碼,用同一通道傳送 出去。這種色彩的表示方法就是所謂的yuv色彩空間表示。
採用yuv色彩空間的重要性是它的亮度訊號y和色度訊號u、v是分離的。如果只有y訊號分量而沒有u、v分量,那麼這樣表示的影象就是黑白灰度影象。彩色電視採用yuv空間正是為了用亮度訊號y解決彩色電視機與黑白電視機的相容問題,使黑白電視機也能接收彩色電視頻號。
yuv與rgb相互轉換的公式如下(rgb取值範圍均為0-255):
y = 0.299r + 0.587g + 0.114b
u = -0.147r - 0.289g + 0.436b
v = 0.615r - 0.515g - 0.100b
r = y + 1.14v
g = y - 0.39u - 0.58v
b = y + 2.03u
ps:貼上兩個網上找到的sourcecode:
rgb->yuv
y = 0.299r + 0.587g + 0.114b
cb = 0.564(b − y )
cr = 0.713(r − y )
**:uint8_t col_rgbtoyuv(uint8_t r,uint8_t g,uint8_t b, uint8_t *y,int8_t *u,int8_t *v)
yuv->rgb
r = y + 1.402cr
g = y − 0.344cb − 0.714cr
b = y + 1.772cb
**:uint8_t col_yuvtorgb( uint8_t y,int8_t u,int8_t v,uint8_t *r,uint8_t *g,uint8_t *b)
YUV格式詳解
yuv格式通常有兩大類 打包 packed 格式和平面 planar 格式。前者將yuv分量存放在同乙個陣列中,通常是幾個相鄰的畫素組成乙個巨集畫素 macro pixel 而後者使用三個陣列分開存放yuv三個分量,就像是乙個三維平面一樣。yuv pixel formats nv12和nv21屬於y...
YUV格式詳解
工作中經常會使用一些顏色空間,最主要的就是使用rgb空間和yuv空間,把兩空間的一些知識記錄在此。在圖中,你可以看到4 4 4格式的亮度 色度取樣分布。就像圖中所表示的,畫面中每個象素都有與之對應的色度和亮度取樣資訊。其次就是4 2 2,就是說,每4點y取樣,就有2點cb和2點cr。在這種格式中,色...
YUV格式詳解
工作中經常會使用一些顏色空間,最主要的就是使用rgb空間和yuv空間,把兩空間的一些知識記錄在此。在圖中,你可以看到4 4 4格式的亮度 色度取樣分布。就像圖中所表示的,畫面中每個象素都有與之對應的色度和亮度取樣資訊。其次就是4 2 2,就是說,每4點y取樣,就有2點cb和2點cr。在這種格式中,色...