本博文为概览性介绍。后面有空了再分几篇博文分别介绍所用到的技术细节。
1.编解码目标
编码和解码是个逆过程。jpeg编码的目的在于图形去冗余,进行数据压缩,解码的目的在于还原图像,使能够进行预览。
2.编码过程
贴一张网上的图片,但缺少了一些步骤,下面用文字来描述每一个步骤。
2.1.采样。
8位采样,像素值的范围锁定在0-255,无符号,都为正数。
2.2.分块(block)
补成8x8的block,以应对宽和高不是8的整数倍的情况,方便后续进行8x8的DCT2变换。
2.3.零偏置(LevelOffset)
通过减28-1=128,使各个像素值以0为中心分布,变换后的值有的为正,有的为负,在[-128,127]区间分布。
2.4.8x8的二维离散余弦变换(DCT2)。
DCT变换是最小均方误差条件下的得出的最佳正交变换。可以去相关性,将时域数据变换到频域,将能量集中于低频分量附近。
变换后可以看到:变换前的8x8个数据值,大小都很接近;变换后,能量集中于左上角,右下角的较小。左上角——直流分量值的绝对值一般变成了最大的值。
2.5.z字形编码(zigzag scan)。
由2维变1维,一般后扫描到的值的绝对值小于先扫描的。
2.6.量化(quantization)。
将较大的值按一定的倍数进行缩小,而这个缩小倍数视位置不同而不同。(补充:该步骤可以与上一步颠倒)(如果先量化再扫描,可以看到:在量化后,后下角的值大部分都变成接近0的较小的值)
2.7.差分脉冲编码(DPCM)对直流系数(DC)进行编码。
相同component分量的每个block的直流分量值,设置为一个差值,为:cur_block_dc_val - last_block_dc_val,DPCM也由此而来,即DC值的差分。
2.8.行程编码(RLE)对交流系数(AC)进行编码。
8x8的数据块,除了第一个DC值外,其他63个都是交流值,需要用到RLE编码。
RLE也称为游程编码,由一对值来表示,例如(m,n),m表示距离下一个非零值的距离,n表示下个值的值大小。例如(0,12)表示紧接着的值是12,而(4,6)表示中间经过4个0后,下个值为6。
2.9.熵编码(entropy encode)。
一般使用范式霍夫曼编码(huffman_encode——可变长编码算法中的一种),高概率的字符分配较短的code来表示,低概率的字符分配较长的code来表示。
3.其他补充说明
采样和量化都是有损编码,而DCT变换、DPCM、RLE、HuffmanEncode为无损编码。