• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

jpeg编解码概述

开发技术 开发技术 4周前 (09-24) 27次浏览

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

1.编解码目标

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

 

2.编码过程

   jpeg编解码概述

 

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

    2.1.采样。

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

    2.2.分块(block)

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

    2.3.零偏置(LevelOffset)

        通过减28-1=128,使各个像素值以0为中心分布,变换后的值有的为正,有的为负,在[-128,127]区间分布。

    2.4.8×8的二维离散余弦变换(DCT2)。

        DCT变换是最小均方误差条件下的得出的最佳正交变换。可以去相关性,将时域数据变换到频域,将能量集中于低频分量附近。

        变换后可以看到:变换前的8×8个数据值,大小都很接近;变换后,能量集中于左上角,右下角的较小。左上角——直流分量值的绝对值一般变成了最大的值。

    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)进行编码。

        8×8的数据块,除了第一个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为无损编码。

 


喜欢 (0)