目录
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