实验4:DPCM 压缩系统的实现和分析

一、实验目的
掌握DPCM编解码系统的基本原理。初步掌握实验用C/C++/Python等语言编程实现DPCM编码器,并分析其压缩效率。


二、实验内容
1 读取一个yuv图像文件,进行dpcm编码,对预测误差8bit量化,输出误差图像、重建图像;
2 将预测误差图像写入文件并将该文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。
将原始图像文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比;
3 比较两种系统(1.DPCM+熵编码和2.仅进行熵编码)之间的编码效率(压缩比和图像质量)。压缩质量以PSNR进行计算。


三、DPCM基本原理

在这里插入图片描述
差分脉冲编码调制(Differential Pulse code modulation,DPCM),先根据前一个抽样值计算出一个预测值,再取当前抽样值和预测值之差作编码用.此差值称为预测误差.
抽样值和预测值非常接近(因为相关性强),预测误差的可能取值范围比抽样值变化范围小.所以可用少几位编码比特来对预测误差编码,从而降低其比特率.这是利用减小冗余度的办法,降低了编码比特率。


四、c++实现
dpcm部分

#include<iostream>
#include <stdio.h> 
#include<math.h>
 
using namespace std;
 
int main(int argc,char*argv[])
{
	FILE*SEED=NULL;
	FILE*REBUILDSEED=NULL;
	FILE*E_SEED=NULL;
 
	int size;
 
	if((fopen_s(&SEED,"D://00//yuv//seed.yuv", "rb"))!=0)
	{
		cout<<"打开原文件失败"<<endl;
	}	
	else
	{
		cout<<"成功打开原文件"<<endl;
	}
	if((fopen_s(& REBUILDSEED,"D://00//seedrebuild.yuv","wb"))!= 0)
	{
		cout<<"创建重建文件失败"<<endl;
	}
	else
	{
		cout<<"成功创建重建文件"<<endl;
	}
 
	if((fopen_s(&E_SEED,"D://00//E_seed.yuv","wb"))!= 0)
	{
		cout<<"创建误差文件失败"<<endl;
	}
	else
	{
		cout<<"成功创建误差文件"<<endl;
	}
 
	fseek(SEED,0L,SEEK_END);
	size=ftell(SEED);
	fseek(SEED,0L,SEEK_SET);//指针送回
	unsigned char* SEED_BUFFER=new unsigned char[size];
	unsigned char* REBUILDSEED_BUFFER=new unsigned char[size];
	unsigned char* E_SEED_BUFFER=new unsigned char[size];
	unsigned char* Y_BUFFER=new unsigned char[size/3];
 
 
	fread(SEED_BUFFER,sizeof(unsigned char),size,SEED);
	for(int i=0;i<size/3;i++)
	{
		Y_BUFFER[i]=SEED_BUFFER[i];
	}
 
 
	unsigned char* Y_REBUILD = new unsigned char[size * 1 / 3];
	unsigned char* E_BUFFER = new unsigned char[size * 1 / 3];
 
	for (int i = 0; i < 500; i++)
	{
		for (int j = 0; j < 500; j++)
		{
			int k = 0;
			if (j == 0)
			{
				Y_REBUILD[j + i * 500] = Y_BUFFER[j + i * 500];
				E_BUFFER[j + i * 500] = 0;
			}
			if (j != 0)
			{
				k = Y_BUFFER[j + i * 500] - Y_REBUILD[j + i * 500 - 1];
				E_BUFFER[j + i * 500] = (k + 256)/ 2 - 1;
				Y_REBUILD[j + i * 500] = 2 * (E_BUFFER[j + i * 500] + 1) + Y_REBUILD[j + i * 500 - 1];
			}
			if (E_BUFFER[j + i * 500] > 255)
			{
				E_BUFFER[j + i * 500] = 255;
			}
			if (E_BUFFER[j + i * 500] < 0)
			{
				E_BUFFER[j + i * 500] = 0;
			}
			if (Y_REBUILD[j + i * 500] > 255)
			{
				Y_REBUILD[j + i * 500] = 255;
			}
			if (Y_REBUILD[j + i * 500] < 0)
			{
				Y_REBUILD[j + i *500] = 0;
 
			}
		}
	}
 
 
		for(int i=0;i<size/3;i++)
		{
			REBUILDSEED_BUFFER[i]=Y_REBUILD[i];
			REBUILDSEED_BUFFER[size/3+i]=SEED_BUFFER[size/3+i];
			REBUILDSEED_BUFFER[size/3+size/3+i]=SEED_BUFFER[size/3+size/3+i];
 
		}
 
		for(int i=0;i<size/3;i++)
		{
			E_SEED_BUFFER[i]=E_BUFFER[i];
			E_SEED_BUFFER[size/3+i]=SEED_BUFFER[size/3+i];
			E_SEED_BUFFER[size/3+size/3+i]=SEED_BUFFER[size/3+size/3+i];
		}
		fwrite(REBUILDSEED_BUFFER,sizeof(unsigned char),size, REBUILDSEED);
		fwrite(E_SEED_BUFFER,sizeof(unsigned char),size,E_SEED);
		fclose(SEED);
		fclose(REBUILDSEED);
		fclose(E_SEED);
		system("pause");
	}

psnr计算部分

在这里插入代码片

五、实验结果
1原始图像、预测误差、重建图像

在这里插入图片描述
2概率分布图

3比较两种系统(1.DPCM+熵编码和2.仅进行熵编码)之间的编码效率(压缩比和图像质量)。压缩质量以PSNR进行计算。
在这里插入图片描述
在这里插入图片描述
(1)压缩比
DPCM+熵编码:733/140=5.23;
仅进行熵编码:733/246=2.97.
(2)压缩质量


六、实验结论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值