Jpeg Compression基础知识

时间:2014-09-29 14:05:01

标签: compression jpeg dct zigzag

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

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

我的问题是在最后的步骤,考虑我们有一个16 * 16像素的灰色图像,所以我们有4块8 * 8的大小。在Z字形扫描中,我们有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

和(例如)的AC组件,第一行(-1,6,0,-3,....)我们使用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, ...

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

1 个答案:

答案 0 :(得分:0)

首先,我强烈建议您参考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表示当前的DC差异:

  1. 通过读取霍夫曼表中相应的DC代码对此差异的大小(=位数)进行编码,
  2. 然后,它的幅度(=值)被编码。
  3. 如果差异为负,则使用两个补码。

    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