【问题标题】:Huffman in JPEG decoding: what are symbols, codes and lengthJPEG解码中的霍夫曼:什么是符号、代码和长度
【发布时间】:2020-10-11 06:54:46
【问题描述】:

我正在关注 Daniel Harding 的 youtube 播放列表“您需要了解的有关 JPEG 的一切”,以了解如何定义 JPEG 文件格式。

在解码过程中,代码如下所示:

length = getNextSymbol()
...
coefficient = readBits(length)
mcu[0] = coefficient

getNextSymbol 函数的作用是这样的:

currentCode = 0;
for i < 16:
    currentCode = (currentCode << 1) | readNextBit()
    for each huffman_code with length i:
        if currentCode == huffman_code:
            return huffman_symbols[huffman_code]

完整的代码托管在 github 上: https://github.com/dannye/jed/blob/master/src/decoder.cpp

所以我们首先得到了应该是我们想要解析的值的符号。但在那之后,我们读取了这个符号的长度。 霍夫曼表是否只存储要读取的位数而不是“真实”值。 但在 AC 解码中,我们将符号直接存储到我们的 mcu 值中!

我的理解:

  • 霍夫曼码 = 位序列或符号路径
  • 霍夫曼符号 = 我们要使用此代码编码的值

问题: 为什么我们要读取符号,然后将符号转换为长度,读取这个长度并存储我们读取的值。但在 AC 中,我们存储符号而不读取位。

我在这里缺少什么? 感谢您的帮助,对我来说真的很难理解!

【问题讨论】:

  • 可能系数太随机而无法从霍夫曼编码中受益,因此存储一个霍夫曼编码长度后跟一个值会更有效(大多数系数都是小值)
  • 我认为这里的实际问题是您试图从视频中理解 JPEG 文件格式。我推荐一本关于这个主题的书。 JPEG 包含运行长度编码。也许lengrh 用于此步骤。
  • 我找到了解决方案!我没有看到下一行,ac 确实是以相同的方式编写的。只存储值的长度对我来说仍然很奇怪。 @ThomasSablik 我正在阅读“压缩图像文件格式:JPEG、PNG、GIF、XBM、BMP”一书。

标签: c++ jpeg decoding huffman-code


【解决方案1】:

DC 分量由 Huffman 编码的位数表示,后跟解释为有符号整数的位数。该整数与最后一个块的 DC 系数相加,得到该块的 DC 系数。 (对于第一个块,“前一个”DC 系数取为零。)

AC 分量由 Huffman 编码的游程长度/位计数表示,后跟解释为有符号整数的位数。运行长度位于解码符号的高四位,位计数位于低四位。每个这样的组件都会产生一系列零系数,其长度是游程长度,后跟一个系数,其有符号值是代码后面的位。

在这两种情况下,都会在霍夫曼代码之后获取一些位以获取系数值。所以我不知道您所说的“但是在 AC 解码中,我们将符号直接存储到我们的 mcu 值中!”

【讨论】:

  • 谢谢!这有帮助。我没有看到下一个字节的读取。像往常一样,问题出在我自己身上;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多