生活經驗中,以前播放VCD的時候如果碟片磨損,視頻中往往會出現綠色的壞塊;最近在學習視頻編碼,發現很多地方損壞的的部分往往也都變成了綠色。這些解碼失敗的地方為什麼是綠色,而不是其他顏色?和YUV顏色有關嗎?

比如圖(b)中的綠色塊


賞你條公式,比多少廢話都管用:

R= 1.164383 * (Y - 16) + 1.596027*(V - 128);

G= 1.164383 * (Y - 16) - 0.391762*(U - 128) - 0.812968*(V - 128);

B= 1.164383 * (Y - 16) + 2.017232*(U - 128);

視頻里一般是YUV數據,沒數據什麼意思?就是全部都是0,你把0替代以上公司算一算,然後將結果全限制在0-255之間,就可以得到R與B都為0,只有綠色是135。就這麼簡單


其實,不管RGB還是YUV,對色彩的演算法根源是差不多的。

我們都知道,視頻的RGB通道是各有其數值的。或者說,每個通道都有其特有的灰度信息。以此來決定每個像素上各以多少RGB的亮度和色度來表達某個色彩。比如當RGB都為0時,代表黑色,都為255時代表白色,R100、G20、B20代表某個暗紅色,以此類推。這些是基本概念。

但是問題來了,如果要完全傳輸這些數據信息,會佔據很多的存儲空間和數據帶寬。於是就考慮壓縮這些數據。怎麼壓縮呢?如果把R、G、B三個色彩分開來各自觀看。你會發現,其實每個通道都有很多相同、相近的灰度的。於是辦法就來了,我們可以完全傳輸某個較均衡的色彩通道,而用這個色彩通道中的一些灰度信息,來取代其它兩個色彩通道內相似、相近信息。這樣一來,不就可以縮減很多不必要的數據了么?

結果呢,發現G通道往往是比較均衡的(相對就是YUV中的Y,Y是完整的色度與亮度信息),那R、B兩個通道的很多信息就可以從綠色通道中提取。然後通過一些壓縮演算法或色彩編譯器的計算,就能從綠色信息中還原出接近於R、B原本數值的色彩信息。這就是最基本的色彩信息壓縮原理。(實際上色彩的組成是由色度和亮度構成的,真正壓縮的信息還大量包括色度方面,這裡不做更複雜解釋。)

當視頻數據塊損壞時,因為不是沒有數據,而是數據不確定,所以該像素往往會以默認數值顯示。當然,這要看播放器或視頻編碼的默認顯示數值是多少了,有默認為0 的,也有默認為某個中間灰度的,比如127,也有默認為255的。但因為其中的G通道數據無法確認,而不確認的數據無法參與公式計算,這樣公式就沒有結果,沒有結果就=0。既然R、B數值都為0,於是就只剩下綠色塊了。

PS:你所看見的綠色只是一種常用的灰度默認演算法,其實一些軟體播放器依據其演算法,也有將壞塊顯示為黑色塊、白色塊、或直接灰度色塊的。


VCD的視頻文件是MPEG文件,像素數據是YUV色差數據

Y=0,U=0,V=0時,還原RGB數據

R=-222.921584,最終當做 0

G=135.575312,最終當做136

B=-276.835824,最終當做 0

就是這種顏色

R=0,G=136,B=0

YUV的000換算成RGB就只有G有正值,就是綠的。


推薦閱讀:
查看原文 >>
相关文章