简述JPEG编码实现的基本步骤

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37876745/article/details/80782447

简述JPEG编码实现的基本步骤

JPEG压缩标准包括两种:JPEG的无损预测算法 、JPEG的基于DCT的有损编码算法

1. JPEG的无损预测算法

预测编码具有硬件实现容易、重见图象质量好的优点,在此采用的是完全恢复的技术。无损压缩不使用DCT方法,而是采用一个简单的预测器。预测器可以采用不同的方法,不同的预测方法将决定有那些相邻的相素将被用于预测下一个像素。框图如下所示:

 

2.JPEG的基于DCT的有损编码算法

JPEG的基于DCT的压缩编码算法包括基本系统和增强系统两种不同的层次的系统。并定义了顺序工作方式和累进工作方式。基本系统只采用顺序工作方式,熵编码时只能采用哈夫曼编码,且只能存储两套码表。增强系统是基本系统的扩充,可采用累进工作方式、分层工作方式等,熵编码时可选用哈夫曼或算术编码。

基于DCT编码的过程为先进DCT正变换,再对DCT系数进行量化,并对量化后的直流系数和交流系数分别进行差分编码或行程编码,最后进行熵编码。

l 压缩编码步骤(JPEG基本系统)

– FDCT

– 使用加权函数对变换系数量化,加权函数根据人的视觉系统确定。

– 编码顺序Zigzag:使系数为0的值更集中。

– 使用DPCM对直流系数编码

– 使用RLE对交流系数进行编码

– Huffman 熵编码。

 

(1) 块准备:

块准备将一帧图象分成8X8的数据块。假设一个彩色图象由3种分量:光亮度Y和两个色差U,V表示,图象的大小为480行,每一行有640个像素。如果假设色度分解为4:1:1,则亮度分量就是一个640X480的数值矩阵,色差分量是一个320X240的数值矩阵,色差是一个320X240的数值矩阵。为了满足DCT过程的要求,块准备必须画出4800个亮块和两份1200个色差块,共计7200个数据块。同时将原始图象的采样数据从无符号整数变成有符号整数。即:若采样精度为P位,采样数据在范围[0,2p-1],则变成范围[-2p-12p-1-1]内,以次作为DCT正变换的输入。在解码的输出端经DCT反变换后,得到一系列8X8的图象数据块,需将其数值范围由[-2p-12p-1-1]再变回到[0,2p-1] 范围内的无符号整数,才能重构图象。

(2) DCT变换:

从图中可见,每个初始块由64个表示样本信号特定分量的振幅值组成,该振幅是一个二维的空间坐标的函数,可用a=f(x,y)表示,其中x,y是两个二维空间向量。在经过离散余玄变换之后,该函数变为了c=g(Fx,Fy),其中Fx和Fy分别是各个方向空间频率,结果为另一个64个数值的方阵,只是每一个值表示的是一个DCT系数,也就是一个特定的频率值,而不再是信号在采样点(x,y)的振幅。这样,经过8X8DCT正变换,8X8的采样值块变换成8X8的DCT系数块。

    DCT逆变换能把64个DCT系数重建为64点的图象。但由于计算过程中的误差及系数的量化,这64点图象是不能完全恢复的

3)量化:

    为了达到压缩的目的,DCT系数需作量化,量化表针的设计。例如,例如,利用人眼的视觉特性,对在图象中占有较大能量的低频成分,赋予较小的量化间隔和较少的比特表示,以获得较高的压缩比。

JPEG的量化采用线性均匀量化器,量化公式为:

    Cq(u,v)=Integer(Round(C(u,c)/Q(u,v))

其中Q(u,v)是量化器步长,它是量化表的元素,量化元素随DCT系数的不同和彩色分量的不同有不同的值。量化表的大小也为8X8,和64个变换系数一一对应。在JPEG算法中,对于8X8的亮度信息和色度信息,分别给出了缺省的量化表。这个量化表在实验的基础上,结合人眼的视觉特性而获得的

4)DCT直流值和AC交流系数的编码:

  DC系数差分编码与AC系数游程编码,64个变换系数中,DC系数是处于左上角的,它实际上等于64个图像采样值的平均值。相邻的8×8子块之间的DC系数有较强的相关性。JPEG对于量化后的DC系数采用差分编码,二相邻块的DC系数的差值为DCi-(DCi-1)。其余63个AC系数量化后通常出现较多零值,JPEG算法采用游程编码,并建议在8×8矩阵中按照“Z”形的次序进行,可增加零的连续次数。

系数编码后都采用统一的格式表示,包含二个符号的内容:第一符号占一个字节,对于DC系数而言,它的高4位总为零;对于AC系数而言,它表示到下一个非零系数前,所包含的连续为零的系数个数。第一字节的低4位表示DC差值的幅值编码所需的比特数,或表示AC系数中下一个非零幅值编码所需的比特数。第二个符号字节表示DC差值的幅值,或下一个非零AC系数的幅值。

还需要指出,由于第一字节中只有4位表示游程长度,量大值为15。当游程长度大于15时,可以插入一个至多个(10)字节,直至剩下的零AC系数个数小于15为止。因此,63个AC系数表示为由二个符号对组成的序列,其中也可能插入10个字节,快结束字节以全零表示。

l DC值:量化后,坐标u=v=0时的取值。它是整个块能量的主要部分,它有两个特点:

– 该值比较大

– 相邻的两个图像块之间的DC值变化不大

l 对于量化后的AC系数,它是一个稀疏矩阵:矩阵中许多位置上的值为零。

– 采用RLE编码

– 用EOB(特殊的码字表示块的结束

l 例如下面的量化后的亮度快,按Z字形排列:

下标:0       1       2     3     4     5    6    7     8     9—30   31  32—63

系数:12     5      -2     0     2     0    0    0    1         0        -1      0

5)熵编码:

对于上面给出的码序列,再进行统计特性的熵编码。这仅对于序列中每个符号对中的第一个字节进行,第二个幅值字节不作编码,仍然直接传送。

JPEG建议使用二种熵编码方法:哈夫曼编码和自适应二进制算术编码。对于哈夫曼编码,JPEG提供了针对DC系数、AC系数使用的哈夫曼表(包括对于图像的亮度值与色度值二种情况),在编码和解码时使用。JPEG解码器能够同时存储最多4套不同的熵编码表。

6)图像质量:

基于DCT的JPEG标准的压缩是有失真的,DCT变换后的系数的量化是引起失真的主要原因。

       压缩效果(比特/像素)

质      量

0.25~0.50

 中~好,满足某些应用

0.50~0.75

好~很好,满足多数应用

0.75~1.5

极好,满足大多数应用

1.5~2.0

与原始图像几乎分不出

猜你喜欢

转载自blog.csdn.net/m0_37876745/article/details/80782447