利用DPCM&Huffman编码实现数据压缩_C语言实现

来源:互联网 发布:淘宝首页导航栏尺寸 编辑:程序博客网 时间:2024/05/29 12:52

一、实验原理

       DPCM是差分预测编码调制的缩写,它利用过去的抽样值来预测当前的抽样值,对它们的差值进行编码。差值编码可以提高编码频率,这种技术已应用于模拟信号的数字通信之中。图像内的像素值之间并非相互独立,某一像素与周围像素之间存在一定的关系,这一关系导致整幅图像的信息熵不是很大。DPCM利用当前像素值减去前一像素值,得到差值,以减少图像之间的冗余,原理图如下。


      在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。

二、实验流程

      在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。

      在本次实验中,我们采用固定预测器和均匀量化器。预测器采用左侧、上方预测均可;量化器采用8比特均匀量化。

      首先读取一个256级的灰度图像,采用自己设定的预测方法计算预测误差,并对预测误差进行8比特均匀量化。还可对预测误差进行1比特、2比特和4比特的量化设计。

      在DPCM编码器实现的过程中可同时输出预测误差图像和重建图像。将原始图像文件输入输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。最后比较两种系统(DPCM+熵编码和仅进行熵编码)之间的编码效率(压缩比和图像质量)。

三、实验代码

     首先,根据之前的方法,将一幅bmp文件转化为yuv文件。将yuv分量作为本次实验的样本,进行DPCM后进行Huffman编码。

     由于第一个像素没有预测,所以假设为128,第一个像素预测为128,算出误差。

void DPCM(int Xdim, int Ydim, void *Yin, void *d_buff, void *re_buff, int q_bits){long i, j;unsigned char *y, *diff, *re;y = (unsigned char *)Yin;diff = (unsigned char *)d_buff;re = (unsigned char *)re_buff;int wc;//原始误差  int a = pow(2.0, q_bits);//量化级数int lhjg = 512 / a; //量化间隔:(-255,255)/(2^q_bits)int temp;for (i = 0; i < Ydim; i++){    //对每一列第一个像素值进行预测量化wc = y[Xdim*i] - 128;//假设第一行预测值为128  diff[Xdim*i] = (wc + 255) / lhjg;//量化值  temp = (diff[Xdim*i] - 255 / lhjg)*lhjg + 128;//重建电平  //=(diffy[Xdim] -64)*2+ 128;这种写法错误  if (temp>235) temp = 235;//保护电平(16,235)if (temp < 16) temp = 16;re[Xdim*i] = temp;for (j = 1; j < Xdim; j++){    //对该行剩下像素量化预测  wc = y[Xdim*i + j] - re[Xdim*i + j - 1];//当前值-上一像素重建值  diff[Xdim*i + j] = (wc + 255) / lhjg;//量化值  temp = (diff[j + Xdim*i] - 255 / lhjg)*lhjg + re[j - 1 + Xdim*i];//重建电平  //(diffy[Xdim+j] +127)*lhjg+rey[Xdim+j-1];错误  if (temp>235) temp = 235;//保护电平(16,235)if (temp < 16) temp = 16;re[Xdim*i + j] = temp;}}}

四、实验结果

      差分编码是针对图像空间信息冗余的编码方法,Huffman编码是针对统计信息冗余的编码方法。若二者相结合,先减少空间冗余,再减少统计冗余,将起到很好的压缩效果。

      下面是实验结果图,自左向右分别是:原图、预测误差图像、重现图像。








原始图像的概率分布图与预测误差图像的概率分布图

1.任意文件一



2.任意文件二



3. 狗.jpg



4.鸟.jpg



5. 噪声.jpg


6.圆圈.jpg


7.lena.jpg


8.水果.jpg


9. DPCM&Huffman编码与Huffman编码 压缩比较

文件名   原始图像压缩后压缩比预测误差压缩后压缩比11.75MB1555KB1.15241.75MB701 KB2.556320.98MB770KB1.30330.98MB405 KB2.4778Camman96KB61KB1.573896KB39 KB2.4615Clown96KB70KB1.371496KB47 KB2.0426Fruit96KB70 KB1.371496KB42 KB2.2857Lena96KB69 KB1.391396KB

45 KB

2.1333Noise96KB65 KB1.476996KB73 KB1.3151Odie96KB20 KB4.896KB17 KB5.6471Birds576KB520 KB1.1077576KB333 KB1.7297Zone96KB60 KB1.696KB72 KB1.3333
由对比可以看出,DPCM+Huffman编码的压缩效率优于Huffman编码。

原创粉丝点击