Chinaunix首页 | 论坛 | 博客
  • 博客访问: 413578
  • 博文数量: 68
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 728
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-14 00:19
文章分类

全部博文(68)

文章存档

2011年(1)

2009年(1)

2008年(17)

2007年(30)

2006年(19)

我的朋友

分类:

2008-05-06 20:10:44

写这个程序竟然花了我三个多小时,,,太可恶了,,,把程序贴在这纪念一下!!!

建立Huffman树,,,这个过程在Matlab下面太恶心了,,,要是C++下面就好的多了!!!

最后图像编码的时候时间会很长,,,我想应该和Matlab环境有关吧,,,毕竟不太适合处理太多的字符数据。。。

下面是程序代码,,,拷贝我代码的朋友们一定得想想我那三个小时的恶心工作啊!!!
function [res,code]=huffman(image)
    % 输入参数图像必须是  灰度图
    % 程序用 Huffman树 结构实现
    data=double(image);
    [w,h]=size(data);
   
    hist=imhist(image);
    hist=hist.*1.0./(w*h);   
   
    %%%%%%%%%%%%%%%%%%%%
    %%  Huffman Tree
    %%%%%%%%%%%%%%%%%%%%
    num=length(hist);
   
    %newhist=[1/6,1/4,5/12,1/6];
    %num=4;
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%    初始化
    for i=1:2*num-1
        ht(i).lch=0;
        ht(i).rch=0;
        ht(i).pare=0;
        ht(i).weight=0;
    end
   
    for i=1:num
        ht(i).weight=hist(i);
    end
   
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%        建树
    n=length(hist);
    for i=num+1:2*num-1
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%  直接选择最小的两个比排序后选前两个更快
        min=100;
        for j=1:i-1
            if ht(j).weight                s1=j;
                min=ht(j).weight;
            end
        end
        min=100;
        for j=1:i-1
            if ht(j).weight                s2=j;
                min=ht(j).weight;
            end
        end       
       
        ht(s1).pare=i;
        ht(s2).pare=i;
        ht(i).lch=s1;
        ht(i).rch=s2;
        ht(i).weight=ht(s1).weight+ht(s2).weight;
    end
   
    %for i=1:2*num-1
        %if ht(i).pare==0
        %    i
        %end
        %ht(i).pare
    %end
   
    %ht(end).weight
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%      编码
    for i=1:num
        res{i}=blanks(260);
        cd=blanks(260);
        start=num;
        c=i;
        p=ht(c).pare;
        while(p>0)
            if(ht(p).lch==c)
                cd(start)='0';
            else
                cd(start)='1';
            end
            c=p;
            p=ht(c).pare;
            start=start-1;
        end
       
        %%%  反转字符串数组,去掉最后面的空串
        cd=deblank(cd);
        res{i}=seqreverse(cd);
        res{i}=deblank(res{i});
        res{i}=seqreverse(res{i});
    end   

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%       下面为图像编码
    %%   时间较长,与原图像大小有关
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %p=0;
    code=['Code Begin :']
    for i=1:w
        for j=1:h
            %p=p+1
            code=strcat(code,res{data(i,j)});
        end
    end
  
    code=strcat(code,': The End!');
end
阅读(2760) | 评论(0) | 转发(0) |
0

上一篇:OpenSource/Freeware vision software

下一篇:思蜀

给主人留下些什么吧!~~