【问题标题】:Jpeg Compression fundamentalsJpeg 压缩基础
【发布时间】:2014-09-29 14:05:00
【问题描述】:

我正在阅读 Jpeg 压缩,但我在理解基础知识时遇到了一些问题! 请看这个架构

http://www.cs.cf.ac.uk/Dave/Multimedia/Topic5.fig_29.gif

我的问题在最后一步,假设我们有一个 16*16 像素的灰度图像,所以我们有 4 个大小为 8*8 的块。在 zigzag 扫描中,我们有 4 个大小为 1*64 的数组,每个数组的第一个索引是 DC 值,其余 63 个值是 AC 分量。让我们假设是这样的;

BLOCK-1::150,-1, 6, 0,-3,....
BLOCK-2:-38, 4,-6,-1, 1,....
BLOCK-3:18,-2,3,4,1,....
BLOCK-4:45,3,5,-1,1,....

我知道 DPCM 编码与之前的 8*8 块的区别,但是如何?!像这样的东西:

150,150-(-38),-38-18,45-18>>
150,188,-156,27

那么根据JPEG系数编码表我们有

10010110-111110,10111100-111110,01100011-111110,11011-110

对于(例如)第一行 (-1, 6, 0,-3,....) 的 AC 分量,我们使用 RLE,因此我们有:

(0,-1),(0,6),(1,-3),...

然后根据JPEG默认AC码表我们有:

00-0,100-110,111001-10

如果我的计算是正确的,接下来会发生什么?!我们放置第一个块的第一个 DC,然后放置 63 个剩余值的 RLE,依此类推?我的意思是第一个区块我们有10010110-111110 ,00-0,100-110,111001-10, ...

我有点困惑,我在任何地方都找不到答案:(

【问题讨论】:

标签: compression jpeg dct zigzag


【解决方案1】:

首先,我强烈建议您参考jpec 一个用 C 编写的微型 JPEG 编码器(仅限灰度,基于 DCT 的基线 JPEG,仅限 8x8 块)。

您可以找到主要的压缩步骤here。具体请参考this line,对应当前块的熵编码步骤。

DPCM 编码与之前 8*8 块的差异,但如何编码?

熵编码逐块操作。假设当前块不为空,DC系数编码是通过首先计算当前和之前的DC值之间的差来完成的:

int val, bits, nbits;
/* DC coefficient encoding */
if (block->len > 0) {
  val = block->zz[0] - s->dc;
  s->dc = block->zz[0];
}

注意:s 代表熵编码器状态。另外,对于第一个块,s->dc 被初始化为 0。

所以val代表当前直流差:

  1. 这种差异的大小(= 位数)是通过读取 Huffman 表中相应的 DC 代码来编码的,
  2. 然后,对其幅度(= 值)进行编码。

如果差为负,则使用二进制补码。

bits = val;
if (val < 0) {
  val = -val;
  bits = ~val;
}
JPEC_HUFF_NBITS(nbits, val);  
jpec_huff_write_bits(s, jpec_dc_code[nbits], jpec_dc_len[nbits]); /* (1) */
if (nbits) jpec_huff_write_bits(s, (unsigned int) bits, nbits);   /* (2) */

完整版请参考code section

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 2014-02-02
    • 2011-03-29
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2013-02-22
    • 2021-07-15
    相关资源
    最近更新 更多