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