原始图像大小为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;
}