DPCM编码

原始图像大小为500*500,采用8bit均匀量化进行预测
预测误差图像在这里插入图片描述
在这里插入图片描述
PSNR为51
仅进行熵编码压缩比为1.48
进行DPCM和熵编码压缩比为2.21
通过两者的数据分布可以看出预测误差的数据分布比较集中,进行熵编码压缩效果也更好
在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<stdio.h>
using  namespace std;
int lianghua(int);
unsigned char lianghuaid(int);
void main()
{
	FILE* inputYUV = NULL;
	FILE* outputYUV = NULL;
	FILE* wuchaYUV = NULL;
	FILE* P_ORIPHOTO = NULL;
	FILE* P_WUCHAPHOTO = NULL;
	inputYUV = fopen("1.yuv", "rb");
	outputYUV = fopen("con2.yuv", "wb");
	wuchaYUV = fopen("wucha.yuv", "wb");
	P_ORIPHOTO = fopen("gailv.txt", "wb");
	P_WUCHAPHOTO = fopen("gailv2.txt", "wb");
	unsigned char* ORIGN_BUFFER = new  unsigned char[500*500];
	unsigned char* PRIDECT_BUFFER = new  unsigned char[500*500];
	unsigned char* REBUILD_BUFFER = new  unsigned char[500*500];
	fseek(inputYUV, 0L, SEEK_SET);
	fread(ORIGN_BUFFER, sizeof(unsigned char), 500*500, inputYUV);
	
	for (int i = 0; i < 500; i++)
	{
		REBUILD_BUFFER[500 * i] = ORIGN_BUFFER[500 * i];
	}
	for (int i = 0; i < 500; i++)
	{
		PRIDECT_BUFFER[500 * i] = 0;
	}
	for (int i = 0; i < 500; i++)
	{
		for (int j = 1; j < 500; j++)
		{
			int x = 0;
			x = ORIGN_BUFFER[i * 500 + j] - REBUILD_BUFFER[i * 500 + j - 1];
			PRIDECT_BUFFER[i * 500 + j] = lianghuaid(x);
			REBUILD_BUFFER[i * 500 + j] = REBUILD_BUFFER[i * 500 + j - 1] + lianghua(x);
		}
	}
	unsigned  char* u_buffer=new unsigned char[500 * 500 / 4];
	unsigned char* v_buffer=new unsigned char[500 * 500 / 4];
	for (int i = 0; i < 62500;i++)
	{
		u_buffer[i] = 128;
		v_buffer[i] = 128;
	}
	int* p_ori=new int[256];
	int* p_wucha = new int[256];
	for (int a = 0; a < 256; a++)
	{
		p_ori[a] = 0;
		p_wucha[a] = 0;
	}
	for (int a = 0; a < 250000; a++)
	{
		for (int b = 0; b < 256; b++)
		{
			if (ORIGN_BUFFER[a] == b)
			{
				p_ori[b]++;
			}
			if (PRIDECT_BUFFER[a] == b)
			{
				p_wucha[b]++;
			}
		}
	}
	for (int a = 0; a < 256; a++)
	{
		//printf("%d", p_ori[a]);
		fprintf(P_ORIPHOTO, "%d\r\n", p_ori[a]);
		fprintf(P_WUCHAPHOTO, "%d\r\n", p_wucha[a]);
		//fprintf(P_ORIPHOTO, "%c",10);
	}
	double MSE = 0;
	double PSNR = 0;
	for (int i = 0; i < 500; i++)
	{
		for (int j = 0; j < 500; j++)
		{
			MSE += pow((ORIGN_BUFFER[i * 500 + j] - REBUILD_BUFFER[i * 500 + j]), 2);
		}
	}
	MSE = MSE / 250000;
	PSNR = 10 * log10(255 * 255 / MSE);
	cout << PSNR << endl;
	//fwrite(p_ori, sizeof(int), 256, P_ORIPHOTO);
	fwrite(REBUILD_BUFFER, sizeof(unsigned  char), 500 * 500, outputYUV);
	fwrite(u_buffer, sizeof(unsigned  char), 500 * 500 / 4, outputYUV);
	fwrite(v_buffer, sizeof(unsigned  char), 500 * 500 / 4, outputYUV);
	fwrite(PRIDECT_BUFFER, sizeof(unsigned  char), 500 * 500, wuchaYUV);
	fwrite(u_buffer, sizeof(unsigned  char), 500 * 500 / 4, wuchaYUV);
	fwrite(v_buffer, sizeof(unsigned  char), 500 * 500 / 4, wuchaYUV);
	fclose(inputYUV);
	fclose(outputYUV);
	fclose(wuchaYUV);
	fclose(P_ORIPHOTO);
	fclose(P_WUCHAPHOTO);
}
int lianghua(int x)
{
	int doors[256] = { 0 };
	int rebulidlevel[256] = { 0 };
	unsigned char id = 0;
	for (int i = 0; i < 256; i++)
	{
		doors[i] = i * 2 - 255;
	}
	for (int i = 0; i < 256; i++)
	{
		rebulidlevel[i] = i * 2 - 254;
	}
	int  i = 0;
	while (x > doors[i])
	{
		id = i;
		i++;
	}
	return rebulidlevel[id];
}

unsigned  char lianghuaid(int x)
{
	int doors[256] = { 0 };
	int rebulidlevel[256] = { 0 };
	unsigned char id = 0;
	for (int i = 0; i < 256; i++)
	{
		doors[i] = i * 2 - 255;
	}
	for (int i = 0; i < 256; i++)
	{
		rebulidlevel[i] = i * 2 - 254;
	}
	int  i = 0;
	while (x > doors[i])
	{
		id = i;
		i++;
	}
	return id;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值