ホフマン符号化のmatlab実装(符号化のみ)
22557 ワード
ホフマン符号化matlab実装
内容紹介
~~初めてのオリジナルブログで、カリキュラム実験を記録しますが、今回の実験は主にホフマン符号化方法で画像を符号化し、matlabで実現します.ネットで探してみると、高読解量のいくつかのmatlabは配列で実現されていて便利ですが、理解するのは難しいので、ホフマン符号化ツリーから確率分布からホフマン符号化ツリーを生成し、符号化を得ます.直接コードをつける.
ホフマン符号化
function code_table=huffman_my(L,imhist_p)
%% L , 256,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バイナリストリームでファイルを書き込む時間を更新します.
function code_table=huffman_my(L,imhist_p)
%% L , 256,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