生活经验中,以前播放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有正值,就是绿的。


推荐阅读:
查看原文 >>
相关文章