我们讲过 JPEG (静止图像压缩标准) 是最重要的图像压缩算法。总体上说,还有其他一些非常重要的图像和视频压缩技术,其中一个是JPEG-LS (无损图像压缩标准),另外一个是MPEG (动态图像压缩标准) 。JPEG-LS允许我们进行无损压缩,也就是说不会有任何信息损失,图像中的每一个像素值都会被保留。而MPEG则是我们用来压缩视频的标准,大家的手机中大概都有MPEG,并且大家在网络上都看过用MPEG压缩的视频。那么下面就来讲解,这两个非常重要的图像和视频压缩技术。
一、无损预测压缩
我们要想学习JPEG-LS,首先就要了解在这一标准背后的思想叫做无损预测压缩。预测编码的基本思想非常简单,让我来举个例子说明一下。如下图,此4*4的小块是一幅图像的一小部分,在预测编码中, 我们首先需要确立顺序,对像素逐个进行压缩。假设我们采用一种叫做光栅扫描顺序的方法,按照从左至右的顺序,先对第一行编码,然后是第二行,依次进行。另外,红叉代表需要预测的点,灰色区域是可以用来预测的所有像素。
预测编码的思想就是根据以前的像素值来猜想和预测后面的像素值,我们不能依据未来的像素值去预测,因为解码器并不知道未来的情况。比方,猜测一下某一像素的值可能与前一个像素相同,在预测之后,我们需要来计算,预测值和真实值之间的误差。然后我们只需要将误差进行编码。比如这里使用了霍夫曼编码。而解码器就将模拟编码器所做的,做出一样的预测,用过去的情况来预测这个像素 。所以编码器和解码器互相交流,它们使用完全相同的预测策略。如果预测不精准,存在误差。那么,你给把之前通过霍夫曼编码的误差拿过来,然后直接在预测上加上误差,于是我得到了这个像素值。然后继续到下一个像素,依旧采用完全相同的方法,以此类推。如果预测器的预测精准,那么误差就总是会非常接近于零,这个误差并不会是随机的值,而会是近似于零的值。
所以,无损预测压缩的很多技术关键都在于预测器的设计。这样总体上来说,这个无损预测压缩技术的结构,比JPEG的要稍简单一些,当然这并不能达到如此大量的压缩。但最重要的是原图像将是无损的。
二、JPEG-LS
下面我来举例说明几个可行的预测器。第一种,最简单的方法,我们可以把F(x,y)预测它为F(x-1,y) ,即用前一个像素作为一种可行的预测器。而另一种还可以通过前面两个像素来预测,比如说可以用前面两个像素的平均值。还有其他一些预测器,比如JPEG-LS,所考虑的范围就更广一些。其实大家可以使用所有过去的区域中的像素,任意组合,设计出不同的预测器,这样更智能一些。问题是,如果要这么做的话,就意味着需要保存很多过去的像素值而占用大量内存。
所以JPEG-LS有着最现代化的无损预测压缩技术。也就是说可能只使用前一行或者至多前两行进行预测,但不会超过这些了。否则串行存储体系 (SSA) 将会非常复杂,并且占用大量内存。
上图是一张从外太空拍摄的地球图像。它预测效果如何?现在我们用预测器来做预测编码, 一行一行地扫描每个点,并根据它周边几个点的值来预测这个点的值。这样产生的误差分布如图d所示。可见这是一种好的预测器和一幅好的图像,所以得到很好的误差图,因为得到的误差都集中到零附近。
大家可以看到图c是预测误差图,就像预期那样,当图像中出现大的改变时,预测器并不会知道变化的发生,这就是大多数错误产生的区域。而在灰度值相对均匀的区域,预测器不会产生太多的错误。这就是分布图中有很多零的原因。
同时,我们也可以将量化加入到预测编码或相应的图像压缩技术中,我们将用量化变换系数的方法,来量化误差,这样就能够实现更多的压缩。事实上,误差大小是可以被控制的,如果每个像素点的值在量化时都可以有正负一的误差,那么重建后的图像,它每个点的灰度值和原图就会仅仅相差正负一 。这样就能很好地控制误差的范围,因为这不是对变换域进行量化,而是对图像域进行量化。
JPEG-LS就用到了这种方法,来对误差进行量化。解码器得到的是量化后的误差值,重新生成的像素点与原来的相比,会有小小的变化。
如果引进量化,预测时使用的则是量化后的误差,即进入预测器中的是量化后的值,这是在设计无损图像压缩时需要记住的 。还有一点,如果想要做量化处理,那么请记住,在图像压缩时不能使用解码器无法获得的信息。对于编码器而言 ,它只能利用解码器所能获得的信息。如果不这样做,这个系统就不对称,它也不会很好的运作。
三、MPEG
我们用来预测的方法并不只有这一种,还有MPEG。它是视频压缩的标准,也是基于预测来实现压缩的。不过,这里有很多的帧,为了完成预测,对于这个帧,可以用前面几个帧来预测它,基本思想很简单。如果拍摄的场景是完全静止的,那么每一帧都会和之前的帧一模一样,MPEG会试图利用这个性质,关注图像中的一个区域,看看这块区域是不是恒定不变的。
举个例子,如上图所示,大家可以看到图中的矩形区域,观察它附近有没有相似的区域 ,并不一定是完全相同的位置,可以是在它的周围。MPEG可以在之前的几帧里寻找相似的区域,它会去寻找相似的区域,然后只编码那些误差。它会做时间上的预测,这种想法很简单,而且非常实用。
所以,如果知道了前一帧图像,那么就能通过复制前一帧,并加上相应的误差值,高效地产生这一帧图像。因为解码器已经有了前一帧图像,所以复制它不需要占用额外的空间。又因为误差集中在零附近,用霍夫曼编码就可以高效地压缩它。
这是MPEG或者视频压缩技术的基本流程图,它和JPEG的流程图很相似,它用到了离散余弦变换、量化和像霍夫曼编码这种不等长编码方法。它只是额外添加了预测模块,用来编码时域的预测误差 ,负责对图像移动的预测。但是基本结构是一样的。这里利用了在JPEG中使用到的技术和在预测编码中用到的技术,两者相结合产生了MPEG。