我有一张图像中像素强度的霍夫曼表。我需要将其存储在二进制文件中,就像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
答案 0 :(得分:1)
您需要发送的只是代码中每个符号的位数。零可以表示符号不存在,因此未编码。位数本身可以是霍夫曼编码和行程编码,如deflate format中所做的那样。
考虑到这组代码长度,您只需要确保在两端以相同的方式分配位序列。这是使用规范的霍夫曼代码完成的,其中代码在每个位长度内按符号顺序分配。