对灰度图像进行霍夫曼编码,用Matlab怎么实现啊?

对灰度图像进行霍夫曼编码,用Matlab怎么实现啊?,第1张

给你一段程序,自己研究下吧!\x0d\x0a\x0d\x0aclc\x0d\x0aclear\x0d\x0acloseall\x0d\x0a%定义HufData/Len为全局变量的结构体\x0d\x0aglobalHufData\x0d\x0aglobalLen\x0d\x0adisp('计算机正在准备输出哈夫曼编码结果,请耐心等待??')\x0d\x0a%原始码字的灰度\x0d\x0aa=imread('kids.tif')\x0d\x0a\x0d\x0a%分区画出原始图像和灰度直方图\x0d\x0afigure\x0d\x0asubplot(1,2,1)\x0d\x0aimshow(a)\x0d\x0a%取消坐标轴和边框\x0d\x0aaxisoff\x0d\x0aboxoff\x0d\x0atitle('MATLAB自带图像','fontsize',13)\x0d\x0asubplot(1,2,2)\x0d\x0aaxisoff\x0d\x0aboxoff\x0d\x0aimhist(a)\x0d\x0atitle('图像灰度直方图','fontsize',13)\x0d\x0a%图像的灰度统计\x0d\x0aGrayStatistics=imhist(a)\x0d\x0aGrayStatistics=GrayStatistics'\x0d\x0aGrayRatioo=GrayStatistics/sum(GrayStatistics)\x0d\x0aGrayRatioNO=find(GrayRatioo~=0)\x0d\x0aLen=length(GrayRatioNO)\x0d\x0a%初始化灰度集,防止系统随即赋予其垃圾值\x0d\x0aGrayRatio=ones(1,Len)\x0d\x0a\x0d\x0afori=1:Len\x0d\x0aGrayRatio(i)=GrayRatioo(i)\x0d\x0aend\x0d\x0a\x0d\x0aGrayRatio=abs(sort(-GrayRatio))\x0d\x0a%将图像灰度概率赋予结构体\x0d\x0afori=1:Len\x0d\x0aHufData(i).value=GrayRatio(i)\x0d\x0aend\x0d\x0a\x0d\x0a%哈夫曼编码/霍夫曼编码\x0d\x0aHuffmanCode(Len)\x0d\x0a%输出码字\x0d\x0a\x0d\x0azippedHuffman=1\x0d\x0afori=1:Len\x0d\x0atmpData=HufData(i).code\x0d\x0astr=''\x0d\x0aforj=1:length(tmpData)\x0d\x0astr=strcat(str,num2str(tmpData(j)))\x0d\x0azippedHuffman=zippedHuffman+1\x0d\x0aend\x0d\x0adisp(strcat('a',num2str(i),'=',str))\x0d\x0aend\x0d\x0ai\x0d\x0a%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码\x0d\x0azippedHuffman\x0d\x0a%计算在删去0灰度级压缩之前的原始图像字节容量\x0d\x0aunzipped_delete=i*8\x0d\x0a\x0d\x0a%计算压缩比率\x0d\x0aratio_delete=zippedHuffman/unzipped_delete\x0d\x0a\x0d\x0a%计算图像的压缩比率\x0d\x0aad=num2str(ratio_delete*100)\x0d\x0astr2=strcat(ad,'%')\x0d\x0adisp(strcat('哈夫曼编码压缩比率','=',str2))\x0d\x0a\x0d\x0a%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCode.m\x0d\x0afunctionHuffmanCode(OriginSize)\x0d\x0aglobalHufData\x0d\x0aglobalLen\x0d\x0afori=1:Len\x0d\x0a%%霍夫曼编码树左边纪录为1\x0d\x0aHufData(i).left=1\x0d\x0a%%霍夫曼编码树右边纪录为0\x0d\x0aHufData(i).right=0\x0d\x0a%%输出码初始化为0\x0d\x0aHufData(i).code=[]\x0d\x0a%%排序列表初始化\x0d\x0aSortList(i).symbol=i\x0d\x0aSortList(i).value=HufData(i).value\x0d\x0aend\x0d\x0a%初始化原始消息数目\x0d\x0anewsymbol=OriginSize\x0d\x0aforn=OriginSize:-1:2\x0d\x0a%将N个消息进行排序\x0d\x0aSortList=sortdata(SortList,n)\x0d\x0a%将最后两个出现概率最小的消息合成一个消息\x0d\x0anewsymbol=newsymbol+1\x0d\x0aHufData(newsymbol).value=SortList(n-1).value+SortList(n).value\x0d\x0aHufData(newsymbol).left=SortList(n-1).symbol\x0d\x0aHufData(newsymbol).right=SortList(n).symbol\x0d\x0a%将消息添加到列队的最后,为N-1个消息重新排序作好准备\x0d\x0aSortList(n-1).symbol=newsymbol\x0d\x0aSortList(n-1).value=HufData(newsymbol).value\x0d\x0aend\x0d\x0a%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码\x0d\x0avisit(newsymbol,Len,[])\x0d\x0aend\x0d\x0a\x0d\x0a%子程序:冒泡排序法函数sortdata.m\x0d\x0afunctionreData=sortdata(SortList,n)\x0d\x0a%根据消息概率进行排序\x0d\x0afork=n:-1:2\x0d\x0aforj=1:k-1\x0d\x0amin=SortList(j).value\x0d\x0asbl=SortList(j).symbol\x0d\x0aif(min<SortList(j+1).value)\x0d\x0aSortList(j).value=SortList(j+1).value\x0d\x0aSortList(j+1).value=min\x0d\x0aSortList(j).symbol=SortList(j+1).symbol\x0d\x0aSortList(j+1).symbol=sbl\x0d\x0aend\x0d\x0aend\x0d\x0aend\x0d\x0areData=SortList\x0d\x0aend\x0d\x0a\x0d\x0a%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visit.m\x0d\x0afunctionvisit(node,n,ocode)\x0d\x0aglobalHufData\x0d\x0aifnode0)\x0d\x0a%遍历左分支接点输出1,这里采用子函数嵌套调用\x0d\x0aocode1=[ocode1]\x0d\x0avisit(HufData(node).left,n,ocode1)\x0d\x0aend\x0d\x0aif(HufData(node).right>0)\x0d\x0a%遍历右分支接点输出0,这里采用子函数嵌套调用\x0d\x0aocode2=[ocode0]\x0d\x0avisit(HufData(node).right,n,ocode2)\x0d\x0aend\x0d\x0aend\x0d\x0aend

