该部分代码只包括用matlab自带函数写的,由于是作业的关系,自己写的函数暂时不发出来。代码仅供参考,切勿抄袭。
%% 作业要求:完成任意图像的霍夫曼编码,并计算冗余度.
% author:xxxx
% date :2020.6.3
clear,clc;
I1=imread("peppers.png");
I2=rgb2gray(I1);
imshow(I2);
%% 运行编码函数
%编码我们可以使用自带的函数,同时也可以使用自己写的函数
[R,C]=size(I2);
a=I2(:);%1:M*N;
P=zeros(1,256);%获取符号的概率
for i=0:255
P(i+1)=length(find(a==i))/(R*C);
end
k=0:255;
dict=huffmandict(k,P);%编码结果
%调用自己写的函数
[output,p]=hufuman(I2);
%% 计算冗余度r
% %计算H,在这一步要把为0的值去掉,否则永远会出错误。
H=0;
for i=1:256
if p(i) ~= 0
H=H+p(i)*log2(1/p(i));
end
end
%计算平均码长
R=0;
for i=1:256
R=length(strtrim(output(i,:)))*p(i)+R;
end
%计算冗余度
n=1-(H/(R*log2(256)));
fprintf('冗余度n为 %fn',n )