DCPM差分预测编码

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编码器

原图像编码预测图像编码

 第一列为灰度值 第二列为码长 第三列为码值

明显看出预测后没有原图要好 明显量化比特数越低,效果越差

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值