Compression Jpeg压缩基础

Compression Jpeg压缩基础,compression,jpeg,dct,zigzag,Compression,Jpeg,Dct,Zigzag,我在读Jpeg压缩,但我在理解基础方面有一些问题! 请看这个模式 我的问题是在最后的步骤中,考虑到我们有一个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

我在读Jpeg压缩,但我在理解基础方面有一些问题! 请看这个模式

我的问题是在最后的步骤中,考虑到我们有一个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
对于交流分量,例如,第一行-1,6,0,-3,…我们使用RLE,因此我们有:

(0,-1),(0,6),(1,-3),...
然后根据JPEG默认AC代码表,我们有:

00-0,100-110,111001-10
如果我的计算正确,接下来会发生什么?!我们把第一个块的第一个DC和之后的63剩余值的RLE,依此类推?我的意思是,对于第一个街区,我们有10010110-11111000-0100-110111001-10


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

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

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

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差:

该差值的大小=通过读取哈夫曼表中相应的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) */

完整版本请参考此部分。

我推荐:谢谢,我阅读了第7章,但找不到我的答案:|直流系数差和交流值是哈夫曼编码的。