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

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

给你一段程序,自己研究下吧!\x0d\\x0d\clc\x0d\clear\x0d\closeall;\x0d\%定义HufData/Len为全局变量的结构体\x0d\globalHufData;\x0d\globalLen\x0d\disp('计算机正在准备输出哈夫曼编码结果,请耐心等待');\x0d\%原始码字的灰度\x0d\a=imread('kidstif');\x0d\\x0d\%分区画出原始图像和灰度直方图\x0d\figure;\x0d\subplot(1,2,1)\x0d\imshow(a);\x0d\%取消坐标轴和边框\x0d\axisoff\x0d\boxoff\x0d\title('MATLAB自带图像','fontsize',13);\x0d\subplot(1,2,2);\x0d\axisoff\x0d\boxoff\x0d\imhist(a);\x0d\title('图像灰度直方图','fontsize',13);\x0d\%图像的灰度统计\x0d\GrayStatistics=imhist(a);\x0d\GrayStatistics=GrayStatistics';\x0d\GrayRatioo=GrayStatistics/sum(GrayStatistics);\x0d\GrayRatioNO=find(GrayRatioo~=0);\x0d\Len=length(GrayRatioNO);\x0d\%初始化灰度集,防止系统随即赋予其垃圾值\x0d\GrayRatio=ones(1,Len);\x0d\\x0d\fori=1:Len\x0d\GrayRatio(i)=GrayRatioo(i);\x0d\end\x0d\\x0d\GrayRatio=abs(sort(-GrayRatio));\x0d\%将图像灰度概率赋予结构体\x0d\fori=1:Len\x0d\HufData(i)value=GrayRatio(i);\x0d\end\x0d\\x0d\%哈夫曼编码/霍夫曼编码\x0d\HuffmanCode(Len);\x0d\%输出码字\x0d\\x0d\zippedHuffman=1;\x0d\fori=1:Len\x0d\tmpData=HufData(i)code;\x0d\str='';\x0d\forj=1:length(tmpData)\x0d\str=strcat(str,num2str(tmpData(j)));\x0d\zippedHuffman=zippedHuffman+1;\x0d\end\x0d\disp(strcat('a',num2str(i),'=',str))\x0d\end\x0d\i;\x0d\%计算计算机一共输出多少个哈夫曼编码/霍夫曼编码\x0d\zippedHuffman;\x0d\%计算在删去0灰度级压缩之前的原始图像字节容量\x0d\unzipped_delete=i8;\x0d\\x0d\%计算压缩比率\x0d\ratio_delete=zippedHuffman/unzipped_delete;\x0d\\x0d\%计算图像的压缩比率\x0d\ad=num2str(ratio_delete100);\x0d\str2=strcat(ad,'%');\x0d\disp(strcat('哈夫曼编码压缩比率','=',str2))\x0d\\x0d\%子程序:哈夫曼编码/霍夫曼编码函数HuffmanCodem\x0d\functionHuffmanCode(OriginSize)\x0d\globalHufData;\x0d\globalLen\x0d\fori=1:Len\x0d\%%霍夫曼编码树左边纪录为1\x0d\HufData(i)left=1;\x0d\%%霍夫曼编码树右边纪录为0\x0d\HufData(i)right=0;\x0d\%%输出码初始化为0\x0d\HufData(i)code=[];\x0d\%%排序列表初始化\x0d\SortList(i)symbol=i;\x0d\SortList(i)value=HufData(i)value;\x0d\end\x0d\%初始化原始消息数目\x0d\newsymbol=OriginSize;\x0d\forn=OriginSize:-1:2\x0d\%将N个消息进行排序\x0d\SortList=sortdata(SortList,n);\x0d\%将最后两个出现概率最小的消息合成一个消息\x0d\newsymbol=newsymbol+1;\x0d\HufData(newsymbol)value=SortList(n-1)value+SortList(n)value;\x0d\HufData(newsymbol)left=SortList(n-1)symbol;\x0d\HufData(newsymbol)right=SortList(n)symbol;\x0d\%将消息添加到列队的最后,为N-1个消息重新排序作好准备\x0d\SortList(n-1)symbol=newsymbol;\x0d\SortList(n-1)value=HufData(newsymbol)value;\x0d\end\x0d\%遍历霍夫曼树,获得霍夫曼编码/哈夫曼编码\x0d\visit(newsymbol,Len,[]);\x0d\end\x0d\\x0d\%子程序:冒泡排序法函数sortdatam\x0d\functionreData=sortdata(SortList,n)\x0d\%根据消息概率进行排序\x0d\fork=n:-1:2\x0d\forj=1:k-1\x0d\min=SortList(j)value;\x0d\sbl=SortList(j)symbol;\x0d\if(min<SortList(j+1)value)\x0d\SortList(j)value=SortList(j+1)value;\x0d\SortList(j+1)value=min;\x0d\SortList(j)symbol=SortList(j+1)symbol;\x0d\SortList(j+1)symbol=sbl;\x0d\end\x0d\end\x0d\end\x0d\reData=SortList;\x0d\end\x0d\\x0d\%子程序:遍历哈夫曼编码/霍夫曼编码树搜索函数visitm\x0d\functionvisit(node,n,ocode)\x0d\globalHufData\x0d\ifnode0)\x0d\%遍历左分支接点输出1,这里采用子函数嵌套调用\x0d\ocode1=[ocode1];\x0d\visit(HufData(node)left,n,ocode1);\x0d\end\x0d\if(HufData(node)right>0)\x0d\%遍历右分支接点输出0,这里采用子函数嵌套调用\x0d\ocode2=[ocode0];\x0d\visit(HufData(node)right,n,ocode2);\x0d\end\x0d\end\x0d\end

