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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