%%近学习图像处理,书中的huufman编码代码实在难以恭维,网上又未寻得matlab版以供参考,遂自己动手。。。
%%
% Function :huffman 编码
% Author :joooogoofooo(09071308)
% Date : 2012-05-10
%%
%%
function huffmanCoding(~)
p = [0.4, 0.18, 0.10, 0.10 , 0.07, 0.06, 0.05, 0.04];
%%构建huffman树:
n = length(p);
idx = zeros(1,2*n-1);
%初始化叶:
idx (1:n) = 1;
pnum = 0;
for i=1:n
pnum = pnum+1;
HT(pnum).value = p(i);%节点值
HT(pnum).left = 0; %左子树索引
HT(pnum).right = 0; %右子树索引
HT(pnum).parent = 0; %父节点索引
end
%建造huffman树非叶节点:
for i=1:n-1
[l,r] = least2(HT,idx);%找到最小两个节点
pnum = pnum+1;
HT(pnum).value = HT(l).value + HT(r).value;%合并节点
HT(pnum).left = l;
HT(pnum).right = r;
HT(pnum).parent = 0; %父节点默认为空(0)
HT(l).parent = pnum;
HT(r).parent = pnum;
idx(pnum) = 1;
idx(l) = 0;
idx(r) = 0;
end
% 从huffman树读出各个叶子的编码:
for i=1:n
child = i;
parent = HT(child).parent;
code = blanks(0);
while parent ~= 0; %从叶到根逆向读取,避免扫描增加时间开销
if child == HT(parent).left;
code = ['0',code];
else
code = ['1',code];
end
child = parent;
parent = HT(child).parent;
end
disp([num2str(p(i)),': ',code]);
end
%% 子函数-01
function [p1,p2] = least2(HT,idx)
%功能:找到最小两个节点的索引的
m = length(HT);
p1 = find(idx,1,'first');
p2 = p1;
v1 = 1;
v2 = 1;
for j=1:m
if idx(j) ~= 0
if HT(j).value < v1
v2 = v1;
v1 = HT(j).value;
p2 = p1;
p1 = j;
end
end
end
for j=p1+1:m
if idx(j) ~= 0
if HT(j).value < v2
v2 = HT(j).value;
p2 = j;
end
end
end
end % 子函数-01
%%
end