【问题标题】:Should I Huffman Encode a single frame, a colour channel of that frame or an 8x8 macroblock?我应该对单个帧、该帧的颜色通道还是 8x8 宏块进行霍夫曼编码?
【发布时间】:2013-01-22 11:11:48
【问题描述】:

进一步回答我几天前关于DCT based Video Encoding Process的问题

我有 DCT、量化、之字形和 RLE 步骤,它们似乎在输出合理的值,所以我现在需要知道我应该在整个帧、该帧的颜色通道还是在 8x8 宏块级别运行 Huffman 编码?

【问题讨论】:

  • 尽可能使用范围编码器。它们总是比霍夫曼编码器提供更好的结果。
  • 你为什么不看看现有的编解码器(例如JPEG)做什么?
  • 感谢 cmets。在查找之前,我还没有听说过范围编码器。我将不得不在这个项目中使用霍夫曼,因为我必须模拟一些使用霍夫曼编码的内部软件使用的编码/解码过程。
  • @OliCharlesworth 我已经做到了,它让我走到了这一步。很难弄清楚霍夫曼步骤的范围。即我应该一次处理整个帧的运行级别值还是一个通道或一个 8x8 块。
  • @FUZxxl 从我读过的内容来看,范围编码是算术编码的一个子集?正如我提到的,我正在使用的霍夫曼系统采用了超级快的查找表,这在我的使用场景中比最终结果是否完美像素更重要。非常感谢您的好建议。

标签: encode huffman-code dct


【解决方案1】:

很难给出明确的答案,因为这实际上取决于您的数据,以及您希望解码器的复杂程度。

您可能不想对流中所有不同类型的数据使用单一的霍夫曼编码,因为使用的符号不同,并且出现在不同的频率(即交流分量与直流分量不同)分量,如果您使用了非 RGB 颜色空间,亮度与色度不同)。 JPEG方法是对不同的数据项使用不同的表,但是数据在流中是交错的(所以还是按顺序解析的)。这些表不一定是针对数据动态计算的,而是通常只使用默认值。

除此之外,我认为你如何分解或交错数据不会有太大的不同。

【讨论】:

  • 感谢您的回复。我已经准备好从我试图模拟的系统中使用的一组霍夫曼查找表。我的问题是知道应用它们的范围,即基于整个帧运行级别对或仅单个通道生成 huff 代码,或者为 8x8 宏块级别的 DCT 范围生成代码。希望这是有道理的。
  • 我认为这不重要。至少,不会影响输出的大小——除非你出于某种原因引入额外的填充,否则我想不出你为什么要这样做,除非你为错误添加同步点恢复什么的。否则,这只是您想要数据的顺序的问题。
  • 不,我没有引入填充或额外数据。我目前在宏块级别生成我的运行级别对,因此对于后续的 8x8 块,我可能在块 1 和块 2 中有 [4,1],[10,45],[12,0],... 6,1],[5,13],[18,0],... 所以知道应用霍夫曼的范围也会影响我生成的概率。请注意组合两个块运行级别对如何给出不同的概率 [4+6/55,1],[10/55,45],[5/55,13],[30/55,0],...
  • 你说你有张桌子。如果你正在生成它们,我无法想象在每个块的基础上这样做会很有效,因为需要以某种方式实际存储霍夫曼表,除非你运行某种自适应方案,除非每个块都有完全不同的符号频率,这向我表明你的压缩首先被破坏了,因为使数据可压缩是量化的目标。
  • 嗯,简单的答案是您应该使用这些表来编码与生成它的频率非常相似的数据。其他任何事情都不太可能产生好的结果。除此之外,您可以根据自己的喜好构建数据。
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多