实验报告4_DPCM压缩系统的实现和分析

来源:互联网 发布:php 时间轴源码 编辑:程序博客网 时间:2024/05/18 01:54

一.实验原理

    DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。

    在预测编码中,每个抽样值不是独立的编码,而是先根据前几个抽样值计算出一个预测值,再取当前抽样值和预测值之差,将此差值编码并传输,此差值称为预测误差。由于抽样值和预测值之间有较强的相关性,即抽样值和预测值非常接近,使此预测误差的可能取值范围比抽样值的变化范围小,所以可以少用几位编码比特来对预测误差编码,从而降低比特率。

    在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。因为在解码端无法得到原始样本,所以不用原始样本来预测。在DPCM编码器中实际内嵌了一个解码器。


本次实验中采取左侧预测。

图中d(n)为预测误差,p(n)为预测值。

二.实验流程

(在BMP2YUV实验程序上稍作修改)

1)读取一个256级的灰度图像

2)采用自己设定的预测方法计算预测误差(预测误差图像和重建图像均要输出)

3)对预测误差进行8bit均匀量化

4)用huffman编码器对原始图像和预测误差图像进行压缩,查看压缩比,作出比较

三.关键代码

开两个文件用来输出预测误差图像和重建图像(具体代码略)

开两个跟原灰度图像buffer相同大小的buffer,用来存储预测误差eorBuf,和重建图像rebdBuf:

eorBuf = (u_int8_t*)malloc(Info_header.biWidth * Info_header.biHeight);rebdBuf = (u_int8_t*)malloc(Info_header.biWidth * Info_header.biHeight);

预测算法:

采用左侧预测,第一列的像素均以128做预测

for (k = 0; k < Info_header.biHeight; k++){        for (i = 0; i < Info_header.biWidth; i++){if (i==0){                    *(eorBuf + k*Info_header.biWidth + i) = (unsigned char)((*(yBuf + k*Info_header.biWidth + i) - 128) / 2 + 128);                     *(rebdBuf + k*Info_header.biWidth + i) = (unsigned char)(((*(eorBuf + k*Info_header.biWidth + i )-128) * 2) + 128); }else{                    *(eorBuf + k*Info_header.biWidth + i) = (unsigned char)((*(yBuf + k*Info_header.biWidth + i) - *(rebdBuf + k*Info_header.biWidth + i - 1)) / 2 + 128);                    *(rebdBuf + k*Info_header.biWidth + i) = (unsigned char)(((*(eorBuf + k*Info_header.biWidth + i )-128) * 2) + *(rebdBuf + k*Info_header.biWidth + i - 1));}}}

四.实验结果

1.查看生成的预测误差图像和重建图像:

(第一张为原始图像,第二张为预测误差,第三张为重建图像)








2.对原始图像和预测误差进行Huffman编码后的结果:


(eor开头命名的文件为预测误差文件)

3.原始图像和预测误差图像的符号概率分布:











结果分析:

由统计结果可知,原始图像比预测误差图像的符号分布更为平均,预测误差图像的符号概率主要集中在比较居中的值,说明一般图像的像素之间存在一定相关性,因此经Huffman压缩编码后,原始图像的压缩率一般小于误差图像的压缩率;但是由于噪声是随机的,没有什么相关性,因此预测误差图像的像素分布无规律,预测编码结果不如直接商编码好;zone图像边缘变化较快,且较大值和较小值交替,因此预测编码效果不如直接商编码效果好。