实验四 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数的减少,压缩比越来越大,但图像越来越模糊,画质越来越差。如何获取画质和压缩比共同适用的最优点仍是要解决的难题之一。
- 实验四-dpcm编码
- 实验四 DPCM编码
- 实验四 DPCM编码
- 实验四:DPCM编码
- 数据压缩实验四:DPCM编码
- 数据压缩实验四:DPCM编码
- 实验四——DPCM编码
- 【实验五】DPCM编码
- 实验4 DPCM编码
- 【数据压缩】实验四 DPCM
- 数据压缩实验4-DPCM编码
- 数据压缩实验四--dpcm压缩系统
- DPCM编码
- DPCM编码
- 实验四 DPCM 压缩系统的实现和分析
- 数据压缩实验四:DPCM 压缩系统的实现和分析
- 数据压缩实验四 DPCM压缩系统的实现与分析
- 《数据压缩》实验报告四·DPCM编解码
- 二分贪心05
- Quartz 2D编程指南(6) - 阴影(Shadows)
- C/C++:switch语句
- java基础之—类加载器
- 古北水镇上空的夜景,怎少的了S8的“夜视仪”?
- 实验四 DPCM编码
- 动态规划算法——知识点总结
- Quartz 2D编程指南(7) - PDF文档的创建、显示及转换
- 从斜率DP讲起
- linux安装arm-linux-gcc-4.3.2(交叉编译环境搭建)
- SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)
- 一大堆excption
- [转载] Java Https SSL证书的PKIX问题
- dynamic_bitset