熵编码

对于给定的块大小,霍夫曼编码是最有效和最受欢迎的可变长度编码方法,可以接近可实现的最大压缩的香农极限。其他著名的熵编码技术是算术编码和Golomb-Rice编码。

当已知近似熵特征时(例如,在输入流中,小值比大值更频繁出现时)Golomb-Rice编码特别有用。通过使用样本到样本的预测,Golomb-Rice编码算法可为每个像素产生0.25 bit的一维差分熵(每个像素的熵值范围为0~8 bits),而无需存储任何码字(code words)。Golomb-Rice编码本质上是最佳游程编码。为了比较,我们主要讨论霍夫曼编码和算术编码。

霍夫曼编码

David Huffman在1952年开发的霍夫曼编码已经成为最流行的无损熵编码算法。霍夫曼编码使用可变长度码表(code table)对源符号进行编码,而该码表是基于源符号中每个可能值的出现概率计算得出。霍夫曼编码以这样的方式表示每个源符号:对出现频率最高的源符号给以最短的编码,频率最低的源符号给以最长的编码。赫夫曼码的码字(各符号的代码)是异前置码字,即任一码字不会是另一码字的前缀,从而使其可唯一解码。

图2-13. 霍夫曼编码的例子

尽管可以使用两位码字来编码这四个符号(00,01,10,11),但由于这4个符号的概率分布并不均匀,并且每个符号的熵仅为1.584 bits,因此还有可提升的空间。如果使用霍夫曼码字,则每个符号需要1.77 bits。尽管使用霍夫曼码字,每个符号的码字长度仍然比理论的最小值(1.584 bits)还多0.186 bits,但与固定长度码字相比,霍夫曼编码已经提供了约12%的压缩率。通常,最大概率符号和最小概率符号之间的概率差异越大,霍夫曼编码提供的编码增益越大。当每个输入符号的概率是2的幂的倒数时,霍夫曼编码是最佳的。

算术编码

算术编码是无损熵编码技术。算术编码与霍夫曼编码的不同之处在于,算术编码将整个输入消息编码为0.0~1.0之间的小数,而不是将输入分成单个符号并用码字单独编码每个符号。当带编码的符号的概率分布未知,不是独立且分布不均等时,算术编码可以提供更好的压缩能力。虽然算术编码提供了最佳的压缩效果,但是却非常复杂,实际中需要专用的硬件引擎来加速执行速度。

图2-14. 算术编码的例子

Last updated