⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 实现了灰度图像的huffman编码,有码表的输出
💻 CPP
字号:
#include "stdafx.h"
#include "bmpfile.h"
#include <iostream.h>
#include <string.h>
#include <malloc.h>
#include <math.h>

typedef struct{
	int data;
	int weight;
}ElemType;    //data:灰度值  weight:相同灰度值的个数
typedef struct{
	int parent;
	int lchild;
	int rchild; 
}SFNode,*SFTree;

void BubbleSort(ElemType a[],int n)
{
	int i,j;
	ElemType temp;
	for(i=0;i<n;i++)
		for(j=0;j<n-i-1;j++)
		{
			if(a[j].weight<a[j+1].weight)
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
}

int mm(ElemType *e,int n)//返回相差最小处的下标
{
	int i,min,x=0,total=0;
	int *a=(int *)malloc((n/2)*sizeof(int));
	int *b=(int *)malloc((n/2)*sizeof(int));
	for(i=0;i<n;i++)
		total+=e[i].weight;
	a[0]=e[0].weight;
	b[0]=abs(2*a[0]-total);
	for(i=1;i<n/2;i++)
	{
		a[i]=a[i-1]+e[i].weight;
		b[i]=abs(2*a[i]-total);
	}
	min=b[0];
	for(i=1;i<n/2;i++)
	{
		if(b[i]<min)
		{
			min=b[i];
			x=i;
		}
	}
	return x;
}
void main()
{
	FILE *f;
	int i,j;

	HXLBMPFILE bmpfile;
	if(!bmpfile.LoadBMPFILE("实验图像.bmp")) return;
	const int n=256;//总的灰度数
	const int total=bmpfile.imageh*bmpfile.imagew;//总的像素点的个数
	int H[256];//灰度值为i的像素点的个数为H[i]
	memset(H,0,sizeof(int)*256);
	for(i=0;i<bmpfile.imageh;i++)
	   for(j=0;j<bmpfile.imagew;j++)
	      H[bmpfile.GetByteatH(i)[j]]++;
	f=fopen("h.txt","w+t");
	if(!f) return;
	for(i=0;i<256;i++)
	   fprintf(f,"%d            %d\n",i,H[i]);
	fclose(f);

	ElemType E[256];//存放按权值从大到小排序后的数据
	for(i=0;i<n;i++)
	{
		E[i].data=i;
		E[i].weight=H[i];
	}
	BubbleSort(E,n);
	f=fopen("e.txt","w+t");
	if(!f) return;
	for(i=0;i<256;i++)
	   fprintf(f,"%d        %d         %d\n",i,E[i].data,E[i].weight);
	fclose(f);
	
	xx=n;
	m=2*n-1;
	ElemType *e=E;
	SFTree SFT;
	SFT=(SFNode *)malloc((m+1)*sizeof(SFNode));//0号单元未用
	SFT[1].parent=0;
	SFT[1].lchild=0;
	SFT[1].rchild=255;
	for(i=2;i<=m;i++)
	{
		xx=mm(e,xx);
		SFT[i].parent=0;
		SFT[1].lchild=0;
		SFT[1].rchild=255;
		.........
}   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -