DPCM差分预测编码的原理即实现

一 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编码器
对原图像进行编码得到的结果为
在这里插入图片描述
第一列为灰度值,第二列为码长,第三列为码值,接下来来对比一下预测图象的编码效果
在这里插入图片描述
可以看出压缩比明显不如原图要好,而且采用的量化比特数越少,压缩比越差。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值