给你一段程序,自己研究下吧!\x0d\x0a\x0d\x0aclc\x0d\x0aclear\x0d\x0acloseall\x0d\x0a%定义HufData/Len为全局变量的结构体\x0d\x0aglobalHufData\x0d\x0aglobalLen\x0d\x0adisp('计算机正在准备输出哈夫曼编码结果,请耐心等待??')\x0d\x0a%原始码字的灰度\x0d\x0aa=imread('kids.tif')\x0d\x0a\x0d\x0a%分区画出原始图像和灰度直方图\x0d\x0afigure\x0d\x0asubplot(1,2,1)\x0d\x0aimshow(a)\x0d\x0a%取消坐标轴和边框\x0d\x0aaxisoff\x0d\x0aboxoff\x0d\x0atitle('MATLAB自带图像','fontsize',13)\x0d\x0asubplot(1,2,2)\x0d\x0aaxisoff\x0d\x0aboxoff\x0d\x0aimhist(a)\x0d\x0atitle('图像灰度直方图','fontsize',13)\x0d\x0a%图像的灰度统计\x0d\x0aGrayStatistics=imhist(a)\x0d\x0aGrayStatistics=GrayStatistics'\x0d\x0aGrayRatioo=GrayStatistics/sum(GrayStatistics)\x0d\x0aGrayRatioNO=find(GrayRatioo~=0)\x0d\x0aLen=length(GrayRatioNO)\x0d\x0a%初始化灰度集,防止系统随即赋予其垃圾值\x0d\x0aGrayRatio=ones(1,Len)\x0d\x0a\x0d\x0afori=1:Len\x0d\x0aGrayRatio(i)=GrayRatioo(i)\x0d\x0aend\x0d\x0a\x0d\x0aGrayRatio=abs(sort(-GrayRatio))\x0d\x0a%将图像灰度概率赋予结构体\x0d\x0afori=1:Len\x0d\x0aHufData(i).value=GrayRatio(i)\x0d\x0aend\x0d\x0a\x0d\x0a%哈夫曼编码/霍夫曼编码\x0d\x0aHuffmanCode(Len)\x0d\x0a%输出码字\x0d\x0a\x0d\x0azippedHuffman=1\x0d\x0afori=1:Len\x0d\x0atmpData=HufData(i).code\x0d\x0astr=''\x0d\x0aforj=1:length(tmpData)\x0d\x0astr=strcat(str,num2str(tmpData(j)))\x0d\x0azippedHuffman=zippedHuffman+1\x0d\x0aend\x0d\x0adisp(strcat('a',num2str(i),'=',str))\x0d\x0aend\x0d\x0ai\x0d\x0a%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码\x0d\x0azippedHuffman\x0d\x0a%计算在删去0灰度级压缩之前的原始图像字节容量\x0d\x0aunzipped_delete=i*8\x0d\x0a\x0d\x0a%计算压缩比率\x0d\x0aratio_delete=zippedHuffman/unzipped_delete\x0d\x0a\x0d\x0a%计算图像的压缩比率\x0d\x0aad=num2str(ratio_delete*100)\x0d\x0astr2=strcat(ad,'%')\x0d\x0adisp(strcat('哈夫曼编码压缩比率','=',str2))\x0d\x0a\x0d\x0a%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCode.m\x0d\x0afunctionHuffmanCode(OriginSize)\x0d\x0aglobalHufData\x0d\x0aglobalLen\x0d\x0afori=1:Len\x0d\x0a%%霍夫曼编码树左边纪录为1\x0d\x0aHufData(i).left=1\x0d\x0a%%霍夫曼编码树右边纪录为0\x0d\x0aHufData(i).right=0\x0d\x0a%%输出码初始化为0\x0d\x0aHufData(i).code=[]\x0d\x0a%%排序列表初始化\x0d\x0aSortList(i).symbol=i\x0d\x0aSortList(i).value=HufData(i).value\x0d\x0aend\x0d\x0a%初始化原始消息数目\x0d\x0anewsymbol=OriginSize\x0d\x0aforn=OriginSize:-1:2\x0d\x0a%将N个消息进行排序\x0d\x0aSortList=sortdata(SortList,n)\x0d\x0a%将最后两个出现概率最小的消息合成一个消息\x0d\x0anewsymbol=newsymbol+1\x0d\x0aHufData(newsymbol).value=SortList(n-1).value+SortList(n).value\x0d\x0aHufData(newsymbol).left=SortList(n-1).symbol\x0d\x0aHufData(newsymbol).right=SortList(n).symbol\x0d\x0a%将消息添加到列队的最后,为N-1个消息重新排序作好准备\x0d\x0aSortList(n-1).symbol=newsymbol\x0d\x0aSortList(n-1).value=HufData(newsymbol).value\x0d\x0aend\x0d\x0a%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码\x0d\x0avisit(newsymbol,Len,[])\x0d\x0aend\x0d\x0a\x0d\x0a%子程序:冒泡排序法函数sortdata.m\x0d\x0afunctionreData=sortdata(SortList,n)\x0d\x0a%根据消息概率进行排序\x0d\x0afork=n:-1:2\x0d\x0aforj=1:k-1\x0d\x0amin=SortList(j).value\x0d\x0asbl=SortList(j).symbol\x0d\x0aif(min<SortList(j+1).value)\x0d\x0aSortList(j).value=SortList(j+1).value\x0d\x0aSortList(j+1).value=min\x0d\x0aSortList(j).symbol=SortList(j+1).symbol\x0d\x0aSortList(j+1).symbol=sbl\x0d\x0aend\x0d\x0aend\x0d\x0aend\x0d\x0areData=SortList\x0d\x0aend\x0d\x0a\x0d\x0a%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visit.m\x0d\x0afunctionvisit(node,n,ocode)\x0d\x0aglobalHufData\x0d\x0aifnode0)\x0d\x0a%遍历左分支接点输出1,这里采用子函数嵌套调用\x0d\x0aocode1=[ocode1]\x0d\x0avisit(HufData(node).left,n,ocode1)\x0d\x0aend\x0d\x0aif(HufData(node).right>0)\x0d\x0a%遍历右分支接点输出0,这里采用子函数嵌套调用\x0d\x0aocode2=[ocode0]\x0d\x0avisit(HufData(node).right,n,ocode2)\x0d\x0aend\x0d\x0aend\x0d\x0aend

