霍夫曼与ANS

时间:2018-01-05 11:41:07

标签: compression huffman-code image-compression data-compression

我有自己的JPEG实现。在我发现我实施的ANS之前,它只使用了霍夫曼。用这两种算法压缩的测试图像产生了以下压缩比例:

霍夫曼:10.48x

ANS:10.56x

事实证明ANS更好,但只是轻微。我不是压缩专家,但是读到ANS应该像算术编码一样改进Huffman,基于这个https://en.wikipedia.org/wiki/JPEG的应该是5-7%。就我而言,改善仅为1%。这是我应该期待的吗?

1 个答案:

答案 0 :(得分:2)

JPEG标准规定了算术编码器(QM编码器),但实际上通常不支持它。这比Huffman的压缩率提高了约10%。使用jpegtran,您可以在不同的编码方法之间进行转码。

至于为什么用自定义ANS后端替换默认的Huffman并没有多大帮助 - 可能是建模,可能是标题与有效负载的大小,可能是其他的。

8位输入的DCT系数的大小可以高达+ -2048(DC),并且这些是霍夫曼编码为8位RRRRSSSS符号。只有系数的大小(4位SSSS部分)得到霍夫曼编码,并且低阶位被存储而不进行建模。如果只更换了编码器而没有其他任何改变,那么任何改进都仅限于霍夫曼编码部分。

此外,更准确的编码器需要更准确的概率。发送ANS报头总是比等效的规范发送的霍夫曼码长度更高。如果没有足够的数据来抵消标题的大小,结果可能是净损失。

“数据不足”也存在相反的问题。如果输入数据不是相同分布的,则概率可能混淆在一起,这给编码效率带来了硬性限制。 QM编码器是自适应的,没有这个问题。在这种情况下,静态编码器需要更频繁地重新启动流。