数字图像处理相关实验总结(图像滤波,分割,旋转、编码等)

本文总结了数字图像处理的相关实验,重点介绍了Huffman编码的过程,包括统计像素概率、构建Huffman树以及编码写入文件的实现。同时,提到了解码程序的编程思路。
摘要由CSDN通过智能技术生成

hufman编码是一种无损最优编码

编程思路是:先 统计像素概率,再构建hufman树,遍历树,取出全部像素和对应编码,在构建缓冲区,以八位二进制数据写入文件。

预先定义的一些结构体和函数:

struct TreeNode {
	float pval;
	short pixval;
	TreeNode *left;
	TreeNode *right;
	TreeNode(float x1,int x2) : pval(x1),pixval(x2), left(NULL), right(NULL) {}
	TreeNode(float x1) : pval(x1), pixval(-1), left(NULL), right(NULL) {}
	TreeNode(TreeNode* x1) : pval(x1->pval), pixval(x1->pixval), left(x1->left), right(x1->right) {}
};
TreeNode* CreatHuffman(float *a, int n) {
	int i, j;
	struct TreeNode **b, *q;
	int size=0;              //图像存在的像素值的个数(可能小于256)
	for (i = 0;i < n;++i) {
		if (a[i] != 0)
			size++;
	}
	b = (TreeNode**)malloc(size * sizeof(TreeNode));
	for (i = 0,j = 0; i < n; i++) //初始化b指针数组,使每个指针元素指向a数组中对应的元素结点  
		if(a[i]!=0){
			b[j] = new TreeNode(a[i],i);
			b[j]->left = b[j]->right = NULL;
			j++;
		}
	for (i = 1; i < size; i++)//进行 n-1 次循环建立哈夫曼树  
	{
		//k1表示森林中具有最小权值的树根结点的下标,k2为次最小的下标  
		int k1 = -1, k2;
		for (j = 0; j < size; j++)//让k1初始指向森林中第一棵树,k2指向第二棵  
		{
			if (b[j] != NULL && k1 == -1)
			{
				k1 = j;
				continue;
			}
			if (b[j] != NULL)
			{
				k2 = j;
				break;
			}
		}
		for (j = k2; j < size; j++)//从当前森林中求出最小权值树和次最小  
		{
			if (b[j] != NULL)
			{
				if (b[j]->pval < b[k1]->pval)
				{
					k2 = k1;
					k1 = j;
				}
				else if (b[j]->pval < b[k2]->pval)
					k2 = j;
			}
		}
		//由最小权值树和次最小权值树建立一棵新树,q指向树根结点  
		q = (TreeNode* )malloc(sizeof(struct TreeNode));
		q->pval = b[k1]->pval + b[k2]->pval;
		q->pixval = -1;
		q->left = b[k1];
		q->right = b[k2];

		b[k1] = q;//将指向新树的指针赋给b指针数组中k1位置  
		b[k2] = NULL;//k2位置为空  
	}
	free(b); //删除动态建立的数组b  
	return q;
}
map<unsigned char, string> pixencode;
vector<int> inorderTraversal(TreeNode* root,string x) {
	vector<int> val;
	if (!root)
		return val;

	vector<int> tmp = inorderTraversal(root-&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值