DPCM

来源:互联网 发布:西门子博图软件 编辑:程序博客网 时间:2024/05/20 22:00

DPCM压缩系统的实现与分析

1.DPCM 编解码原理

预测编码是根据某一模型利用以往的样本值对于新样本值进行预测,然后将样本的实际值与其预测值相减得到一个误差值,对于这一误差值进行编码。如果模型足够好且样本序列在时间上相关性较强,那么误差信号的幅度将远远小于原始信号,从而得到较大的数据压缩结果。
预测编码方法分线性预测和非线性预测编码方法。线性预测编码方法,也称差值脉冲编码调制法,简称DPCM。
encoder图中输入信号Xn是某一像素点的实际灰度值,Pn是对该像素点的预测值,在本实验中就是与它相邻的前一个像素点的重建值。dn 是预测误差。^(dn)是量化预测误差,^(Xn)=量化预测误差^(dn)+预测灰度值Pn,得到当前像素点的重建值,作为下一个像素点的预测值。
预测器的输入是已经解码以后的样本,因为在解码端只能得到存在误差的样本。
由图可见,encoder中包含了一个decoder。


2.代码分析

//<-------------------dpcm函数8比特量化------------------------->bool dpcm(int Width,int Height, unsigned char* yBuf,unsigned char* devBuf,unsigned char* rebuild_Buf)//DPCM {        int err;//原始误差   int i,j;   unsigned char temp;   for(i=0;i<Height;i++)   {        //假设第一个像素的预测值为128      err = yBuf[i*Width]-128;//(-128,128) devBuf[i*Width] = err/2 + 64 ;//先将原始误差进行8bit量化再把电平提升到(0,128) temp =(devBuf[i*Width]-64)*2+128;//量化误差降低电平后再进行反量化,最后加上预测值  rebuild_Buf[i*Width]=temp;//重建值  for(j=1;j<Width;j++)  {    err = yBuf[i*Width+j]-rebuild_Buf[i*Width+j-1];//原始误差 = 当前样本-当前样本的预测值;(-255,255)    devBuf[i*Width+j] = err/2+127;//进行8bit量化,再提升电平最后范围(0,254)     temp =( devBuf[i*Width+j]-127)*2  + rebuild_Buf[i*Width+j-1];  rebuild_Buf[i*Width+j]=temp;// 重建值  }   }   return true; }

 规定每一行第一个像素的预测值均为128,而剩下的像素点均把与它相邻的前一个像素点的重建值作为自己的预测值。
假设存在一个像素点的灰度值为0,预测值为0,则量化误差值等于127,最后得到的重建值为0。
......
假设存在一个像素点的灰度值为128,预测值为0,则量化误差值等于191,最后得到的重建值为128。
......
假设存在一个像素点的灰度值为255,预测值为0,则量化误差值等于254,最后得到的重建值为254。
........
重建值与像素点的原始灰度值基本不差。

8比特量化即256个量化级,原始的量化误差范围是(-255,255),256<511<1024,相当于9比特量化到8比特,除2取整即相当于8比特量化,量化电平取左端点。
除了8比特还可以进行1,2,4比特的量化,以4比特为例,9比特到4比特量化,量化误差整除2 的9-4次方,即整除32。提升电平也要根据区间变化跟着改变。但是发现重建图像出现一些明显的失真。并且经过2bit量化之后,图像已经无法实现重建。以下是该算法4bit量化的重建图。

改进代码4bit量化

bool dpcm(int Width,int Height, unsigned char* yBuf,unsigned char* devBuf,unsigned char* rebuild_Buf)//DPCM{int err;//原始误差int i,j;unsigned char temp;for(i=0;i<Height;i++){//假设第一个像素的预测值为128      err = yBuf[i*Width]-128;//(-128,128)  devBuf[i*Width] = (err+255)/32 ; temp =(devBuf[i*Width]-255/32)*32+128;if(temp>255) temp=255; if(temp<0) temp=0;  rebuild_Buf[i*Width]=temp;  for(j=1;j<Width;j++)  {    err = yBuf[i*Width+j]-rebuild_Buf[i*Width+j-1];//原始误差 = 当前样本-当前样本的预测值;(-255,255) devBuf[i*Width+j] = (err+255)/32;//将电平提升到(0,510)之后再进行量化,结果区间(0,15)   temp =( devBuf[i*Width+j]-255/32)*32  + rebuild_Buf[i*Width+j-1]; //重建值if(temp>255) temp=255;     if(temp<0) temp=0; rebuild_Buf[i*Width+j]=temp;}}return true;}


3.实验结果分析


                  原始图像                                              量化误差图像                                重建图像                                                     文件名
                                   Birds
                                     Camman256B
                                     Clown256B
                                      Fruit256B
                                       haer
                                       Lena256B
              lufei
             Noise256B    
              Odie256B
              Zone256B
由以上图像对比,经过8比特量化之后重建的图像与原图像在图像质量上的差别不大。

概率分布图的顺序与图像顺序相同。将预测误差图像和原始文件图像经过Huffman编码器。
        
                       原始图像概率分布图                                                                       量化误差图像概率分布图    











压缩比

一般图像经过量化之后的熵编码效率明显提高,概率分布也更加集中,但是Noise256B和Zone256B的编码效率反而降低了。预测编码利用的是相邻像素点之间的相关性。如果相邻像素点之间的相关性大,预测就会更加准确,误差就会越小,从而在同等精度的要求下,就可以用较少的比特进行编码;但是如果水平方向上,相邻像素点的相关性非常小,预测误差就会大大增加,需要用更多的比特来进行编码。Noise256B和Zone256B这两张图像与其余图像的区别在于水平方向上像素点的灰度变化太大,从而造成压缩比降低。























0 0
原创粉丝点击