jpeg编解码概述

本博文为概览性介绍。后面有空了再分几篇博文分别介绍所用到的技术细节。算法

1.编解码目标编码

    编码和解码是个逆过程。jpeg编码的目的在于图形去冗余,进行数据压缩,解码的目的在于还原图像,使可以进行预览。spa

 

2.编码过程code

   

 

贴一张网上的图片,但缺乏了一些步骤,下面用文字来描述每个步骤。component

    2.1.采样。blog

        8位采样,像素值的范围锁定在0-255,无符号,都为正数。图片

    2.2.分块(block)io

        补成8x8的block,以应对宽和高不是8的整数倍的状况,方便后续进行8x8的DCT2变换。ast

    2.3.零偏置(LevelOffset)im

        经过减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为无损编码。