一.DPCM编码原理
在一个DPCM系统中,需要设计预测器和量化器两部分。
在本次实验中,我们采取左向预测和8bit均匀量化。
左向预测:
即将当前像素的左边像素作为预测,两像素值相减即为当前像素的预测误差值。
对于第一列像素,默认取其预测值均为128.
8bit均匀量化:
图像本身是8bit(灰度值为0-255),所以如果相减值就会变为-255——+255
为了进行8bit量化,要将预测误差值(即像素相减的差)/2+128,使其范围为0-255。(量化插值b=a/2)。之后需要进行反量化值c,将量化插值b乘2(c=b*2)。之后再将反量化值c与左侧像素预测值相加得到本像素预测值。
二.实验过程内容分析
1.本次实验需要三个文件
一个输入文件,一个预测误差图像文件,一个重建图像文件
char* orifilename = NULL;
char* prefilename = NULL;
char* recfilename = NULL;
orifilename = argv[1];
prefilename = argv[2];
recfilename = argv[3];
FILE* fp1 = fopen(orifilename, "rb");
FILE* fp2 = fopen(prefilename, "wb");
FILE* fp3 = fopen(recfilename, "wb");
2.分配三个主要缓冲区
(1)oribuffer是原灰度图像的缓冲区
(2)prebuffer是预测误差图像的缓冲区
(3)recbuffer是重建图像的缓冲区
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (j == 0)
{
*(recbuffer + i * width + j) = 128;
*(prebuffer + i * width + j) = *(oribuffer + i * width + j) - 128;
}
else
{
p1 = *(oribuffer + i * width + j) - *(oribuffer + i * width + j - 1);//误差
if (p1 % 2 == 0)
p2 = p1 / 2 + 128;//8bit量化
else
p2 = (p1 - 1) / 2 + 128;//8bit量化
*(prebuffer + i * width + j) = unsigned char(p2);
p3 = unsigned char(p2 * 2);//反量化
*(recbuffer + i * width + j) = *(oribuffer + i * width + j - 1) + p3;
}
}
}
三.实验结果分析
原图像 | 预测误差图像 | 重建图像 |
![]() |
![]() |
![]() |
输出码流:
原图概率分布图 | 预 |