www.pudn.com > new_SPIHT.rar > TEST0616.m


%%%%%%%%数字图像Huffman压缩编码实现%%%%%%%%%%%%%%%%%%%  
clc  
clear  
J=imread('cameraman.tif'); 
title('原始图象'); 
imshow(J); 
I=double(J); 
%load wbarb; 
[m,n]=size(J);  
%%%%%%将矩阵的不同数统计在数组c的第一列中%%%%%%%%%%%%  
p1=1;s=m*n;  
for k=1:m  
    for L=1:n  
        f=0;  
        for b=1:p1-1  
            if(c(b,1) == I(k,L)) f=1;break;end  
        end  
        if(f==0)c(p1,1)=I(k,L);p1=p1+1;end  
    end  
end  
%%%%%%%%%%%将相同的数占站整个数组总数的比例统计在数组p中%%%%%%%  
for g=1:p1-1  
    p(g)=0;c(g,2)=0;  
    for k=1:m  
        for L=1:n  
            if(c(g,1) == I(k,L)) p(g)=p(g)+1;end  
        end  
    end  
    p(g)=p(g)/s;  
end  
p11=p;  
%%%%%%%%找到最小的概率,相加直到等于1,把最小概率的序号存在tree第一列中,次小放在第二列,和放在p像素比例之后%%%%%%%  
pn=0;po=1;  
while(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  
%%%%%%%%%C数组第一维表示值,第二维表示代码数值大小,第三维表示代码的位数po=8 g=8  
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,1),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  
end  
%%%%%%%%%把概率小的值为1标识,概率大的值为0标识%%%%%%  
[M,N]=size(c);  
disp('编码')  
A1=dec2bin(c(1,2),c(1,3))    %%%说明:这里可以把编码存在高维数组或构架数组、元胞数组同时显示。   
A2=dec2bin(c(2,2),c(2,3))  
A3=dec2bin(c(3,2),c(3,3))  
A4=dec2bin(c(4,2),c(4,3))  
A5=dec2bin(c(5,2),c(5,3))  
A6=dec2bin(c(6,2),c(6,3))  
A7=dec2bin(c(7,2),c(7,3))  
A8=dec2bin(c(8,2),c(8,3))  
for m=1:M  
    if (p11(m)~=0) H(m)=-p11(m)*log2(p11(m));  
    end  
end  
disp('信源的熵')  
H1=sum(H)    %信源的熵  
NN=0;  
for i=1:M  
        NN=NN+p11(1,i)*c(i,3);    %平均码长  
end  
disp('平均码长')  
NN  
disp('编码效率')  
yita=H1/(NN*log2(2))      %效率  
disp('冗余度')  
Rd=1-yita          %冗余度