(旧时代的)无损图像压缩方法
作者 robotech_erx
1.无损压缩的基本步骤
图像压缩包含众多不同的技术,这些技术在复杂度、处理方式上都有着较大的差距。但是这些技术基本过程上都是相似的,通常可以分为5个基本的过程。
一、数值处理。以地形数据的压缩为例,原始的地形数据通常要经过空洞填充、重采样等处理以形成规则的栅格数据,其后可能还需要视情况将浮点数据转换为整型数据。
二、变换处理。常用的方法有预测编码、离散余弦变换、小波变换、KL变换等,这个处理的目的是通过变换将数据变得容易压缩。例如预测编码将原始的像素值转换为残差值,残差值的概率分布更加倾斜,更加容易压缩。离散余弦变换是早期常用的方法,但是小波变换具有更好的能量集中特性,是当前的主流方法。
三、逻辑处理。大多数情况下,仅仅依靠变换处理得到数据往往还需要进一步的处理才能更好的压缩,而这个步骤往往是最需要技巧的步骤。很早就发现小波变换具有更好的能量集中特性,但是很长一段时间内没有找到利用小波这种优良特性的方法,直到嵌入式零树小波编码(Embedded Zerotree Wavelet, EZW)的出现,才真正发挥了小波的威力,使之成为压缩算法的主流。逻辑处理得到结果一般是某种更容易处理的数据结构,例如EZW算法的零树结构,SPIHT算法的Set-Partitioning信息,JPEG和H.264的游程-等级(Run-level)结构等。同时这个步骤也是有损压缩和无损压缩的区别所在,如果在这个步骤里对变换参数、预测残差进行量化处理,那么压缩就是有损的,压缩过程的其他步骤像变换、熵编码一般都是无损的。
四、统计建模。负责对数据的统计特性进行分析,尽可能准确的构造出符合当前数据真实概率分布的统计模型,为后面的熵编码步骤提供支持信息。在当前的压缩算法中,统计建模一般是指上下文建模(Context Modeling),用于上下文建模的输入数据不一定是逻辑处理的结果,可能是数值处理后的数据,也可能是变换处理后的数据。
五、熵编码。常用的编码有霍夫曼编码、Golomb编码、算术编码等。算术编码因为其优异的性能而成为当前高级压缩算法的必备,除了能够将数据压缩到接近熵以外,其另一个十分重要的优点就是对编码的具体分布形式没有要求,从而使得熵编码阶段和统计建模阶段解耦。但是相应的,算术编码的复杂度比较高。
2.算法的简单对比
在图像的无损压缩上,方法主要有JBIG,JPEG-LS,无损模式的JPEG2000,以及基于上下文的自适应预测编码(CALIC)算法等。
其中,JBIG是由国际标准组织(ISO)联合二值图像专家组制定的专门用于二值图像(传真、扫描的文件等)压缩的标准,它通过使用相对较高维度的上下文建模和算术编码获得较高的压缩效率。
JPEG-LS并不是JPEG标准的无损模式,而是与JPEG独立的压缩标准。JPEG标准是有一个无损模式的,但是在压缩效率和编解码速度上都不是很理想,而JPEG-LS作为其替代开发出来的。JPEG-LS的前身是LOCO-I算法,在LOCO-I的基础上略作修改并由ISO联合图像专家组批准为无损压缩标准。相对于同期的其他算法,如UCM和CALIC,尽管LOCO-I在压缩效率上略有差距,但其算法复杂度最低,这也是该算法被选为JPEG-LS标准算法的主要原因。LOCO-I算法所采用的技术,包括基于梯度的上下文建模、基于中值边缘检测(Median Edge Detection, MED)的预测、符号表扩展和Golomb-Rice编码等,都不是复杂的算法,但是通过对这些相对简单算法的合理组合,LOCO-I算法取得了相当不错的表现,在压缩效率上,仅仅比更加复杂的CALIC低3%,但是复杂度却比CALIC低得多。由于LOCO-I的出色表现,NASA的火星探测计划也使用该算法传输无损压缩的影像数据。
CALIC是与LOCO-I同期开发的算法,该算法具有更好的压缩效率,这主要得益于它采用了更复杂的预测方式、上下文建模方法和算术编码,二者在压缩的主要流程上十分相似的。通常认为,CALIC、LOCO-I、UCM这些算法,在当前的压缩理论体系下,已经十分接近无损压缩的理论极限。
与CALIC等使用预测方法不同,在变换处理上,JPEG2000的无损压缩模式使用的是基于整数小波变换的方法,基于小波变换的编码方法最大的优势在于可方便的实现嵌入式编码(EBCOT算法),支持渐进式传输,这对网络环境下的图像传输十分有利。在压缩效率上,JPEG2000的表现与JPEG-LS不相上下,一般认为,如果图像是人工合成的图像,像扫描文件、电脑桌面截图等,JPEG-LS的压缩效率较好。如果压缩的是自然场景中的图像,则JPEG2000的压缩效率较好。
基于预测方法的最大优势是,相比于基于变换的方法,复杂度要低很多,因而使用基于预测的方法更容易设计出编解码效率高的算法。LOCO-I等基于预测的无损压缩算法的基本过程可以简单总结为,首先对原图像进行预测编码,而后依据上下文建模得到的模型信息对预测残差进行熵编码。熵编码一般使用算术编码,预测过程通常使用具有边缘检测能力的自适应预测子,而上下文建模没有固定的方法,通常采用启发式的方法。
LOCO-I算法同JBIG、CALIC等算法的一个重要的不同是它采用了相对简单的Golomb-Rice编码对残差数据进行编码。Golomb-Rice编码作为和霍夫曼编码类似替换式的变长编码,需要最少一个比特来表示一个符号,因此不能很好的处理符号概率高度倾斜的情况。例如图像中的平坦区域,这些区域绝大部分的预测残差都是0或者接近0,在残差的分布图像上会形成尖峰,Golomb-Rice编码对这种情况不能很好的处理。因此,遇到平坦区域的时候,LOCO-I算法会切换到游程编码模式,先将像素值转换成游程长度值,然后同样使用Golomb-Rice编码压缩游程长度值。CALIC算法相对其他的算法一个先进之处是首先提出了预测残差的自适应校正,该技术能把将压缩效率提高大约1.3%。最初的LOCO-I算法并不包含预测残差的自适应校正,但是在其后的改进中也采用了这种技术。预测残差的自适应校正能够使得预测残差的分布中心更接近坐标原点,这对于假定残差呈双边几何分布的Golomb编码十分有利。算术编码对符号的具体分布形式没有要求,因此如果使用算术编码,该技术对压缩效率的影响有限。
说明:JLS这些都是比较旧的压缩算法了,用了几十年了,但是简单好用速度快,在一些场合,比如嵌入式、GPU上实现都简单。近年来又出现了了一些新的无损压缩算法,据说效果有显著的提升,没有跟进关注了,有时间再研究下~。