上篇说过,MPEG-1主要在时间冗余和空间冗余两个方向上,去除冗余数据。时间冗余是帧与帧之间产生的冗余数据,而空间冗余则是单帧图像中,相邻像素间产生的冗余数据。对于I帧来说,因为它是关键帧,既不需要参考过去的帧,也不需要参考将来的帧。所以对I帧的编码,是为了消除空间冗余数据,而且它采用的压缩算法,和JPEG类似。如下图:
从图中可以看到,如果图像是用RGB颜色空间表示的,则首先把它转换成用YCbCr空间表示的图像。然后每个图像平面分成8x8像素的图块,并对每个图块进行离散余弦变换(DCT)。
这里DCT的作用非常大,看它的名字可能会觉得非常高大上,其实它就是一个矩阵变换。关于它其实都可以专门写一篇文章出来,不过这里我们只需要知道它的作用即可。DCT简单点来说,它就是将前面8x8像素图块的颜色空间数据,分为高频数据和低频数据,所以我们也常说,DCT是把数据从空间域转换到频率域。
那什么是高频和低频呢?这里的高频数据是指,图像颜色的变化比较强烈的地方,比如人像画的轮廓与背景的交叉处,在这里的色值变化很快,所以称为高频。相对的低频就是指,颜色变化比较缓和的地方。所以DCT的作用并不是对数据进行压缩,而是为了方便后面的操作,比如量化、RLE行程编码、以及霍夫曼编码。
下一步就是量化,因为人眼对高频区域其实并不敏感,所以利用这一点,可以将高频部分数据进行压缩。这样一来,图块的数据就会呈现两部分,一部分是变化平滑的低频数据,另一部分是刚压缩过的高频部分,数值也变得差不多。而后再经过Zig-zig编排,数据就会呈现出连续几个值相同的的形式,比如23334551550000。这样一来,再经过RLE行程编码,就可以去掉连续值相同的冗余数据。
因为RLE在编码时,对相同的数值只编码一次,同时计算相同数值重复的次数,因此称为行程编码。而与RLE处于同级的DPCM,则主要是对图块与图块之间的差值进行编码。这样一来可以再次压缩数据,之后再通过霍夫曼编码或者算术编码,编码操作也就完成了。同