huffman编码.docx
- 文档编号:27927129
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:14
- 大小:28.68KB
huffman编码.docx
《huffman编码.docx》由会员分享,可在线阅读,更多相关《huffman编码.docx(14页珍藏版)》请在冰豆网上搜索。
huffman编码
基于HUFFMAN编码的灰度图像压缩
一实验目的
1)熟悉huffman编码的基本原理;
2)掌握Matlab语言编写图像压缩程序;
3)培养学习解决图像处理问题的能力.
二实验内容
1.实验原理
1.1加密以及解密
数字图像加密就是在发送端采用一定的算法作用于一幅图像明文,使其变成不可识别的密文,达到图像保密的目的。
在接收端采用相应的算法解密,恢复出原文。
其通用算法模型如下图所示。
数字图像加密通用模型
基于矩阵变换像素置换的图像加密技术原理
Arnold变换,俗称猫脸变换.设像素的坐标x,y∈S={0,1,2,…,N-1},
则Arnold变换为:
Arnold变换可以看做是裁剪和拼接的过程。
通过这一过程将离散化的数字图像矩阵S中的点重新排列。
由于离散数字图像是有限点集,这种反复变换的结果,在开始阶段S中像素点的位置变化会出现相当程度的混乱,但由于动力系统固有的特性,在迭代进行到一定步数时会恢复到原来的位置。
解密为加密的逆过程,其基本思想与加密相同,
1.2huffman编码的原理
该编码方式是无损压缩方法,它是从事图像、语音等海量信息压缩研究的基础。
其原理是基于数据符号出现的概率进行编码,概率越大其编码越短;反之,概率越小其编码越长。
2.Huffman图像编码实验步骤:
l)将信号源的符号按照出现概率递减的顺序排列(其根据灰度值)。
2)将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。
3)重复进行步骤1和2直到概率相加的结果等于1为止。
4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。
5)记录下概率为1处到当前信号源符号之间的0,1序列,从而得到每个符号的编码。
3.Huffman编码的特点
1)编出来的码都是异字头码,保证了码的唯一可译性。
2)由于编码长度可变。
因此译码时间较长,使得Huffman编码
的压缩与还原相当费时。
3)编码长度不统一,硬件实现有难度。
4)对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;若信号源符号的概率相等,则编码效率最低。
5)由于0与1的指定是任意的,故由上述过程编出的最佳码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。
4.实验源代码(详见附录)
三实验内容及步骤
1)采用Matlab对下图进行huffman编码并计算huffman编码的编码效率。
(详细代码见附录一)
2)采用Matlab对下图先进行加密,然后进行huffman编码,译码,最后通过解密恢复原始图像,(详细代码见附二)。
四实验结果
1)实验图像以及其灰度直方图如下图所示:
该方法的编码效率=99.5018%
2)对其压缩结果编写加密解密解压缩详细见下图
五实验总结与心得
1)在该实验的过程中,利用一个矩阵记录每次排序前概率的所在位置,是该实验的关键,在编码的过程中利用该矩阵就能比较容易进行huffman编码。
2)通过这个实验,对huffman编码,加密,解密算法的具体实现原理了解的更加深刻,在实验的过程中也遇到了一些问题,通过查找资料和相关书籍得到了解决,总的来说,在完成该实验的过程中,还是学到了比较多的知识,包括使对一些matlab语句的掌握的更加熟练,完成一个算法必须要有一个整体的把握等等。
附录
附录一
clearall;
I=imread('cameraman.tif');%以矩阵方式选取读入一幅灰度图像
subplot(1,2,1),imshow(I);title('读入用于Huffman编码的原始图像')
%绘出读入图像的直方图
[mn]=size(I);%计算该图像矩阵的行、列值(图像的尺寸参数)
[conpixv]=imhist(I);
subplot(1,2,2),stem(pixv,con,'filled','r');
xlabel('灰度值');ylabel('对应灰度值的像素个数');
%统计像素不为0的灰度级出现的概率
L=length(find(con>0));%找出像素不为0的灰度级索引和个数
Pgrade=pixv(find(con>0));%统计像素不为0的灰度级
p=con(find(con>0))./(m*n);%统计像素不为0的灰度级出现的概率
p=p';q=p;
m=zeros(L-1,L);
%Huffman编码过程
fori=1:
L-1
[q,mark]=sort(q);
m(L-i,1:
L-i+1)=mark(1:
L-i+1);
q=[q
(1)+q
(2),q(3:
L),1];
end
c=cell(L-1,L);
c(1,1)={'0'};
c(1,2)={'1'};
fori=2:
L-1
ind=find(m(i-1,:
)==1);
temp=char(c(i-1,ind));
c(i,1)={[temp,'0']};
c(i,2)={[temp,'1']};
snc=find(m(i-1,:
)~=1);
forj=3:
i+1
con=snc(j-2);
c(i,j)=c(i-1,con);
end
end
codeL=[];
fori=1:
L
ind=find(m(L-1,:
)==i);
code=char(c(L-1,ind));
codeL(i)=length(code);
disp(strcat('像素灰度值=',num2str(Pgrade(i)),'编码:
',code));%求解对应灰度值的Huffman编码
end
Lavg=0;%声明用于求解该图像编码平均码字长度的初值为0
fori=1:
L
Lavg=Lavg+p(i)*codeL(i);%计算平均码字长度
end
%输出编码结果及相关数据
Eita=Entropy/Lavg;%计算图像的编码效率
disp(strcat('编码效率=',num2str(100*Eita),'%'));
附录二
clearall;
I=imread('cameraman.tif');
subplot(2,2,1);imshow(I);xlabel('原图');
[M,N]=size(I);
forx=1:
M
fory=1:
N
x1=x+y;
y1=x+2*y;
ifx1>M
x1=mod(x1,256);
end
ify1>N
y1=mod(y1,256);
end
ifx1==0
x1=256;
end
ify1==0
y1=256;
end
K(x1,y1)=I(x,y);
end
end
subplot(2,2,2);imshow(K);xlabel('加密后的图像')
%编码
p=zeros(1,61);
fort=1:
61
count=0;
fori=1:
M
forj=1:
N
ifK(i,j)==t-1
count=count+1;
end
end
end
p(t)=count;
p0=p;
end
core=cell(61,1);
sign=zeros(61);
forhh=1:
60
re=M*N;
fort=1:
61
if(p(t)
re=p(t);
end
end
t=1;
while(p(t)~=re)&(t<61)
t=t+1;
end
ifsign(t,1)==0
core{t}='0';
else
core{t}=['0',core{t}];
i=1;
while(sign(t,i)~=0)&(i<61)
core{sign(t,i)}=['0',core{sign(t,i)}];
i=i+1;
end
end
p(t)=0;
cou=t;
re1=M*N;
fort=1:
61
if(p(t)
re1=p(t);
end
end
t=1;
while(p(t)~=re1)&(t<61)
t=t+1;
end
ifsign(t,1)==0
core{t}='1';
else
core{t}=['1',core{t}];
i=1;
while(sign(t,i)~=0)&(i<61)
core{sign(t,i)}=['1',core{sign(t,i)}];
i=i+1;
end
end
p(t)=p(t)+re;
cou1=t;
i=1;
while(sign(t,i)~=0)&(i<61)
i=i+1;
end
sign(t,i)=cou;
i=i+1;
j=1;
while(sign(cou,j)~=0)&(j<61)
sign(t,i)=sign(cou,j);
i=i+1;
j=j+1;
end
end
%产生huffman码
fc=cell(M,N);
fori=1:
M
forj=1:
N
ifK(i,j)<61
fc{i,j}=core{K(i,j)+1};
else
fc{i,j}='0';
end
end
end
imcore=char();
fori=1:
M
forj=1:
N
imcore=[imcore,fc{i,j}];
end
end
savepictureimcorecore;%保存图片码流和编码对应表
loadpicture.mat
Nc=size(core);
Nic=size(imcore);
flag=0;
i=1;
j=1;
n=1;
cz=char();
len=size(K);
f=zeros(len);
forn=1:
Nic
(2)
ifflag==0
cz=[cz,imcore(n)];
else
cz=imcore(n);
flag=0;
end
fort=1:
Nc
(1)
ifstrcmp(cz,core{t})
K(j,i)=t;
flag=1;
ifi>len-1;
i=1;
j=j+1;
else
i=i+1;
end
break;
end
end
end
k=uint8(K*4+35);
subplot(223)
imshow(k);
xlabel('解码后的图像');
%解密
forx1=1:
M
fory1=1:
N
ifx1 y2=y1-x1; ifx1<=y2 x2=256+x1-y2; else x2=x1-y2; end end ifx1>y1 y2=256+y1-x1; ifx1<=y2 x2=256+x1-y2; else x2=x1-y2; end end ifx1==y1 y2=256; x2=x1; end A2(x2,y2)=K(x1,y1); end end subplot(224);imshow(A2);xlabel('解密后的图像')
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- huffman 编码
