JPEG编码原理与解码分析

该博客主要介绍了JPEG编码解码的基本原理,包括零偏置、DCT变换、量化、DC和AC系数的处理,以及Huffman编码。实验内容包括从JPG文件输出YUV文件,程序调试,输出量化矩阵和HUFFMAN码表,以及显示DC和AC图像。实验旨在让读者掌握数据压缩算法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、实验目的

二、实验原理

三、实验内容

四、实验结果


一.实验目的

掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。

二.实验原理

JPEG编码原理

 1.零偏置

    对于灰度级为2n 的像素,通过减去2(n-1),将无符号整数变为有符号数,以将绝对值大的数出现的概率大大减小,提高编码效率

2.DCT变换

   对每个单独的彩色图像分量,把整个分量图像分成8*8的图像块,作为二维离散余弦变换DCT的输入,并进行DCT变换。以实现能量集中和去相关,便于去除空间冗余,提高编码效率。DCT是一种无损变换,也无法对图像进行压缩,这样做的目的是在为下一步的量化做准备。

3.量化

   量化是编码流程中唯一会引入误差也是唯一会带来压缩效果的步骤。 由于人眼对亮度信号比对色差信号更敏感,因此JPEG使用了两种量化表:亮度量化值和色差量化值。根据人眼对低频敏感,对高频不太敏感的视觉特性,对低频部分采取较细的量化,对高频部分采取较粗的量化,减少了视觉冗余。量化矩阵并不是固定的,可以根据要求的质量的不同而进行调整。

4.DC系数

    经过8*8DCT变换后,DC直流系数的数值都比较大,且相邻图像块之间的DC系数变化不大,因此JPEG算法使用了差分脉冲调制编码DPCM技术对相邻图像块之间的量化DC系数的差值DIFF进行编码。

5.AC系数

    经过DCT变换后,AC系数大多集中在左上角的低频分量区,因此采用Z字形按频率的高低顺序读出可以出现很多连零的情况,便于使用游程编码,若最后的数据均为0,则直接给出EOB。

6.Huffman编码

  对DC系数DPCM的结果和AC系数RLE的结果进行Huffman编码,类别ID采用一元码编码,类内索引采用定长码编码。共有亮度DC、亮度AC、色差DC、色差AC四张码表。

三.实验内容

1.JPG文件输出YUV文件

static void write_yuv(const char *filename, int width, int height, unsigned char **components)
{
  //将输出文件保存为可供YUVViewer观看的YUV文件
  FILE *F;
  char temp[1024];
  snprintf(temp, 1024, "%s.yuv", filename);
  F = fopen(temp, "wb");
  fwrite(components[0], width, height, F)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值