哈夫曼编码的matlab实现,Huffman编码(哈夫曼编码)的Matlab实现
clear all
fprintf('Reading data...')
data=imread('cameraman.tif');
data=uint8(data);%读入数据,并将数据限制为uint8
fprintf('Done!\n')
%编码压缩
fprintf('compressing data...');
[zipped,info]=norm2huff(data);
fprintf('Done!\n')
%解压缩
fprintf('compressing data...');
unzipped=huff2norm(zipped,info);
fprintf('Done!\n')
%测试是否无失真
isOK=isequal(data(:),unzipped(:))
%显示压缩效果
whos data zipped unzipped
function [zipped,info]=norm2huff(vector)
if~isa(vector,'uint8'),
error('input argument must be a uint8 vector')
end
vector=vector(:)';
%将输入向量转换为行向量
f=frequency(vector);
%计算个元素出现的概率
simbols=find(f~=0);
f=f(simbols);%将元素按出现的概率排列
[f,sortindex]=sot(f);
simbols=simbols(sortindex);
%产生码字 generate the codeword as the 52 bits of a double
len=length(simbols);
simbols_index=num2cell(1:len);
codeword_tmp=cell(len,1);
while length(f)>1,
index1=simbols_index{1};
index2=simbols_index{2};
codeword_tmp(index1)=addnode(codeword_tmp(index1),uint8(0)); codeword_tmp(index2)=addnode(codeword_tmp(index2),uint8(1)); f=[sum(f(1:2)) f(3:end)];
simbols_index=[{[index1 index2]} simbols_index(3:end)];
%将数据重新排列,是两个节点的频率尽量与前一个节点的频率想当
resort data in order to have two nodes with lower frequency as first to
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)