256色灰度图哈夫曼编码压缩

本文深入探讨了256色灰度图的哈夫曼编码压缩方法,详细介绍了如何利用哈夫曼编码减少图像数据的存储空间,提高图像文件的压缩效率。通过对图像像素的频率统计,构建最优的哈夫曼树,实现高效的数据压缩,适用于 BMP 图像格式的优化。
摘要由CSDN通过智能技术生成
哈夫曼编码原理:设256种颜色在图片中各出现了a1、a2、…、an次,于是可以得到一个对应的权重数组。将权重数组以以下范例形式建立哈夫曼树。
范例:假设一个含有6个数值的权重数组9、8、3、6、7、1:
1. 首先选出两个最小的权值1、3。建立一颗二叉树:(注意小数在左)


2. 将1、3合并为4,加入原权重数组,即此时权重数组为:9、8、6、7、4
3. 再选出两个最小权值4、6,此时二叉树为:



4.依照上述方法,直到最后建立一颗哈夫曼树:(即每次从权重集合找出两个最小的数值,合并后再加入权重数组。并且同时建立二叉树,直到权重数组只剩下所有数值之和。)



建立颜色数组的哈夫曼树之后,从根节点进行遍历,做字数编码加0,右子树编码加1。(例如范例中7的哈夫曼编码为000,1的哈夫曼编码为1100)此处为变长编码。遍历整棵哈夫曼树之后即可得到256种颜色的哈夫曼编码。读取256灰度的bmp图片对映即可进行压缩。
代码部分:
类中构造器的参数为bmp解码部分,因与本讲述无关故不上传

Compression.h


#pragma once
#include "BMPbase.h"
#include <iostream>
using namespace std;
struct HuffmanTree {
HuffmanTree* parent;//parent节点
HuffmanTree* LTree;//左节点,即为1节点 应为变短编码
HuffmanTree* RTree;//右节点,即为0节点 遵循左清右重原则
int TreeIndex;//树的下标
bool isSorted;//判断是否被选取
int weight;//本节点的权值
int index;//本节点的原编码数位
};
class Compression
{
public:
Compression(BMPbase* pic, int size);
~Compression();
void BuildHuffmanTree(int min1,int min2);
void showTree(HuffmanTree * root, string str);
string* getHuffmanCode();
void choseMin(int & min);
private:
int* weightArray;
int size;//图色数
HuffmanTree** TreeArray;
int SortPoint;//排序静态指针
//int unUsed;//未被用到的颜色数
string* huffmanCode;//生成的哈夫曼编码
HuffmanTree* root;//根节点
};



Compression.cpp


#include "stdafx.h"
#include "Compression.h"


Compression::Compression(BMPbase* pic, int size)
{
this->size = size;
weigh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值