首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jpeg压缩基本原理

Jpeg压缩基本原理
EN

Stack Overflow用户
提问于 2014-09-29 14:05:00
回答 1查看 592关注 0票数 0

我正在阅读Jpeg压缩,但是我在理解基本知识时遇到了一些问题!请参阅此模式。

29.gif

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

代码语言:javascript
运行
复制
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街区不同,但如何编码?!有些是这样的:

代码语言:javascript
运行
复制
150,150-(-38),-38-18,45-18>>
150,188,-156,27

然后根据JPEG系数编码表

代码语言:javascript
运行
复制
10010110-111110,10111100-111110,01100011-111110,11011-110

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

代码语言:javascript
运行
复制
(0,-1),(0,6),(1,-3),...

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

代码语言:javascript
运行
复制
00-0,100-110,111001-10

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

我有点糊涂,哪儿也找不到答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-30 08:31:18

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

您可以找到主压缩步骤这里。特别是,请参考与当前块的熵编码步骤相对应的这条线

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

熵编码是一个又一个块的运算。假设当前块不是空的,DC系数编码首先通过计算当前和以前DC值之间的差异来完成:

代码语言:javascript
运行
复制
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. 此差异的大小(=位数)是通过在Huffman表中读取相应的DC代码来编码的,
  2. 然后,对其幅度(=值)进行编码。

如果差额为负数,则使用两种补语。

代码语言:javascript
运行
复制
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) */

要获得完整的版本,请参阅此码段

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26101795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档