DPCM压缩系统的原理及实现

DPCM 压缩系统

原理介绍

DPCM是差分预测编码调制的缩写,是比较典型的预测编码系统。在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此,在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。

在一个DPCM系统中,有两个因素需要设计:预测器和量化器。理想情况下,预测器和量化器应进行联合优化。实际中,采用一种次优的设计方法:分别进行线性预测器和量化器的优化设计。
在这里插入图片描述

代码实现

编写代码实现量化比特数位1-8bit的DPCM编码并输出相应的预测误差图像和重建图像,此处以lena_noise为例。
代码如下:

#include "stdafx.h"

#include<iostream>
using namespace std;

int main(int argc, char* argv[])
{
	FILE* YUV = NULL;
	FILE* REBUILD = NULL;
	FILE* PRE = NULL;
	int w = 512;
	int h = 512;

	if ((fopen_s(&YUV, "lena_noise.yuv", "rb")) != 0)
	{
		cout << "Failed to open the YUV file!" << endl;
	}
	else
	{
		cout << "File successfully opened!" << endl;
	}
	if ((fopen_s(&PRE, "e.yuv", "wb")) != 0)
	{
		cout << "Failed to write in the RGB file!" << endl;
	}
	else
	{
		cout << "Successfully written RGB!" << endl;
	}
	if ((fopen_s(&REBUILD, "lenadpcm.yuv", "wb")) != 0)
	{
		cout << "Failed to write in the RGB file!" << endl;
	}
	else
	{
		cout << "Successfully written RGB!" << endl;
	}

	fseek(YUV, 0L, SEEK_END);
	int size;
	size = ftell(YUV);
	fseek(YUV, 0L, SEEK_SET);

	unsigned char* YUV_BUFFER = new unsigned char[size];
	unsigned char* Y_BUFFER = new unsigned char[size / 3];
	unsigned char* U_BUFFER = new unsigned char[size / 3];
	unsigned char* V_BUFFER = new unsigned char[size / 3];

	YUV_BUFFER = new unsigned char[size];
	fread(YUV_BUFFER, sizeof(unsigned char), size, YUV);

	for (int i = 0; i < (size / 3); i++)
	{
		Y_BUFFER[i] = YUV_BUFFER[i];
	}
	for (int i = 0; i < (size / 3); i++)
	{
		U_BUFFER[i] = YUV_BUFFER[i + (size / 3)];
	}
	for (int i = 0; i < (size / 3); i++)
	{
		V_BUFFER[i] = YUV_BUFFER[i + (size * 2 / 3)];
	}

	unsigned char* Y_REBUILD = new unsigned char[size * 2 / 3];
	unsigned char* E_BUFFER = new unsigned char[size * 2 / 3];

	for (int i = 0; i < h; i++)
	{
		for (int j = 0; j < w; j++)
		{
			int k = 0;
			if (j == 0)
			{
				Y_REBUILD[j + i * w] = Y_BUFFER[j + i * w];
				E_BUFFER[j + i * w] = 0;
			}
			if (j != 0)
			{
				k = Y_BUFFER[j + i * w] - Y_REBUILD[j + i * w - 1];
				E_BUFFER[j + i * w] = (k + 256) / 2 - 1;
				Y_REBUILD[j + i * w] = 2 * (E_BUFFER[j + i * w] + 1) + Y_REBUILD[j + i * w - 1];
			}
		}
	}


	fwrite(Y_REBUILD, sizeof(unsigned char), size / 3, REBUILD);
	fwrite(U_BUFFER, sizeof(unsigned char), size / 3, REBUILD);
	fwrite(V_BUFFER, sizeof(unsigned char), size / 3, REBUILD);

	fwrite(E_BUFFER, sizeof(unsigned char), size / 3, PRE);
	fwrite(U_BUFFER, sizeof(unsigned char), size / 3, PRE);
	fwrite(V_BUFFER, sizeof(unsigned char), size / 3, PRE);

	free(YUV_BUFFER);
	free(Y_BUFFER);
	free(U_BUFFER);
	free(V_BUFFER);
	free(Y_REBUILD);


}


我们将实验结果的三张图片进行对比:
原图
以上图片为原始图片

在这里插入图片描述
以上图片为经编码后的图片
在这里插入图片描述
以上图片显示误差值

通过对比可以看出,经过dpcm编码过后的图片出现白色噪点,与图片本身噪声值较大有关,插值中轮廓即梯度较大处比较明显。

利用霍夫曼编码器编码比较

再利用以上手段对图片进行8bit,4bit,2bitdpcm处理后
利用已有的霍夫曼编码器编码得到如下结果:在这里插入图片描述
对比.huff文件大小计算压缩比:

量化比特数压缩前大小压缩后大小压缩比
7686100.79
87683790.49
47682060.27
27681800.23

由上表可知,利用DPCM+熵编码可以成功的压缩图像的大小,且量化比特数越小,压缩比越来越小,压缩效率越来越高,但随着量化比特数的减小,失真度会上升。对于本实验而言,采取8bit量化下的DPCM+熵编码既可以实现50%左右的压缩效果,相对于仅使用熵编码的方法的压缩效果更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值