1

我有一张来自图像中像素强度的霍夫曼表。我需要将其存储在二进制文件中,就像 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 级,1 表示 3 级,等等。

  • 为了确保没有混淆,每个级别的代码最初都是按数字排序的,例如级别 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
4

1 回答 1

1

您需要发送的只是每个符号的代码中的位数。零可以表示该符号不存在,因此未编码。比特数本身可以是霍夫曼编码和游程编码,就像在deflate 格式中所做的那样。

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

于 2013-04-06T03:03:27.510 回答