DPCM预测编码

DPCM编码原理框图

编码器
                DPCM预测编码_第1张图片
解码器

实现算法DPCM预测编码_第2张图片

在原来的BMP2YUV的基础上面,加一个DPCM过程的函数(只考虑了Y亮度值)
这个是8bit量化采用的算法
DPCM预测编码_第3张图片
8bit实验结果:
原图 误差 重建
DPCM预测编码_第4张图片 DPCM预测编码_第5张图片 DPCM预测编码_第6张图片
DPCM预测编码_第7张图片 DPCM预测编码_第8张图片 DPCM预测编码_第9张图片
DPCM预测编码_第10张图片 DPCM预测编码_第11张图片 DPCM预测编码_第12张图片
DPCM预测编码_第13张图片 DPCM预测编码_第14张图片 DPCM预测编码_第15张图片
DPCM预测编码_第16张图片 DPCM预测编码_第17张图片
DPCM预测编码_第18张图片 DPCM预测编码_第19张图片 DPCM预测编码_第20张图片


四比特的时候

#include "stdlib.h"
#include 
#include 
#include "rgb2yuv.h" 
#include 
#include 
void out_Buffer(unsigned char *ybuf, unsigned char *rebuf, unsigned char *ebuf, BITMAPFILEHEADER &file_h, BITMAPINFOHEADER & info_h)
{
	unsigned long  pix_h, pix_w;
	int count=0;
	int lev = 5;
	int div = pow((double)2,9-lev);
	int lev_8 = 128;
	int lev_2 = 255;
	pix_h = info_h.biHeight;
	if (info_h.biWidth *info_h.biBitCount % 32 == 0)
	{
		pix_w = info_h.biWidth;
	}
	else
	{
		pix_w = (info_h.biWidth*info_h.biBitCount + 31) / 32 * (32 / info_h.biBitCount);
	}
	for (int i = 0; i < pix_h; i++)
	{

		for (int j = 0; j < pix_w; j++)
		{
			if (count == i * pix_w)
			{
				ebuf[count] = (ybuf[count] - 128) / div + lev_8;
				rebuf[count] = (ebuf[count] - lev_8)*div + 128;
				if (rebuf[count]>255) rebuf[count] = 255;
				if (rebuf[count] < 0) rebuf[count] = 0;
				
			}
			else
			{
				ebuf[count] = (ybuf[count] - rebuf[count - 1] ) /div+ lev_8 ;
				rebuf[count] = (ebuf[count] - lev_8) * div + rebuf[count - 1];
				if (rebuf[count]>255) rebuf[count] = 255;
				if (rebuf[count] < 0) rebuf[count] = 0;

			}
			count = pix_w * i+ j + 1;
		}
	}

抽选三幅

结果如下:

原图 w误差 c重建

DPCM预测编码_第21张图片
DPCM预测编码_第22张图片
DPCM预测编码_第23张图片
DPCM预测编码_第24张图片
DPCM预测编码_第25张图片
DPCM预测编码_第26张图片
DPCM预测编码_第27张图片
DPCM预测编码_第28张图片
2比特的
void out_Buffer(unsigned char *ybuf, unsigned char *rebuf, unsigned char *ebuf, BITMAPFILEHEADER &file_h, BITMAPINFOHEADER & info_h)
{
	unsigned long  pix_h, pix_w;
	int count = 0;
	int lev = 3;
	int div = pow((double)2, 9 - lev);
	int lev_8 = 128;
	int lev_2 = 255;
	int m,n,k,l;
	pix_h = info_h.biHeight;
	if (info_h.biWidth *info_h.biBitCount % 32 == 0)
	{
		pix_w = info_h.biWidth;
	}
	else
	{
		pix_w = (info_h.biWidth*info_h.biBitCount + 31) / 32 * (32 / info_h.biBitCount);
	}
	for (int i = 0; i < pix_h; i++)
	{

		for (int j = 0; j < pix_w; j++)
		{
			if (count == i * pix_w)
			{
				ebuf[count] = (ybuf[count] - 128 ) / div + 128;
				m = ybuf[count] - 128;
				n = (m + 255) / div;
				rebuf[count] =( n-255/div)*div+128;
				
			}
			else
			{
				ebuf[count] = (ybuf[count] - rebuf[count - 1] ) / div + 128;
				m = ybuf[count] - rebuf[count - 1];
				n = (m + 255) / div;
				rebuf[count] = (n - 255 / div)*div + rebuf[count - 1];
				
			
			}
			count = pix_w * i + j + 1;
		}
	}

}

实验结果如下:

原图 误差 重建
DPCM预测编码_第29张图片 DPCM预测编码_第30张图片 DPCM预测编码_第31张图片
DPCM预测编码_第32张图片 DPCM预测编码_第33张图片 DPCM预测编码_第34张图片
DPCM预测编码_第35张图片 DPCM预测编码_第36张图片 DPCM预测编码_第37张图片

1比特的
void out_Buffer(unsigned char *ybuf, unsigned char *rebuf, unsigned char *ebuf, BITMAPFILEHEADER &file_h, BITMAPINFOHEADER & info_h)
{
	unsigned long  pix_h, pix_w;
	int count=0;
	int lev = 2;
	int div = pow((double)2,9-lev);
	int lev_8 = 128;
	int lev_2 = 255;
	pix_h = info_h.biHeight;
	if (info_h.biWidth *info_h.biBitCount % 32 == 0)
	{
		pix_w = info_h.biWidth;
	}
	else
	{
		pix_w = (info_h.biWidth*info_h.biBitCount + 31) / 32 * (32 / info_h.biBitCount);
	}
	for (int i = 0; i < pix_h; i++)
	{

		for (int j = 0; j < pix_w; j++)
		{
			if (count == i * pix_w)
			{
				ebuf[count] = (ybuf[count] - 128+ lev_2) / div +128;

				rebuf[count] = (ebuf[count] - 128)*div + 128;
				if (rebuf[count]>255) rebuf[count] = 255;
				if (rebuf[count] < 0) rebuf[count] = 0;
				
			}
			else
			{
				ebuf[count] = (ybuf[count] - rebuf[count - 1] + lev_2) /div+ 128 ;
				rebuf[count] = (ebuf[count] - 128) * div + rebuf[count - 1];
				if (rebuf[count]>255) rebuf[count] = 255;
				if (rebuf[count] < 0) rebuf[count] = 0;

			}
			count = pix_w * i+ j + 1;
		}
	}

}

抽选3幅结果如下:

原图 误差 重建
DPCM预测编码_第38张图片 DPCM预测编码_第39张图片 DPCM预测编码_第40张图片
DPCM预测编码_第41张图片 DPCM预测编码_第42张图片 DPCM预测编码_第43张图片
DPCM预测编码_第44张图片 DPCM预测编码_第45张图片

实验结果的PSNR值

DPCM预测编码_第46张图片

Huffman编码结果

举8比特的Lena例子,原yuv文件和DPCM编码如下:

原yuv huffman编码:

DPCM预测编码_第47张图片

DPCM编码后的Huffman编码结果:

DPCM预测编码_第48张图片

可以看出来,平均码长和熵的大小在经过DPCM编码重建之后都变小了,但是原始图像的损失人眼辨别不出来,则码率减小,实现了压缩的目的






你可能感兴趣的:(DPCM预测编码)