一.实验项目名称
DPCM预测编码系统
二.实验原理
1. 预测编码
在数字图像中,如果不是随机的噪声,那么每个像素与其周围的像素都会存在着一定的关联,像素值很大程度上依赖于其邻域中其它像素的值。也就是预测误差(在这个实验中用当前像素值与前一个像素值的差来表示)应该非常接近,通常比单个的像素值要小。因此如果只存储预测误差,由预测误差也可以重构出原图像,而且这样可以降低图像中的冗余信息,实现图像的压缩。
如果用前面几个样值的线性组合来预测当前的样值,称为线性预测,只用前一个样值进行预测,就称为 DPCM 。
2. DPCM 编解码框图
从框图中可以看出,由于需要更新预测值,编码器中已经内嵌了一个解码器。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。本次实验采用固定预测器和均匀量化器。
三.实验步骤
将以下DPCM部分代码添加至BMP2YUV:
int DPCM(int w,int h,void *ybuf, void *qbuf, void *pbuf,int Qbits)
{
//定义变量
unsigned char *y,*q, *p;
int i,size,width,height;
int k=0;
y = (unsigned char*)ybuf;
q = (unsigned char*)qbuf;
p = (unsigned char*)pbuf;
width = w;
height = h;
size = width * height;
//预测量化编码,8bit量化
int ek; //原始的预测误差值,范围从 -255 到 +255
int scale = 512 / (1 << Qbits); //误差值的压缩比率
for (i = 0; i < height; i++) //行循环
{
//对每行第一个像素的处理
ek = y[width*i] - 128; //假设第一个像素的预测值为128
q[width*i] = (ek + 255) / scale; //量化后的预测误差
p[width*i] = g((q[width*i] - 255 / scale)*scale + 128); //根据预测误差再重建当前电平值
for (int j = 1; j < width; j++) //列循环
{
//后面的像素与第一个像素处理方法一样
ek = y[j + width * i] - p[j - 1 + width * i];
q[j + width * i] = (ek + 255) / scale;
p[j + width * i] = g((q[j + width * i] - 255 / scale)*scale + p[j - 1 + width * i]);
}
}
//计算PSNR
int Maxi,Max = pow((int)2,8)-1;//图像颜色最大数值
float PSNR,MSE,sum=0;
for (i = 0; i < size; i++) {//计算MSE(均方误差),各数据误差平方的平均数
sum = sum + pow((float)(y[i]-p[i]), (int)2);}//原始图像减去重建图像
MSE = sum / size ;
Maxi = pow(Max, 2);
PSNR = 10*log10(Maxi/MSE);
printf("PSNR=%f\n", PSNR);
return 0;
}
unsigned char g(int x) {//防止超过 0 到 255 的动态范围
if (x < 0) return 0;
if (x > 255) return 255;
return x;
}
四.实验结果
1. 8比特均匀量化(以以下四幅图为例)
原始图像 | 重建图像 | 预测误差图像 | 频率分布图 |
---|---|---|---|
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
![]() | ![]() | ![]() | ![]() |
2. 不同压缩方式的编码效率(压缩比)
文件名 | 原始图像大小(KB) | 直接压缩后大小(KB) | 压缩比 | 预测图像大小(KB) | 预测压缩后大小(KB) | 压缩比 |
---|---|---|---|---|---|---|
Zone | 66 | 64 | 0.969 | 96 | 72 | 0.75 |
Odie | 66 | 13 | 0.197 | 96 | 17 | 0.177 |
Birds | 1153 | 1099 | 0.953 | 1152 | 397 | 0.345 |
Clown | 66 | 64 | 0.969 | 96 | 48 | 0.50 |
3. 不同量化级数的量化结果
不同bit的量化结果,低于8bit的预测误差频率分布图中,出现的大概占据1/3概率的符号是128灰度级,这是因为在生成重建图像时,为了使生成的图像是灰度图像,将U、V分量全都置为128,最终导致有1/3的频率分布是128灰度级。而对于其他符号频率来说,则是严格按照量化后的频率分布排列,因为量化比特数越少,误差 0 对应的灰度值就越小,所以低bit的量化误差图像越来越暗,此实验低于6bit的量化误差,肉眼几乎看不见了。4bit和5bit量化后的重建图像可以明显得看出图像的失真,出现了严重的块效应。
6bit 预测误差频率分布:
4bit 预测误差图像:
4. 不同量化级数的压缩质量
量化级数 | PSNR |
---|---|
8 | 51.052074 |
7 | 42.834713 |
6 | 35.703712 |
5 | 29.347391 |
4 | 22.981213 |
随着量化比特数的逐渐降低,可以看出PSNR(峰值信噪比)也在随之降低,意味着图像的失真程度越高。由于量化比特数降低,量化区间也就随之变大,量化误差也就越大,所以图像的失真也就越明显。