【实验五】DPCM编码

实验五、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预测误差图像



六、结论

<

文件名CammanClownFruitLenaNoiseOdieZone
源yuv文件大小64646464646464
压缩后yuv文件大小53626161551051
Huffman压缩比120.75%103.23%104.92%104.92%116.36%640.00%125.49%
源预测误差图像大小64646464646464
压缩后预测误差图像大小36403538631063
Huffman+DPCM压缩比177.78%160.00%182.86%168.42%101.59%640.00%101.59%

      当图像的相关性较高时,能获得更高的压缩比。然而如果该图像的相关性很差时(如图像Noise与Zone),对图像进行DPCM反而会降低压缩比。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值