ホフマン符号化のmatlab実装(符号化のみ)


ホフマン符号化matlab実装

  • 内容紹介
  • ホフマン符号化
  • 主関数部分:
  • 内容紹介


    ~~初めてのオリジナルブログで、カリキュラム実験を記録しますが、今回の実験は主にホフマン符号化方法で画像を符号化し、matlabで実現します.ネットで探してみると、高読解量のいくつかのmatlabは配列で実現されていて便利ですが、理解するのは難しいので、ホフマン符号化ツリーから確率分布からホフマン符号化ツリーを生成し、符号化を得ます.直接コードをつける.

    ホフマン符号化

    function code_table=huffman_my(L,imhist_p)
    %% L256,imhist_p  
    %% 
    tic
    %%  , leaf_str  
    for i =1 : L
        tmp_str=struct('name',i,'prob',imhist_p(i),'Parent',[],'lchild',[],'rchild',[],'code',[]);
        leaf_str(i)=tmp_str;
    end
    %%  
    while length(leaf_str)>1
        [~,index]=sort([leaf_str.prob]);
        leaf_str=leaf_str(index);
        tmp_str.prob=leaf_str(1).prob+leaf_str(2).prob;
        tmp_str.name=0;
        tmp_str.lchild=leaf_str(1);
        tmp_str.rchild=leaf_str(2);
        tmp_str.Parent=[];
        leaf_str(1).Parent=tmp_str;
        leaf_str(2).Parent=tmp_str;
        leaf_str(end+1)=tmp_str;
        leaf_str(1:2)=[];
    end
    
    %%BFS=leaf_str;
    code_table=cell(L,1);
    % code_talbe=strings(256,1)
    while ~isempty(BFS)
        tmp_str=BFS(1);
        if ~isempty(tmp_str.lchild)
            tmp_str.lchild.code=[tmp_str.code,1];
    %         tmp_str.lchild.code=[tmp_str.code,'1'];
            BFS(end+1)=tmp_str.lchild;
        end
        if ~isempty(tmp_str.rchild)
            tmp_str.rchild.code=[tmp_str.code,0];
    %         tmp_str.rchild.code=[tmp_str.code,'0'];
            BFS(end+1)=tmp_str.rchild;
        end
        if tmp_str.name~=0
            code_table{tmp_str.name}=tmp_str.code;
        end
        BFS(1)=[];
    end
    toc
    end
    

    メイン関数セクション:


    訓練セットから画像を取得して全階調確率分布を取得し,試験セットデータを符号化した.
    function main
    clear
    clc
    %%  , 
    train_file_path =  '.\train\';
    train_img_path_list = dir(strcat(train_file_path,'*.bmp'));
    img_num = length(train_img_path_list);
    L=256;
    counts_total=zeros(L,1);
    if img_num > 0
        for k = 1:img_num
            image_name=train_img_path_list(k).name;
            image =  imread(strcat(train_file_path,image_name));
            image=rgb2gray(image);
            [counts_one,~]=imhist(image);
            counts_total=counts_total+counts_one;
        end
    end
    %%  
    imhist_p=counts_total/sum(counts_total);
    %%  
    
    code_table=huffman_my(L,imhist_p);
    %%  
    test_file_path =  '.\test\';
    test_img_path_list = dir(strcat(test_file_path,'*.bmp'));
    img_num = length(test_img_path_list);
    if img_num > 0
        for j = 1:img_num
            image_name=test_img_path_list(j).name;
            image =  imread(strcat(test_file_path,image_name));
            image=rgb2gray(image);
            name_former=split(image_name,'.');
            bin_file_name=cell2mat(strcat( name_former(1),'.txt'));
            [h,w]=size(image);
            write_file=fopen(['.\result\',bin_file_name],'w');
            code_len=0;
            for i = 1:h
                for j = 1:w
                    fprintf(write_file,dec2bin(cell2mat(code_table(image(i,j)+1))));
                    code_len=code_len+length(cell2mat(code_table(image(i,j)+1)));
                end
            end
            compressing_rate=code_len/(h*w*8);
            disp(['The Compression rate of ',bin_file_name,' is ',num2str(compressing_rate)])
            fclose(write_file);
        end
    end
    end
    

    現在実装されているのは01文字ストリームでテキストを書き込むだけで、時間があれば01バイナリストリームでファイルを書き込む時間を更新します.