一、实验原理
1,DPCM原理:
利用图像相邻像素之间的联系,将样值与样值的差值(预测误差)量化编码。即,用上一个样值对当前样值进行预测,上一个样值作为预测值。然后以当前样值减去预测值得到误差,将误差进行量化编码,从而提高编码效率。
2,步骤:
1)计算差值->量化->进编码器;
2)原理框图如下图所示:
二、实验代码分析
我们在第二次实验BMP2YUV的实验基础上添加一个函数即可实现DCPM。
1,DCPM函数
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void DPCM_m(short int fh, short int fw, unsigned char* yuvBuf, unsigned char* qBuf, unsigned char* reBuf)
{
int i,j;
short int *q;
q = (short int *)malloc((sizeof(short int))* fw * fh);
for (i=0; i<fw; i++)
{
for(j=0; j<fh; j++)
{
if (i==0)//第一列-128
{
q[j*fw+i] = (yuvBuf[j*fw+i] - 128)/2 + 128;//计算量化误差q并将其抬高128使之输出时全为正值,我们能看到变化量
reBuf[j*fw+i] = (q[j*fw+i] - 128)*2 +128;//计算重建值
}
else//第二列减去左侧相邻像素点的重建值
{
q[j*fw+i] = (yuvBuf[j*fw+i] - reBuf[(j-1)*fw+i])/2 + 128;
reBuf[j*fw+i] = (q[j*fw+i] - 128)*2 + reBuf[(j-1)*fw+i];
}
}
}
for(i=0; i<fw*fh; i++)
{
qBuf[i] = (unsigned char)q[i];
}
free(q);
}