哈夫曼图片编码.m

来源:互联网 发布:c语言算法经典书籍 编辑:程序博客网 时间:2024/04/30 14:51
clc;clear;close;[Filename,Pathname]=uigetfile(...    {'*.tif';'*.bmp';'*.png';'*.gif';'*.jpg'},'选择图片');str=[Pathname Filename];if (Filename~=0)    z=imread(str);    imshow(z);    %else    %clear;      %显示数组Z    [m,n]=size(z);    p1=1;s=m*n;    for k=1:m      %获取图像颜色总数        for l=1:n            f=0;            for b=1:p1-1                if(c(b,1)==z(k,l)) f=1;break;end            end            if(f==0)c(p1,1)=z(k,l);p1=p1+1;end        end    end    for g=1:p1-1     %计算各种颜色值出现概率        p(g)=0;c(g,2)=0;        for k=1:m            for l=1:n                if(c(g,1)==z(k,l))p(g)=p(g)+1;end            end        end        p(g)=p(g)/s;    end    pn=0;po=1;    while(1)        %按概率排序生成一个符号(0或1)树并记录各节点        if(pn>=1.0) break;        else            [pm,p2]=min(p(1:p1-1));p(p2)=1.1;            [pm2,p3]=min(p(1:p1-1));p(p3)=1.1;            pn=pm+pm2;p(p1)=pn;            tree(po,1)=p2;tree(po,2)=p3;            po=po+1;p1=p1+1;        end    end    for k=1:po-1     %沿符号树进行搜索生成哈夫曼编码        tt=k;m1=1;        if(or(tree(k,1)<g,tree(k,2)<g))            if(tree(k,1)<g)                c(tree(k,1),2)=c(tree(k,1),2)+m1;                m2=1;                while(tt<po-1)                    m1=m1*2;                    for l=tt:po-1                        if(tree(l,1)==tt+g)                            c(tree(k,1),2)=c(tree(k,1),2)+m1;                            m2=m2+1;tt=l;break;                        elseif(tree(l,2)==tt+g)                            m2=m2+1;tt=l;break;                        end                    end                end                c(tree(k,l),3)=m2;            end            tt=k;m1=1;            if(tree(k,2)<g)                m2=1;                while(tt<po-1)                    m1=m1*2;                    for l=tt:po-1                        if(tree(l,1)==tt+g)                            c(tree(k,2),2)=c(tree(k,2),2)+m1;                            m2=m2+1;tt=l;break;                        elseif(tree(l,2)==tt+g)                            m2=m2+1;tt=l;break;                        end                    end                end                c(tree(k,2),3)=m2;            end        end    endend

0 0
原创粉丝点击