本章需要一些关于信号处理和信息论的知识。我们将学习图像压缩、静态图像压缩(JPEG) 、动态图像压缩(MPEG) 等技术是如何工作的。
一、 为什么需要图像压缩?
为什么我们需要图像压缩?如果一张图片不进行压缩,可以容易计算出,一张低分辨率的图像也会占用很大的空间,我们不可能把一大堆这样的照片,存入我们的手机或者电脑中。所以我们需要压缩技术,来帮助我们储存这些图像和视频,而不必在我们的手机或电脑中占据大量的空间。
二、 为什么图像可以被压缩?
为什么我们可以压缩图像和视频? 其中一个原因通常被称为冗余。这是我们首要的关注点之一,不是每个像素值都是相等的,有的像素值出现的多些,有的则出现的少些。从下图中,我们可以看到这张图里有四种颜色,如果用8比特来表示,也就是用256种可能性来表示4种颜色,这是一种浪费。所以我们要利用这一点。这种冗余称为编码冗余。
还有一个原因使得我们可以进行压缩,还是关于大量的冗余。如下图所示,我们假设一根线的灰度是128,想象一下这条线非常的长,比如说10000个像素那么长。所以至少有两种极端的方法来表示这条线,一种是把128重复10000次,这会花掉10000字节也就是10000乘以8比特,看起来非常浪费。或者换一种办法,我只记录128和10000两个字节,也就是说我给出了一个数字,然后再说明我要重复10000次。这样用来存储空间就会小得多了。这是一个极端的例子,但是非常重要,它在有均匀区域或者几何一致性的图像中经常出现,我们可以利用这一点来进行压缩。这就是我们能进行压缩的第二个原因。而这种冗余被称为空间冗余。
我们能进行压缩的第三个原因,叫做无关。下图是一张纯色图像,灰度值为常数。 这张图里有非常多的无关信息,这里有大量的我们并不关心的信息会被存储。甚至可能说我们并不介意这些信息被存储时会有些许的不同。比如说,如果这个值是128,我并不介意它被说成是127,有可能我甚至不关心它的精确值是多少。所以这里有大量的无用信息、无关信息。
以上就是我们能进行压缩的三个原因,我们将利用这些原因,实现很大程度的压缩 书上上有许多压缩的方法,其中一部分成功的图像压缩方法最终成为了标准,如JPEG、MPEG。
三、 图像压缩的流程介绍
一般的图像压缩技术的原理是这样的,从一张图像开始,经过映射器(mapper) 进行了变换使得其更容易被压缩。这些映射变换,有些与傅里叶变换相关,实际上也就是一个余弦变换。有些映射变换是发生在空间域上,依据相邻的像素进行变换。我们后面将会对此进行讨论。在映射变换之后,图像在空间上变得易于压缩。
然后下一步就是量化。量化是引入错误的主要原因。比如说,可能有一个像素,它的值为17,将这个值除以2,然后再取整量化,之后再乘,我们重构得到的值为16而不是17。所以量化会引入误差,我们将描述一些最好的量化技术。实际上JPEG所用的量化技术就是上面例子这种。
最后一个步骤是利用符号编码器编码。这儿信息论就起到了作用,因为信息论告诉我们如何在计算时间和压缩效率上都变得更有效率。从使用更频繁的某些像素值的角度出发,信息论能够利用存在于图像中的冗余。
我们把实现以上三个步骤的单元称为编码器。即实现获取图像然后压缩它,最终得到了一个压缩过的文件。接下来我们希望存储或者传输这些文件。接下来进入解码器,解码器会将其解码,解码器并不会进行量化,因为之前都已经做过了,解码器可能只是进行逆运算。然后进行逆映射变换,就可以得到图像。
如果是没有误差的无损压缩的话,那么解压后得到的图像应是完好无损的,或者说只是一个原图的近似品。一般而言这个近似品,我们裸眼无法分辨出与原图的不同之处,那样的话这就是一个好的压缩方式,例如JPEG和MEPG。
以上就是图像压缩的全部步骤。以JPEG为例,JPEG首先得到一张图片,把它分割成一些8*8的小块。然后就是进行正变换,这就是我们刚说过的映射变换,对于JPEG来说这个变换是离散余弦变换 (Discrete Cosine Transform) ,然后,JPEG会以将值除以某个数然后取整的方式来量化,不同的除数会产生不同的版本。最后进行符号编码,也就是霍夫曼编码。这就是JPEG的全部流程。
解码器会对其进行解码,运用离散余弦变换的逆变换,它把这些块一个挨着一个摆放,然后显示图像。到这儿我们只完成了一种颜色的处理,我们还将讨论不同颜色。 例如是如何处理RGB的,通过利用不同颜色间的冗余,我们实际上可以进一步地压缩。接下来,我们将详细讨论其中每一个步骤。