您的位置:首页 > 其它

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

2017-05-16 21:46 351 查看

一.实验原理

    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图像边缘变化较快,且较大值和较小值交替,因此预测编码效果不如直接商编码效果好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: