目录
一.实验目的
掌握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)