一 DPCM原理
如下图所示为原理实现图
由原理图中不难得出整个实现的过程,以本次实验为例,本次实验对图像的各个像素点进行压缩,并且采用左侧预测的方法,即每一个像素点的值输入后,与左边前一个像素点的预测值进行相减,随后经过量化与反量化得到差值,而后用来更新当前的预测值,并为下一个进来的值做准备,那么这个原理的实现过程中,误差的产生主要集中于量化与反量化之间产生的误差,采用不同的量化方式时误差也会不同,举一个实际的例子:
比如当前点灰度值为127,当前预测值为120,则dn为7 采用八比特量化,于是先除以二,由于为整数型,所以为3,而后乘二得到差值为6 更新预测值为126,值得一提的是在这里嵌套了一个解码器,当前的预测值就是解码出来的值,误差为1.
二 代码实现
本次实验分别采用8比特和4比特量化的方式进行分析,区别为量化与反量化时所乘和除的数,由于dn的范围应该为-256到256之间,为九个比特,想要八比特量化则需要除以2,而想要四比特量化就需要除以二的五次方也就是32,以此类推可得二比特与一比特量化。在代码中体现为如下调整
int b = 2;//8比特量化b=2 4比特量化b=32 2比特量化b=128 1比特量化 b=256
在这里输出了两幅图像,一幅为预测图象,也可以说是经过解码以后的图像,另外一幅是差值图像,由于差值有正有负,在这里预处理把差值都加上128,得到插值图像,代码实现如下所示
# include<stdio.h>
#include<iostream>
using namespace std;
#pragma warning(disable:4996)
unsigned char* yuanshi = NULL;
unsigned char* chazhi = NULL;
unsigned char* yuce = NULL;
int main(int argc, char** argv) {
int b = 2;//8比特量化b=2 4比特量化b=32 2比特量化b=128 1比特量化 b=256
char c;
char* yuvname = NULL;
yuvname = argv[1];
int W, H;
W = atoi(argv[2]);
H = atoi(argv[3]);
char* yucename = NULL;
char* chazhiname = NULL;
yucename = argv[4];//预测图像
chazhiname = argv[5];//差值图像
yuanshi = (unsigned char*)malloc(W * H);
chazhi = (unsigned char*)malloc(W * H);
yuce = (unsigned char*)malloc(W * H);
FILE* yuvfile;
yuvfile = fopen(yuvname, "rb");
FILE* yucefile;
yucefile= fopen(yucename, "wb");
FILE* chazhifile;
chazhifile = fopen(chazhiname, "wb");
fread(yuanshi, W * H, 1, yuvfile);
int i, j;
for (i = 0; i < H; i++) {
for (j = 0; j < W; j++) {
if (j == 0) {
yuce[j + i * W] = yuanshi[j + i * W];
chazhi[j + i * W] = 0;
}
else {
c = (yuanshi[j + i * W] - yuce[j + i * W - 1]) / b;
chazhi[j + i * W] =128+c;
yuce[j + i * W] =yuce[j + i * W-1] + c* b;
}
}
}
fwrite(chazhi, W * H, 1, chazhifile);
fwrite(yuce, W * H, 1, yucefile);
unsigned char* a = NULL;
a= (unsigned char*)malloc(W * H/2);
for (i = 0; i < W * H / 2; i++) {
a[i] = 128;
}
fwrite(a, W * H / 2, 1, chazhifile);
fwrite(a, W * H / 2, 1, yucefile);
fclose(yuvfile);
fclose(yucefile);
fclose(chazhifile);
free(a);
free(yuce);
free(chazhi);
free(yuanshi);
return 0;
}
三 实验结果
原图像为
采用8比特量化以后的差值图像为
8比特量化得到的预测图像为
可以看出基本没有什么误差,那么接下来让我们看看四比特量化后的预测图象
可以明显看出有比较大的误差产生,就是由于四比特量化,除以32,由于是整形数据再乘回来时误差大,采用量化比特越小,误差越大。
四 采用Huffman编码器
对原图像进行编码得到的结果为
第一列为灰度值,第二列为码长,第三列为码值,接下来来对比一下预测图象的编码效果
可以看出压缩比明显不如原图要好,而且采用的量化比特数越少,压缩比越差。