霍夫曼编码的原理已经有很优秀的介绍博客了,给出现频率高的灰度级分配更短的码字无非就是利用数学中逆序乘积和最小的原理,具体的原理介绍我就不再赘述了。这里给大家分享一下我个人早先实现的霍夫曼编码matlab程序。废话不多说,直接上代码:
clear all;clc;
q=[0.04 0.05 0.06 0.07 0.10 0.10 0.18 0.40];
n=length(q);
r=zeros(n,n);
rq=zeros(n,n);
for i=1:n
rq(i,:)=q;
[q,index]=sort(q);
r(i,:)=[index(1:n+1-i) zeros(1,i-1)];
q=[q(1)+q(2) q(3:n) 1];
end
c=cell(n,n);
for i=1:n
for j=1:n
c(i,j)={blanks(1)};
end
end
for row=n:-1:2
for col=1:n+1-row
if r(row,col)==1
c(row-1,1)={[char(c(row,col)), '0']};
c(row-1,2)={[char(c(row,col)), '1']};
else
c(row-1,r(row,col)+1)=c(row,col);
end
end
end
代码很短,但是该有的功能都实现了。其中rq用来记录向前迭代的各阶段中的数据值,如fig1所示;r用来记录各阶段的排序结果,如fig2所示;c用来记录反向追溯数据来源过程中的编码值(从下往上看)。