声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1804|回复: 1

[编程技巧] 求助帮我修改下程序,这是个利用huffman编码来实现图像压缩的程序,请大虾们帮忙改改

[复制链接]
发表于 2007-5-20 14:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
%%%%%%%%数字图像Huffman压缩编码实现%%%%%%%%%%%%%%%%%%%
clc; clear; J=imread('cameraman.tif');
imshow(J); title('原始图象'); I=double(J);
% load I;
[m,n]=size(I);
%%%%%%将矩阵的不同数统计在数组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          %冗余度

[ 本帖最后由 ChaChing 于 2009-9-5 15:05 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-5-20 23:13 | 显示全部楼层
请阅读 置顶贴:聚宝盆,然后重新整理你的问题,特别给出出错信息

[ 本帖最后由 ChaChing 于 2009-9-5 14:52 编辑 ]
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-19 04:24 , Processed in 0.055851 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表