JPEG原理分析及JPEG解码器的调试

目录

JPEG编解码原理

1.零偏置

2.8*8DCT

3.量化

4.编码

5.Huffman编码

JPEG文件格式

代码实现

更改命令参数和工作目录

 改写loadjpeg.c中的write_yuv()函数

 改写程序,用txt文件输出量化矩阵和Huffman码表

Huffman码表

 改写程序,输出DC图像


JPEG编解码原理

JPEG编码的过程如上图所示。解码是编码的逆过程。 

1.零偏置

目的:保证输入图像的采样有近似地集中在零附近的动态范围。

2.8*8DCT

目的:实现能量集中和去相关,便于去除空间冗余,以达到压缩图像数据的目的。
实现方法:首先对图像进行8 ∗ 8 8*88∗8的分块(若图像的宽高不是8的倍数,可对图像进行补0,补至8的倍数),之后进行DCT(离散余弦变换)变换,经DCT变换后,8 ∗ 8 8*88∗8的图像块将变为8 ∗ 8 8*88∗8的DCT系数块。

3.量化

利用人眼对高频细节不甚敏感的特性,对高频的AC分量进行粗量化,对低频的DC分量进行细量化。
利用人眼对色度细节不甚敏感的特性:对色度分量进行粗量化,对亮度分量进行细量化。

JPEG算法提供了两张标准的量化系数矩阵:
标准亮度量化表
标准亮度量化表
标准色差量化表
标准色差量化表

4.编码

对DC系数:差分编码
由于直流系数 F(0,0)反映了该子图像中包含的直流成分,通常较大,又由于两个相邻的子图像的直流系数通常具有较大的相关性,所以对 DC 系数采用差值脉冲编码(DPCM),即对本像素块直流系数与前一像素块直流系数的差值进行无损编码。

对AC系数:游程编码
首先对AC系数的之字形扫描,出现很多连零,使用游程编码。最后如果都是零,给出EOB (End of Block)即可。

5.Huffman编码

Huffman编码几乎是所有压缩算法的基础,它的基本原理是根据数据中元素的使用频率,调整元素的编码长度,以得到更高的压缩比。JPEG 中共采用了四张 Huffman 码表:亮度 DC、亮度 AC、色度 DC、色度 AC,即分别对图像的亮度和色度,直流和交流数据进行编码处理。

JPEG文件格式

JPEG 在文件中以 Segment 的形式组织,它具有以下特点:

1.均以 0xFF 开始,后跟 1 byte 的 Marker 和 2 byte 的 Segment length(包含表示 Length 本身所占用的 2 byte,不含“0xFF” + “Marker” 所占用的 2 byte);

2.采用 Motorola 序(相对于 Intel 序),即保存时高位在前,低位在后;

3.Data 部分中,0xFF 后若为 0x00,则跳过此字节不予处理;

代码实现

更改命令参数和工作目录

 改写loadjpeg.c中的write_yuv()函数

/**
 * Save a buffer in three files (.Y, .U, .V) useable by yuvsplittoppm
 */
static void write_yuv(const char* filename, int width, int height, unsigned 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值