这个是一个简单的,没有文件导入,需要编码的是自己输入的数组,你将它换成文件读取基本就可以实现对文章中的字符进行Huffman编码,这是我自己曾经做的一个程序,是VC6.0的,没有解码部分,解码部分你反过来推一下算法然后编一下代码就可以了。我还有一个是文件是用matlab作的huffman编码,你要的话给我邮箱,我给你发过去。

#include<iostream.h>

#include<string.h>

#define N 100

typedef struct

{

int wei //权值

int prt //父节点

int lch //左子节点

int rch// 右子节点

int tmp //中间变量,tmp=0 还未进行遍历 tmp=1 已近进行过向左遍历 tmp=2 已经进行过左右遍历 向上找到节点

char code[N]

}huffmantree

void input()

void print(huffmantree )

void select(huffmantree *HT,int n,int &i,int &j)

{

int k

i=1

while(HT[i].prt!=0)

{

i++

}

for(k=i+1k<=nk++)

{

if((HT[k].prt=0)&&(HT[k].wei <HT[i].wei))

i=k

}

j=1

while((j==i)||(HT[j].prt!=0))

{

j++

}

for(k=j+1k<=nk++)

{

if((HT[k].prt=0)&&k!=i&&HT[k].wei<HT[j].wei)

j=k

}

}

