DCPM差分预测编码
一 编码原理
以本次实验为例,本次实验对图像的各个像素点进行压缩,并且采用左侧预测的方法,即每一个像素点的值输入后,与左边前一个像素点的预测值进行相减,随后经过量化与反量化得到差值,而后用来更新当前的预测值,并为下一个进来的值做准备,那么这个原理的实现过程中,误差的产生主要集中于量化与反量化之间产生的误差,采用不同的量化方式时误差也会不同。
二 代码实现
# 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;
}
输出了两幅图像,是经过解码以后的图像,另外一幅是差值图像,由于差值有正有负,在这里预处理把差值都加上128,得到插值图像。
三 实验结果
原图像8比特误差图像
8bit插值图像4bit插值
看到已经出现较大误差
四 haffman编码器
原图像编码预测图像编码
第一列为灰度值 第二列为码长 第三列为码值
明显看出预测后没有原图要好 明显量化比特数越低,效果越差