实验四 DPCM编码

来源:互联网 发布:初创公司如何管理 知乎 编辑:程序博客网 时间:2024/06/05 15:57
一、实验原理

1、预测编码

预测编码利用的是信源相邻符号间的相关性。根据某一模型利用以往的样本值对新的样本值进行预测。然后将样本的实际值与预测值相减得到一个误差值,最后对这一误值进行编码。如果模型足够好且样本序列在时间上相关性比较强,则误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩。

一个好的预测器的预测误差通常满足0周围高峰值的分布。

2、量化(标量量化和矢量量化)

量化是用一个很小的集合表示一个大集合的值,是有失真压缩的有效工具。一个量化器可以用量化区间、决策电平、重构电平、失真(DSE)来描述。 量化器的设计是码率与失真的折中。为了降低编码比特数,需要扩大量化区间的范围,造成更大误差。

均匀量化器中,由计算可得,量化比特数加1,信噪比增加6.02db.均匀量化器值对均匀分布信源是最佳的。

lloyd-max标量量化器中,门限电平应取在相邻量化输出电平的中点。重建电平应取在量化间隔的质心上。当量化器的输入为均匀分布时,llyod-max量化器为均匀量化器。

总结:

标量量化:对与已知概率模型和数字特征的随机过程,比较容易跟据概率分布安排量化器的决策边界,以得到最小量化失真的优化量化器。如果概率分布是均匀的,则采用均匀量化器。对于分布概率未知的随机过程,优化量化器的设计比较困难,可以采用lloyd-max算法,但该算法不易硬件实现,且计算时间随初始值选取的不同而不同。

矢量量化:量化时不是处理单个符号,而是一次处理一个符号。实验证明,压缩符号串比压缩单个效果更容易实现。

3、DPCM编解码原理

DPCM是插分预测编码调制的缩写,是典型的预测编码系统。其编码框图如下:

在DPCM系统中有两个因素需要设计,一个是量化器,一个是预测器。理想情况下预测其和量化器应进行联合优化,实际中采用一种次优的设计方法:分别进行线性预测器和量化器的设计。在本次试验中我们采用固定预测器和均匀量化器,预测器采用左侧、上侧均可(代码中采用左侧),量化器采用8bit量化。

应注意框图中预测器的输入为已经解码后的样本,之所以不用原始样本进行预测是因为在解码端无法得到原始样本,智能得到存在误差的样本,因此DPCM变么器内部嵌了一个解码器。

二、实验步骤

1、读取一个256级灰度图像,获得其y分量

本实验的输入图像格式为.bmp,通过实验二的代码将其转化为.yuv格式,获得y分量,用yuv播放软件vooya查看其y分量(在format中选取 luminance only格式)、预测误差图像,重建图像。

2、采用自己设定的预测方法计算预测误差

本实验采用前向预测,即用前一个像素值作为当前像素的预测值,其中预测值为编码之后又解码出来的重建电平。

3、对预测误差分别进行8bit、6bit、 4bit、2bit、1bit量化,并同时计算重建电平作为预测器的输入

4、输出原图像、预测误差图像、重建图像

5、将原图像和预测误差图像分别进行huffman编码,输出码流、给出符号概率分布图、计算压缩比

6、分析huffman和DPCM+huffman二者的编码效率

7、分析不同量化比特数对图像质量、编码效率的影响

三、实验目的

掌握DPCM编码系统基本原理,验证DPCM编码的编码效率。

四、代码分析

1、读取一副bmp图像的y分量代码见实验二,本实验仅对y分量进行操作。在试验二中加入如下代码:在命令行中添加输出ek.yuv(预测误差图像)、rebuild.yuv(重建图像)