void huffman(int w[],huffmantree *HT,int n) //w存放n个字符的权值

{

int m=2*n-1

int i,k,j

huffmantree *p=0

for(p=HT+1,i=1i<=mi++,p++)

{

HT[i].prt=0

HT[i].lch=0

HT[i].rch=0

}

for(p=HT+1,i=1i<=ni++,p++)

{

HT[i].wei=w[i-1]

}

for(p=HT+n+1,i=n+1i<=mi++,p++)

{ HT[i].wei=0}

for(k=n+1k<=mk++)

{

select(HT,k-1,i,j) // 找最小值和次小值的位置

HT[i].prt=k,HT[j].prt=k // 找到i j 的父节点付给k

HT[k].lch=i,HT[k].rch=j // 父节点的左右指针分别指向i, j

HT[k].wei=HT[i].wei+HT[j].wei

}

}

void huffmancoding(huffmantree *HT,int n) //n个叶子结点的huffman编码 从根节点开始编码

{

int BT=2*n-1

int m=BT

int l,r,p

char s1[100]="0",s2[100]="1"

for(int i=0i<=mi++)//中间变量赋初值

{ HT[i].tmp=0 }

strcpy(HT[m].code," ")

while(1)

{

l=HT[BT].lch

r=HT[BT].rch

p=HT[BT].prt

if(p==0&&HT[BT].tmp==2)

break

if(l==0||r==0)

{

HT[BT].tmp=2//如果是叶子结点则给中间变量赋值2向上返回一节结点

}

if(HT[BT].tmp==0) //未进行过遍历,开始向左遍历

{

HT[BT].tmp=1 //已经进行过向左遍历

l=HT[BT].lch

strcpy(HT[l].code,HT[BT].code)

strcat(HT[l].code,s1)

BT=l

}

else

if(HT[BT].tmp==1)

{

HT[BT].tmp=2

r=HT[BT].rch

strcpy(HT[r].code,HT[BT].code)

strcat(HT[r].code,s2)

BT=r

}

else if(HT[BT].tmp==2)

{

p=HT[BT].prt

BT=p

}

}

}

void print(huffmantree HT[],int n) //总共n个叶子节点

{

int i

cout<<"源码:"<<endl

for(i=1i<=ni++)

cout<<HT[i].wei<<endl

cout<<"Huffman编码:"<<endl

for(i=1i<=ni++)

{

cout<<HT[i].code<<endl

}

}

void input(int w[],int n)

{

int t,*p

int i=0

cout<<"对应的输入源码出现权值:(以-1结束)"<<endl

cin>>t

while(t>=0)

{

p=new int

*p=t

w[i]=*p

i++

cin>>t

}

}

void main()

{

int n,m

cout<<"输入源码个数:"

cin>>n

int *w

w=new int[n+1]

input(w,n)

m=2*n-1

huffmantree *HT

HT=new huffmantree[m+1]

huffman(w,HT,n)

huffmancoding(HT,n)

print(HT,n)

delete w,HT

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12025305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存