给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

编码:

1输入字符串,通过getWeight()获取其权重即每个字符出现的次数并利用权重及字符生成Node结点,组成sourceData列表。

2调用makeHuffman()方法,通过getmin2()函数可获得最小权重的两个字符,再让其形成父亲结点,并赋予左子结点右子结点,遍历sourceData完生成huffman结点,即哈夫曼树的根结点。

3调用traverse()方法,将以huffman为根结点的树遍历形成列表。

4调用strToHuffmanCode()方法,会去调用getCode()方法,会去根据huffman形成路径表route2,再跟原字符串一个一个字符进行比对,找到就添加其路径最终生成huffmancode

5获取二进制表示的哈夫曼编码后,调用huffmanCodeBytes函数可以将二进制树转为带符号的十进制树,以八位二进制数为一组例如11010110,第一位为符号位,1表示负转为十进制数应将其余位取反并加1,再转为十进制数再-1,就可以得到最终的十进制数。

解码:

调用decimalToBinary()函数将带符号的十进制数转为二进制数,再调用byteToBitString()比对route路径表 得到字符

哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。它是一种变长的编码。在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。(注:码字即为符号经哈夫曼编码后得到的编码,其长度是因符号出现的概率而不同,所以说哈夫曼编码是变长的编码。) 而且哈夫曼编码是按照子树到父亲,而其读码则是完全相反的。 因此,后来有人提出了一种动态的哈夫曼编码方法。动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。动态哈夫曼编码比静态哈夫曼编码复杂的多,有兴趣的读者可参考有关数据结构与算法的书籍。

前面提到的JPEG中用到了哈夫曼编码,并不是说JPEG就只用哈夫曼编码就可以了,而是一幅经过多个步骤后得到它的一列数值,对这些数值进行哈夫曼编码,以便存储或传输。哈夫曼编码方法比较易懂,大家可以根据它的编码方法,自己编写哈夫曼编码和解码的程序。

哈夫曼树的构造算法。

const maxvalue= 10000; {定义最大权值}

maxleat=30; {定义哈夫曼树中叶子结点个数}

maxnode=maxleaf2-1;

type HnodeType=record

weight: integer;

parent: integer;

lchild: integer;

rchild: integer;

end;

HuffArr:array[0maxnode] of HnodeType;

var ……

procedure CreatHaffmanTree(var HuffNode: HuffArr); {哈夫曼树的构造算法}

var i,j,m1,m2,x1,x2,n: integer;

begin

readln(n); {输入叶子结点个数}

for i:=0 to 2n-1 do {数组HuffNode[ ]初始化}

begin

HuffNodeweight=0;

HuffNodeparent=-1;

HuffNodelchild=-1;

HuffNoderchild=-1;

end;

for i:=0 to n-1 do read(HuffNodeweight); {输入n个叶子结点的权值}

for i:=0 to n-1 do {构造哈夫曼树}

begin

m1:=MAXVALUE; m2:=MAXVALUE;

x1:=0; x2:=0;

for j:=0 to n+i-1 do

if (HuffNode[j]weight<m1) and (HuffNode[j]parent=-1) then

begin m2:=m1; x2:=x1;

m1:=HuffNode[j]weight; x1:=j;

end

else if (HuffNode[j]weight<m2) and (HuffNode[j]parent=-1) then

begin m2:=HuffNode[j]weight; x2:=j; end;

{将找出的两棵子树合并为一棵子树}

HuffNode[x1]parent:=n+i; HuffNode[x2]parent:=n+i;

HuffNode[n+i]weight:= HuffNode[x1]weight+HuffNode[x2]weight;

HuffNode[n+i]lchild:=x1; HuffNode[n+i]rchild:=x2;

end;

end;

没用过,但查了一下,matlab

自带huffmancoding

的程序,基本上是你需要

1

把测试图像的灰度(sig)找出来,

2,

然后统计灰度的分布(p),

3

然后生成一个字典(dict),

4

然后直接就可以用huffmanenco进行编码,

5

再用huffmandeco进行恢复。

奇怪的是

huffman

coding不是无损压缩么,为什么会有损失?

等待大牛回答

sig

=

repmat([3

3

1

3

3

3

3

3

2

3],1,50);

%

Data

to

encode

symbols

=

[1

2

3];

%

Distinct

data

symbols

appearing

in

sig

p

=

[01

01

08];

%

Probability

of

each

data

symbol

dict

=

huffmandict(symbols,p);

%

Create

the

dictionary

hcode

=

huffmanenco(sig,dict);

%

Encode

the

data

dhsig

=

huffmandeco(hcode,dict);

%

Decode

the

code

以上就是关于对灰度图像进行霍夫曼编码,用Matlab怎么实现啊全部的内容,包括:对灰度图像进行霍夫曼编码,用Matlab怎么实现啊、第十一章:树结构应用之哈夫曼编码解码、哈夫曼的编码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/10626689.html

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

发表评论

登录后才能评论

评论列表(0条)

保存