我听说 Jpeg 使用 Hufman 代码。什么是霍夫曼码?
2 回答
霍夫曼编码是一种采用符号(例如字节、DCT 系数等)并使用根据统计概率分配的可变长度代码对它们进行编码的方法。经常使用的符号将使用仅占用几位的代码进行编码,而很少使用的符号则由需要更多位进行编码的符号表示。
一个 JPEG 文件包含多达 4 个霍夫曼表,这些表定义了这些可变长度代码(占用 1 到 16 位)和代码值(一个 8 位字节)之间的映射。创建这些表通常涉及计算每个符号(DCT 码字)在图像中出现的频率,并相应地分配位串。但是,大多数 JPEG 编码器只是使用 JPEG 标准中提供的霍夫曼表。一些编码器允许优化这些表,这意味着创建了一个最佳二叉树,从而可以生成更有效的霍夫曼表。
查看http://www.cs.duke.edu/csed/poop/huff/info/以获得更深入的解释
只是为了完成david99world给出的答案:
霍夫曼编码只是 jpeg 压缩的最后一步。重要的压缩来自应用于 DCT的量化矩阵。这是什么?好吧,DCT 变换只是一种按频率显示图像信息的方法。而不是像这样具有像素值的矩阵:
您将有一个带有 DCT 系数的矩阵,显示频率信息,将大部分信息集中在左上角:
现在您有了 DCT 系数,接下来就是真正的压缩步骤,即将所有值除以基于人眼视觉的量化矩阵。该矩阵将使那些包含与人眼无关的信息的系数为零,并将几乎相同的重要系数归零。
为什么这一步对压缩很重要?因为现在你有很多零,霍夫曼编码会将大量的零组合成小的代码字,所以你正在节省存储内存。
您可以尝试在 Matlab 中编写整个算法,您会更好地理解它。请注意,如果多次应用 Q 矩阵,您将获得更多压缩(更多零),但图像质量也会降低。
我希望这能让你更清楚。