char* ekFileName = argv[3];//预测误差图像名char* rebuildFileName = argv[4];//重建图像名FILE* ekFile = NULL;//预测误差图像FILE* rebuildFile = NULL;//重建图像u_int8_t* ekBuf = NULL;//存储预测误差u_int8_t* rebuildBuf = NULL;//存储重建u_int nbit;//量化比特数u_int radio=0;//量化因子int ek=0;ekBuf = (u_int8_t*)malloc(frameWidth * frameHeight);rebuildBuf = (u_int8_t*)malloc(frameWidth * frameHeight);ekFile = fopen(ekFileName, "wb");nbit=atoi(argv[5]);//命令行输入量化比特数radio=512/(1<<nbit);//比例因子的表达式值得注意/*if (ekFile == NULL){printf("cannot find ek file\n");exit(1);}else{printf("The output ek file is %s\n", ekFileName);}rebuildFile = fopen(rebuildFileName, "wb");if (rebuildFile == NULL){printf("cannot find rebuild file\n");exit(1);}else{printf("The output rebuild file is %s\n", rebuildFileName);}*/用来分析不同量化bit的编码情况//yBuf存储的数据范围为0-255,经过前向预测后,预测误差ek的范围为(-255-255),要想将预测误差显示为一副图像,需将ek范围调为0-255,实现方法为:令ek=ek+255,范围变为(0-510),再对误差值做8bit\4bit\2bit\1bit量化//设置一个比例因子ratio=来完成量化 8bit量化时,ratio=2,510/2=255<2^8 4bit 量化时,ratio=32,510/32=15.94<2^4,2bit量化时,ratio=128,510\128=3.99<2^2 , 1bit量化时 ratio=256,510\256=2=2^1//还需要考虑重建电平溢出的问题,经过量化的预测误差随量化比特的不同而范围不同,最大重建图像的范围为(0-512)(8-bit量化),需将其调到0-255printf("radio:%d\t",radio);for(i=0;i<frameHeight;i++)for(j=0;j<frameWidth;j++){if(j==0){ek=*(yBuf+i*frameWidth)-128;//计算预测误差*(ekBuf+i*frameWidth)=(ek+255)/radio;//量化预测误差*(rebuildBuf+i*frameWidth)=(*(ekBuf+i*frameWidth)-255/radio)*radio+128;//求重建电平if(*(rebuildBuf+i*frameWidth+j)>255){*(rebuildBuf+i*frameWidth+j)=255;}//防止重建电平超过255,不能正常显示*(ekBuf+i*frameWidth)=*(ekBuf+i*frameWidth)*radio/2;//为正确显示误差图像,将预测误差范围调整到0-255之间}else{ek=*(yBuf+i*frameWidth+j)-*(rebuildBuf+i*frameWidth+j-1);//计算预测误差,预测器的输入为上一级重建电平*(ekBuf+i*frameWidth+j)=(ek+255)/radio;//量化预测误差*(rebuildBuf+i*frameWidth+j)=(*(ekBuf+i*frameWidth+j)-255/radio)*radio+*(rebuildBuf+i*frameWidth+j-1);*(ekBuf+i*frameWidth)=*(ekBuf+i*frameWidth)*radio/2;//为正确显示误差图像,将预测误差范围调整到0-255之间if(*(rebuildBuf+i*frameWidth+j)>255){*(rebuildBuf+i*frameWidth+j)=255;}//防止重建电平超过255,不能正常显示}}for(i=0;i<10;i++){printf("%d\t",*(yBuf+i));}printf("\n");for(i=0;i<10;i++){printf("%d\t",*(ekBuf+i));}printf("\n");for(i=0;i<1000;i++){printf("%d\t",*(rebuildBuf+i));printf("\n");}fwrite(ekBuf, 1, frameWidth * frameHeight, ekFile);fwrite(rebuildBuf, 1, frameWidth * frameHeight, rebuildFile);
..........关闭文件和缓冲区

2、关键点分析

量化比例因子分析:

在预测过程中,原图像像素值范围在0-255之间,当前像素减去预测值(前一个像素值)得到预测误差,因此预测误差范围在(-255-255)之间。要想对预测误差进行图象显示并进行量化,必须先把它变成正数。因此先让ek=ek+255,此时量化误差ek范围在0-510之间。接下来对9bit(2^9=512)表示的ek进行8bit、6bit、4bit、2bit、1bit量化,设置一个量化因子radio=512/(1<<qbit),(qbit为量化比特位),即radio=512/(2^qbit)。令ek=(ek+255)/radio,即可实现相应bit的量化。例如,若进行8bit量化,经计算,radio=2,此时ek=(ek+255)/2,范围在0-255之内;若进行4bit量化,radio=32,此时ek=(ek+255)/32,范围在0-16之间。

反量化方式分析:

对误差进行量化后,要根据量化误差求重建电平,即解码。由ek‘=(ek+255)/radio可知,解码方程应为:
ek=ek'*radio-255,或ek=(ek'-255/radio)*raiod.

比较上面两个式子,在你眼里没有什么区别,但在计算机眼里它们两个却不一样,原因是ek、radio是int型,进行计算时,计算机自动下取整。

在误差量化时ek‘=(ek+255)/radio,即ek'=ek/radio+255/radio,255/radio不一定是整数,即255产生了量化误差,若采用第一种计算方法ek=ek'*radio-255,255没有被反量化,使预测误差重建电平与原始电平相差更大。采用第二种方法,255相当于没有参与整数运算,也不用下取整。下面用实例证明:
例如原始图像第一个像素为136,建设预测值为128,那么ek=136-128=8,8bit量化后ek'=(8+255)/2=131,若采用第一种方式反量化ek=131*2-255=7,采用第二种方式,ek=(131-255/2)*2=(131-127)*2=8.

因此计算过程中采用第二种反量化方法。

重建电平溢出问题分析:

由于预测误差的量化电平不同,在进行预测误差反量化时,可能后导致反量化后的预测误差比实际的大,进而导致重建电平的可能超过255,在进行重建电平的图像显示时出现误差。以下举例说明:例如一副图像的前两个像素为254,对量化误差进行4bit量化(radio=32)。

第一个像素254,预测值为128,ek=254-128=126,量化后ek'=(126+255)/32=11.重建电平rebuild=(11-255/32)*32+128=256 超过255.

分析其原因是在误差量化反量化的过程中,导致重加电平产生radio大小的浮动。因此对重建电平进行限制,令其大于255时,取255.

误差图像正确显示问题分析:

预测误差经过量化后,范围可能在(0-255)(8bit)、(0-64)(6bit)、(0-16)(4bit)、(0-4)(2bit)、(0-1)(1bit)之间,要想让其正常显示,须将其调整到(0-255)之间,因为本实验中文件的存储最小单位是8bit。通过以下算法即可达到目的。

*(ekBuf+i*frameWidth)=*(ekBuf+i*frameWidth)*radio/2;

五、结果分析

1、输出原图像、预测误差图像、重建图像

本实验对课件中给出的Lena256B.bmp Camman256B.bmp Noise256B.bmp Zone256B.bmp 五种图像进行测试,并测试了两张自己的图片:tiger.bmp evilflower

下面分别给出y分量原图像、预测误差图像、重建图像(以8bit量化为例)

     

    

    

    

     

以下两张是自己的图片:
    

     

2、 将原图像和预测误差图像分别进行huffman编码,输出码流、给出符号概率分布图、计算压缩比

原始图像和经DPCM编码后的图像输入hufman编码系统,符号概率分布图如下:







huffman和DPCM+huffman两种编码方式的压缩比对比分析:

由上表可知图像1、2、3、6、7DPCM+huffman的压缩比显然比只进行huffman编码的压缩比大的多,尤其是图3(Birds.bmp)而图像4、5则恰恰相反,DPCM+huffman的压缩比要小于只进行huffman的压缩比。

分析图像符号的概率分布图可知,图1、2、3、6、7的原图像概率分布图中,像素值出现概率大的相对集中,即像素间相关性比较强,尤其是图三(birds.bmp)的概率分布图中大部分符号分布在60-110之间,因此这些图经过DPCM后的概率分布后的概率分布图,符号都集中在127附近(原本误差范围(-255-255),符号集中分布在0附近,为了将预测误差值调成整数而加了255,调整到0-255范围内,0所对应的电平是127),符号种类数大大减少,出现的概率大大增加。而huffman编码系统就喜欢这种分布不均匀的信源,因此编码效率较高。而图4、5的信源概率分布0-255之间都有值,且出现概率相同,是一个均匀分布的信源,经huffman编码后,压缩效果并不明显,由于符号间相关性不大,经DPCM之后,信源符号个数并没有减少,反而增加了(概率分布图变密),因此经过DPCM+huffman编码后,压缩效果反而更不乐观,比单独进行huffman编码还要低。

3、量化比特数对图像质量和压缩效率的影响。

对预测误差分别进行8bit、6bit、4bit、2bit、1bit量化之后的量化误差图像、重建图像如下:(仅以tiger.bmp为例)

原图:



量化比特数预测误差图像重建图像DPCM编码后符号概率分布86421
分析预测误差图像可得,随着量化比特数的降低,量化误差图像越来越暗,对比度越来越大,细节越来越不明显。

究其原因,是因为随着量化比特数的降低,量化间隔越来越大。例如预测误差128在8bit量化中,量化为(128+255)/2=191,在6bit量化中,量化为(128+255)/8=47,显示时调整到(0-255)范围内,为47*8/2=188,在4bit量化中,量化为(126+255)/32=11,显示为11*32/2=176,在2bit量化中,量化为(128+255)/128=2,显示为2*128/2

128,1bit量化时,量化为(128+255)/256=1,显示为1*256/2=128,因此量化比特数越低,预测误差图像越暗。

分析重建图像可得,量化比特数越低,重建图像画质越差,越模糊,量化比特数为1时,重建电平全部为128,根本看不出原图像。

分析符号概率分布图得,随着量化比特数降低,像素值种类树越来越少,这是量化造化块效应的主要原因之一。

分析不同量化比特数对压缩比的影响:

由上表看出,随着量化比特数的下降,压缩比显著增大。分析原因是因为,量化比特数降低后,信源的符号种类数越来越少,越来越集中,即像素间的相关性越来越大,因此,压缩比越来愈大。

五、总结

由以上分析得出,dpcm+huffman在编码不均匀的信源时,效果比单独进行huffman编码效果好(压缩比大、码流短)。且二者均不适用于均匀分布的信源。

随着量化bit数的减少,压缩比越来越大,但图像越来越模糊,画质越来越差。如何获取画质和压缩比共同适用的最优点仍是要解决的难题之一。

0 0