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

📄 huffman.m

📁 huffman编码 matlab下采用huffman编码
💻 M
字号:
%function a=huffman[b]
%%%%%%%%数字图像Huffman压缩编码实现%%%%%%%%%%%%%%%%%%% 
clc 
clear 
J=imread('0.bmp');
%title('原始图象');
%imshow(J);
I=double(J);
% load I; 
[m,n]=size(I); 
%%%%%%将矩阵的不同数统计在数组c的第一列中%%%%%%%%%%%%
p1=1;
s=m*n; 
for i=1:m 
    for j=1:n 
        c(j+512*(i-1),1)=I(j,i);
    end
end
%        f=0; 
%        for b=1:p1-1
%            if(c(b,1) == I(k,L)) 
%                f=1;
%                break;
%            end 
%        if(f==0)
%            c(p1,1)=I(k,L);
%            p1=p1+1;
%        end 
%    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          %冗余度

⌨️ 快捷键说明

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