一、实验名称:JPEG原理分析及JPEG解码器的调试
二、实验目的
掌握JPEG编解码系统的基本原理。初步掌握复杂的数据压缩算法实现,并能根据理论分析需要实现所对应数据的输出。
三、主要设备
安装Windows和Visual Studio软件的个人计算机
四、实验内容
1.JPEG编解码原理
(1) 零偏置电平下移
先对8×8的像块进行零偏置电平下移(Level Offset),即对于灰度级为2 n 2^n2
n
的像素,通过减去2 n − 1 2^{n-1}2
n−1
,将无符号整数变为有符号数,使其值域变为[ − 2 n − 1 , 2 n − 1 − 1 ] [-2{n-1},2{n-1}-1][−2
n−1
,2
n−1
−1],以将绝对值大的数出现的概率大大减小,提高编码效率。
(2) 8×8 DCT
将图像分为8×8的像块;对于宽(高)不是8的整数倍的图像,使用图像边缘像素填充,以不改变频谱分布。然后对每一个子块进行DCT(Discrete Cosine Transform,离散余弦变换),以实现能量集中和去相关,便于去除空间冗余,提高编码效率。
DCT核矩阵
JPEG中使用的是二维8×8 DCT(N = 8 N=8N=8),则
(3) 量化
实际上JPEG压缩编码算法中,真正可供调整的部分并不多:DCT、熵编码这两个主要步骤都是完全确定的了,实际上只有量化可以调整,量化也自然是JPEG压缩编码算法的核心。此外,量化是编码流程中唯一会引入误差也是唯一会带来压缩的步骤。
(4) DC系数差分编码
(5) AC系数Zig-Zag扫描与RLE
(6) Huffman编码
JPEG编码的过程如上图所示。解码是编码的逆过程。
五、实验结果
输出的yuv图像为:
输出一个8x8的量化表。
六、实验代码
- 将输出文件保存为.yuv格式
static void write_yuv(const char* filename, int width, int height, unsigned char** components) {
FILE* F;
char temp[1024];
snpri