实验五、DPCM编码
一、概述
本次实验的目的是为了掌握DPCM编解码系统的基本原理。实现一个简单的DPCM编码器并分析其压缩效率。
二、实验涉及的原理
1.涉及原理汇总
本次实验涉及的原理有:DPCM差分预测编码调制的基本概念,预测器的基本概念,量化器的基本概念。
2.DPCM差分预测编码调制
在本次实验之前的实验四中,我们利用信源符号的统计分布特性对信源进行无损的数据压缩熵编码。通过这样的熵编码,我们在对符合某些概率分布的数据进行压缩时能获得比较好的表现。但是我们之前采用的霍夫曼编码也并不是完美的。作为一种压缩编码的方法,霍夫曼编码仅仅将信源符号视为相互统计独立的,而忽略了信源符号间的相关性。
当我们需要对相关性较强的信源符号进行压缩时(例如对图像以及视频),简单的熵编码是不能满足我们的。这时候,我们就需要差分预测编码这样的编码方法来帮助我们了。
3.预测器与量化器的选择
本次实验使用的是固定预测(左方预测)以及均匀量化的方式对图像进行预测与量化。
三、实验流程
1.在实验二程序的基础上,添加DPCM的功能。使程序能输出进行DPCM后的预测误差图像与重建图像;
2.在实验四的基础上,对预测误差进行霍夫曼编码,得到输出码流给出概率分布图并计算压缩比;
四、关键代码分析
/*
*功能:对yBuf中的y分量进行差分预测编码,同时将图像的预测误差输出至DPCM.y文件中
*参数:yBuf图像的y分量,Width为图像的宽,Height为图像的高,Qbit为量化bit数
*/
void DPCM(u_int8_t* yBuf,LONG Width,LONG Height,int Qbit)
{
//定义
//预测误差输出文件
FILE* DPCMFile = NULL;
//缓冲区定义
u_int8_t* outputBuf = NULL; //输出图像缓冲区
u_int8_t* tempBuf = NULL; //预测误差缓冲区
//变量定义
LONG temp = NULL;
//初始化
//文件初始化
DPCMFile = fopen("DPCM.yuv","wb");
if (!DPCMFile)
{
printf("cann't open DPCM.y!\n");
return;
}
//缓冲区初始化
//inputBuf = (u_int8_t*)malloc(Width*Height*sizeof(u_int8_t));
outputBuf = (u_int8_t*)malloc(Width*Height*sizeof(u_int8_t));
tempBuf = (u_int8_t*)malloc(Width*Height*sizeof(u_int8_t));
//inputBuf = yBuf;
//量化与预测
Qbit = 8 - Qbit;
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++)
{
//每行第一个元素
if (!j)
{
//对每行第一个元素以128作为参考进行预测,并对预测误差进行量化
//+128是为了最终以图像形式显示预测误差
*(tempBuf + Width*i + j) = ((*(yBuf + Width*i +j) - 128)>>Qbit) + 128;
temp = (LONG)(((*(tempBuf + Width*i + j)-128)<<Qbit)+128);
if (temp > 240)
{
temp = 240;
}
else if (temp < 16)
{
temp = 16;
}
*(outputBuf + Width*i + j) = (u_int8_t)temp;
}
else
{
*(tempBuf + Width*i + j) = ((*(yBuf + Width*i + j) - *(outputBuf + Width*i + j - 1))>>Qbit) + 128;
temp = (LONG)(((*(tempBuf + Width*i + j) - 128)<<Qbit) + *(outputBuf + Width*i + j - 1));
if (temp > 240)
{
temp = 240;
}
else if (temp < 16)
{
temp = 16;
}
*(outputBuf + Width*i + j) = (u_int8_t)temp;
}
}
}
//输出
for (int i = 0; i < Height;i++)
{
for (int j = 0; j < Width; j++)
{
*(yBuf + Width*i + j) = *(outputBuf + Width*i + j);
}
}
fwrite(tempBuf,sizeof(u_int8_t),Height*Width,DPCMFile);
//clean up
free(outputBuf);
free(tempBuf);
fclose(DPCMFile);
}
五、实验结果
1、相同图像不同量化比特数的测试结果
8比特均匀量化灰度图像与预测误差图像
4比特均匀量化灰度图像与预测误差图像
2比特均匀量化灰度图像与预测误差图像
1比特均匀量化灰度图像与预测误差图像
2、不同图像的测试结果
Camman原始灰度图像与预测误差图像
Clown原始灰度图像与预测误差图像
Fruit原始灰度图像与预测误差图像
Lena原始灰度图像与预测误差图像
Noise原始灰度图像与预测误差图像
Odie原始灰度图像与预测误差图像
Zone原始灰度图像与预测误差图像
3、原始图像与预测误差图像的信源符号概率分布
Camman原始灰度图像
Cmman预测误差图像
Clown原始灰度图像
Clown预测误差图像
Fruit原始灰度图像
Fruit预测误差图像
Lena原始灰度图像
Lena预测误差图像
Noise原始灰度图像
Noise预测误差图像
Odie原始灰度图像
Odie预测误差图像
Zone原始灰度图像
Zone预测误差图像
六、结论
<
文件名 | Camman | Clown | Fruit | Lena | Noise | Odie | Zone |
源yuv文件大小 | 64 | 64 | 64 | 64 | 64 | 64 | 64 |
压缩后yuv文件大小 | 53 | 62 | 61 | 61 | 55 | 10 | 51 |
Huffman压缩比 | 120.75% | 103.23% | 104.92% | 104.92% | 116.36% | 640.00% | 125.49% |
源预测误差图像大小 | 64 | 64 | 64 | 64 | 64 | 64 | 64 |
压缩后预测误差图像大小 | 36 | 40 | 35 | 38 | 63 | 10 | 63 |
Huffman+DPCM压缩比 | 177.78% | 160.00% | 182.86% | 168.42% | 101.59% | 640.00% | 101.59% |
当图像的相关性较高时,能获得更高的压缩比。然而如果该图像的相关性很差时(如图像Noise与Zone),对图像进行DPCM反而会降低压缩比。