2021-10-14 Huffman编码

一。对图像进行Huffman编码

图像格式

本次编码所用图像为:

sena.imgsensin.imgomha,img
在这里插入图片描述在这里插入图片描述在这里插入图片描述

图像都为256×256大小的8比特灰度图像

Huffman编码

1.对图像本身进行编码

输入调试器的命令参数为:

-i ../images/sena.img -o ../images/sena1_huff.huff
图像编码前编码后压缩比
sena.img64.0kb56.1kb87.66%
sensin.img64.0kb59.9kb93.59%
omaha.img64.0kb57.0kb89.06%

2.对图像的差值图像进行编码

1)首先编写代码得到原始图像的差值图像:

#include <iostream>
#include<fstream>
using namespace  std;

#define	height	256
#define	width	256

int main()
{
	ifstream fp;
	fp.open("../images/omaha.img", ios::in | ios::binary);//打开图像
	if (!fp)
	{
		cout << "img open failed" << endl;
		return 0;
	}
	ofstream fp_out;
	fp_out.open("../images/omaha_diff.img", ios::out | ios::binary);

	unsigned char* buffer;
	buffer = (unsigned char*)malloc(width * height);
	unsigned char I[width * height];

	for (int i = 0; i < width * height; i++)
	{
		fp.read((char*)(I + i), sizeof(unsigned char));//直接读取图像
	}

	//使用前向预测
	for (int j = 0; j < width * height; j++)
	{
		if (j % 256 == 0)
		{
			buffer[j] = I[j];
		}
		else
		{
			int temp = I[j] - I[j - 1];
			temp = (temp + 255) / 2;
			if (temp > 255)
				temp = 255;
			if (temp < 0)
				temp = 0;
			buffer[j] = temp;
		}

	}
	// 将处理后的图像数据输出至文件
	fp_out.write((char*)buffer,width * height);
	fp.close();
	fp_out.close();
	free(buffer);
	return 0;
}

差值图像如图所示:

sena_diff.imgsensin_diff.imgomaha_diff.img
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2)对差值图像进行Huffman编码
输入调试器的命令参数为:

-i ../images/omaha_diff.img -o ../images/omaha2_huff.huff
图像编码前编码后压缩比
sena_diff.img64.0kb25.2kb39.38%
sensin_diff.img64.0kb30.1kb47.03%
omaha_diff.img64.0kb44.6kb69.69%

3使用sensin图像生成的码本对bookshelf和sena图像进行编码

bookshelf1.imgbookshelf2.img
在这里插入图片描述在这里插入图片描述

1)首先生成sensin图像的码本
输入调试器的命令参数为:

-i ../images/sensin.img -o ../images/sensin1_huff.huff -s ../images/sensin.code

2)使用该码本对图像进行编码
输入调试器的命令参数为:

-i ../images/bookshelf1.img -o ../images/bookshelf1_huff.huff -c ../images/sensin.code

3)使用被压缩图像生成的码本

-i ../images/bookshelf1.img -o ../images/bookshelf1.huff 
图像编码前编码后(sensin码本)编码后(自身码本)
bookshelf1.img64.0kb70.8kb59.5kb
bookshelf2.img64.0kb93.5kb55.2kb
sena.img64.0kb59.2kb56.1kb

由上述表格可以看出,使用被压缩图像生成的码本比使用sensin图像生成的码本,图像压缩效果更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值