实验要求:
掌握DPCM编解码系统的基本原理,并用编程语言实现。在DPCM编码器实现的过程中可同时输出预测误差图像和重建图像。将预测误差图像写入文件并将该文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。将原始图像文件输入Huffman编码器,得到输出码流、给出概率分布图并计算压缩比。最后比较两种系统(1.DPCM+熵编码和2.仅进行熵编码)之间的编码效率(压缩比和图像质量)。压缩质量以PSNR进行计算。
实验原理:
实验过程:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char** argv)
{
int height,width;
char *filename_yuv,*filename_error,*filename_decoding;
filename_yuv=argv[1];
height=atoi(argv[2]);
width=atoi(argv[3]);
filename_error=argv[4];
filename_decoding=argv[5];
unsigned char YUV_buffer=NULL,Y_buffer;
unsigned char YUV_buffer_del;
YUV_buffer=new unsigned char[heightwidth3/2];
YUV_buffer_del=YUV_buffer;
if((width%21)||(height%21))
{
printf(“please input the right height and width/n”);
}
FILE fp_yuv=NULL,fp_error=NULL,fp_decoding=NULL;
fp_yuv=fopen(filename_yuv,“rb”);
fp_error=fopen(filename_error,“wb”);
fp_decoding=fopen(filename_decoding,“wb”);
if((fp_yuvNULL)||(fp_errorNULL)||(fp_decoding==NULL))
{
printf(“can not open the file/n”);
exit(1);
}
fread(YUV_buffer,sizeof(unsigned char),heightwidth3/2,fp_yuv);
Y_buffer=YUV_buffer;
unsigned char error_buffer,decoding_buffer;
error_buffer=new unsigned char[heightwidth3/2];
decoding_buffer=new unsigned char[heightwidth3/2];
unsigned char *Y_buffer_operate,*error_buffer_operate,*decoding_buffer_operate;
unsigned char *Y_buffer_del,*error_buffer_del,*decoding_buffer_del;
Y_buffer_del=Y_buffer;
error_buffer_del=error_buffer;
decoding_buffer_del=decoding_buffer;
Y_buffer_operate=Y_buffer;
error_buffer_operate=error_buffer;
decoding_buffer_operate=decoding_buffer;
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
if(j==0)
{
*error_buffer_operate=*Y_buffer;
*decoding_buffer_operate=Y_buffer_operate;
Y_buffer_operate++;
error_buffer_operate++;
decoding_buffer_operate++;
}
else
{
unsigned char temp_last_xn;
temp_last_xn=decoding_buffer[iwidth+j-1];
int temp_pn;
temp_pn=int(Y_buffer_operate-temp_last_xn);
error_buffer_operate=unsigned char(temp_pn/2+128);
decoding_buffer_operate=(error_buffer_operate-128)2+temp_last_xn;
Y_buffer_operate++;
error_buffer_operate++;
decoding_buffer_operate++;
}
}
}
for(int i=0;i<heightwidth/2;i++)
{
error_buffer_operate++;
decoding_buffer_operate++;
}
fwrite(decoding_buffer,sizeof(unsigned char),heightwidth3/2,fp_decoding);
fwrite(error_buffer,sizeof(unsigned char),heightwidth3/2,fp_error);
fclose(fp_yuv);
fclose(fp_error);
fclose(fp_decoding);
delete[] Y_buffer_del;
delete[] error_buffer_del;
delete[] decoding_buffer_del;
return 0;
}
实验结果:
实验结论:
8比特量化能得到较好的效果,由DPCM 的原理可知量化电平数足够大才能获得优秀的性能。