如何存储和随后解码霍夫曼表

时间:2013-04-05 22:18:27

标签: compression decode huffman-code

我有一张图像中像素强度的霍夫曼表。我需要将其存储在二进制文件中,就像jpeg图像的DHT格式一样。接收器然后可以提取这些值,但我不知道如何重建表。我详细描述了如何生成和存储我的表,以防任何排序顺序影响最终结果。

生成表

  • 在列表中为每个强度[0,255]创建(频率,强度)对,然后删除任何频率为0的对。

  • 按频率的升序对此列表进行排序。在多对具有相同频率的情况下,它们按强度分类,例如, [(1,7),(1,55),(1,107),(2,4),(2,19)等]

  • 弹出两个最前面的对,第一个是左子,第二个是右子,将它们放在父节点中,然后再次对列表进行排序。当对列表进行排序时,对于相同的频率,首先将各个对放置,然后以升序长度顺序放置父节点,例如, [(1,107),(2,4),(2,19),(2,((1,7),(1,55)))等]

  • 迭代构建整个树,然后遍历它以获取代码。

存储表

要存储表格,标题按以下顺序依次形成:

  • 树中的级别数(无论如何往往是16)

  • 对于每个级别(1-16),有多少代码,例如0(1),2(2),1(3)等

  • 然后按顺序写出强度,例如: 2级为2级,3级为1级等

  • 为了确保没有混淆,每个级别的代码最初都是按数字排序的,例如:等级6:000100,000101,001000,001001,001011

提取后的代码

所以现在我可以提取这些,我得到下表中的值。我已经读到这是重建代码所需的全部内容,但我不理解这个过程。例如,我的2级代码应该是10和11.我怎么知道它不是00和01呢?我提供了前几个级别,如果你能解释这个过程只是为了让我继续,我会非常感激。

bits | number
-----+--------
1    |    0
2    |    2
3    |    1
4    |    1
5    |    2
6    |    5
7    |    6
8    |    6
9    |   17
etc

1 个答案:

答案 0 :(得分:1)

您需要发送的只是代码中每个符号的位数。零可以表示符号不存在,因此未编码。位数本身可以是霍夫曼编码和行程编码,如deflate format中所做的那样。

考虑到这组代码长度,您只需要确保在两端以相同的方式分配位序列。这是使用规范的霍夫曼代码完成的,其中代码在每个位长度内按符号顺序分配。