数字图像处理课程设计.doc
【精品文档】如有侵权,请联系网站删除,仅供学习与交流数字图像处理课程设计.精品文档.数 字 图 像 处 理 课程设计报告题 目:基于矢量量化技术的编码 专业班级: 学 号: 姓 名: 基于矢量量化技术的图像编码一、 设计目的1.1掌握MATLAB GUI 程序设计1.2学习和熟悉MATLAB图像处理工具箱1.3学会运用MATLAB工具箱对图像进行处理和分析二、设计环境Window XP,MATLAB 7.0三、总体设计数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用前景。矢量量化技术是一种有损压缩技术,它根据一定的是真测度在码书中搜引出与输入适量失真最小的码字的索引,传输时仅传输这些码字的索引,接收方根据码字索引字,码书中查找对应码字,再现输入矢量。矢量量化分三个主要步骤:一是训练码书,二是编码,三是解码。有好的码书,才能进行有效的数据压缩编码,因此码书的设计是矢量量化的关键。用M个训练矢量生成包含N(N<M)个码字的码书,也就是说把M个训练适量分成N类最佳分类,并把各类的中心矢量最为码书中的码字,这里介绍一种直观有效的矢量量化码书设计算法,即LGB算法。1) 生成初始码书。可以用随机方法生成,也可以将训练样本随机分配于码书中。2) 进行迭代训练。每次迭代中,每一个训练矢量X1(i=12M)与码书中各个码Yj(j=1,2,.N)相比较,找到与该训练适量最相近的一个码字Yk,并把所有与Yk(j=1,2,.N)最相近的训练矢量归为一类,这样一共有N类。然后计算个训练矢量与其在码书中最相近的码字的距离的平方之和,得到当前迭代的中矢量。若这次迭代的总矢真与上次迭代的总矢量之间的相对误差满足给定要求,则停止迭代,否则求出个类的中心矢量作为新的码书进行下一次迭代。 矢量量化的编码就是根据一定的失真测度在码书中搜索出与输入矢量失真最小的码字的索引,编码过程就是完成输入矢量的马子搜索过程。 矢量量化的解码过程很简单,即根据接收到的码字索引在码书中找到该码字,并将该码字最为输入适量的替代矢量。 若矢量量化编码中用N个k维码字组成码书,那么对某个输入矢量序列进行编码后,其对应的标号需要log2N比特传输。 下面将用一个实例来讲解Matlab如何实现适量量化压缩,原图像为:1.码书设计:对图像进行矢量量化时,首先要选择码书的尺寸和码字的大小,这两个参数与图像压缩效果有直接的关系。另外,不同的码书训练方法生成的码书性能也有所不同。这里我们用最简单的LBG方法训练码书。码字为4*4的子图像块,码书的尺寸为64,其Matlab程序如下:function LBGdesign()%读入标准图像,用于码书的训练figure(1);sig=imread('1.bmp');%用size函数得到图像的行数和列数m_sig,n_sign=size(sig);%设置码字的大小,4*4siz_word=4;%设置码书的大小siz_book=64;%将图像分割成4*4的子图像,作为码书训练的输入向量num=m_sig/siz_word;ss=siz_word*siz_word; %码字的大小nn=num*num; %子图像个数,即输入矢量个数re_sig=;for i=1: m_sig for j=1:m_sig f1=floor(i./siz_word); m1=mod(i,siz_word); if m1=0 m1=siz_word; f1=f1-1; end f2=floor(j./siz_word); m2=mod(j,siz_word); if m2=0 m2=siz_word; f2=f2-1; end re_sig(num*f1+f2+1,siz_word*(m1-1)+m2)=sig(i,j); endend%码书初始化,从nn个输入矢量随机取siz_book个矢量作为初始矢量codebook=;for i=1:siz_book r=floor(rand*nn)+1; codebook=codebook;re_sig(r,:);end%LBG训练算法%d0,d1用于存放各训练矢量与其在码书中最近的码字的距离的平方之和%sea用于存放迭代精度d0=0;for i=1:nn d0=d0+vectordistance(ss. re_sig(i,:),codebook(1,:);endwhile 1 d1=0.0; for i=1:siz_book vectornumber(i)=0; end for i=1: nn codenumber(i)=1; min=vectordistance(ss. re_sig(i,:),codebook(1,:); for j=2:siz_book d=0.0; for l=2: ss d=d+(re_sig(i,l)-codebook(j,l)2; if d>=min break; end end if d<min min=d; codenumber(i)=j; end end vectornumber(codenumber(i)=vectornumber(codenumber(i)+1; d1 =d1+min; end sea=(d0-d1)/d1; if sea<=0.0001 break; end d0=d1; for j=1: siz_book if vectornumberj=0 dd=zeros(1,ss); for l=1: nn if codenumber(l)=j for k=1: ss dd(k)=dd(k)+re_sig(1,k); end end end for k=1: ss codebook(j,k)=dd(k)/vectornumber(j); end else l=floor(rand*nn)+1; codebook(j,:)=re_sig(1,:); end endendsave codebook_kn codebook;%函数vectordistance是计算矢量间距离的函数function z=vectordistance(siz_word,vector1,vector2)z=0;for i=1:siz_word z=z+(vector1(i)-vector2(i)2;end程序运行结果为如图:2.编码:可将任意一幅要压缩图像分割成4*4的字图像块,然后按照码书中的码字索引进行编码,也就是说每一个子图像经过编码后仅用一个索引号表示,实现编码的Matlab程序如下:funtion LBGencode()%打开和显示要编码的图像figure(1)sig=imread('1,bmp');imagesc(sig);colormap(gray);axis square axis off m_sig, n_sig=size(sig); %根据已有的码书设置分割子图像的大小和码书的大小 siz_word=4; siz_book=64; %调用码书 load codebook_kn %根据码书的要求,分割要编码的图像 num=m_sig/siz_word; ss=siz_word*siz_word; nn=num*num; re_sig=; for i=1:m_sig for j=1:m_sig f1=floor(i./siz_word); m1=mod(i,siz_word); if m1=0 m1=siz_word; f1=f1-1; end f2=floor(j./siz_word); m2=mod(j,siz_word); if m2=0 m2=siz_word; f2=f2-1; end re_sig(num*f1+f2+1,siz_word*(m1-1)+m2)=sig(i,j); end end %用LBG算法编码 d1=0.0; for i=1:nn codenumber(i)=1; min =vectordistance(ss,re_sig(i,:),codebook(1,:); for j=2:siz_book d=0.0; for l=1: ss d=d+(re_sig(i,l)-codebook(j,l)2; if d>=min break; end end if d<=min min=d; codenumber(i)=j; end end d1=d1+min; end经过编码后,每个图像块都和码书中的某个码字相对应,也就是可以用这个索引号替代子图像块,起到压缩编码的效果运行图像如下:3.解码:解码就是按照索引号将码书中的码字找出来吗,用找到的码字将图像重建出来。重建图像和原始图像之间存在一定的失真,只要失真控制在一定的范围内,则认为该图像压缩是有效的。实现解码的Matlab程序如下:function LBGdecode()%解码算法for i=1: nn re_sig(i,:)=codebook(codenumber(i),:);end%重建图像for ni=1: nn for nj=1: ss f1=floor(ni./num); f2=mod(ni,num); if f2=0 f2=num; f1=f1-1; end m1=floor(nj./siz_word)+1; m2=mod(nj,siz_word); if m2=0 m2=siz_word; m1=m1-1; end re_re_sig(siz_word*f1+m1,siz_word*(f2-1)+m2)=re_sig(ni,nj); endend%显示解压后的图像,即压缩图像figure(2);imagesc(re_re_sig);colormap(gray);axis squareaxis off运行图像为:四:小结通过十六个学时的数字图像处理课程设计让我对数字图像处理有了更深层次的了解,一遍遍的翻书查资料也让我又回顾了这一学期来所学的知识。对于此课程设计中的课题中,我们做的是基于矢量量化技术的图像编码,矢量量化技术是一种有损压缩技术,它根据一定的失真测度在码书中搜索与矢量失真最小的码字的索引,传输时仅传输这些码字的索引,接收方根据码字索引在码书中查找对应码字,再现输入矢量。由于图像数据占据大量的存储容量和较宽的传输信道,因此在信息社会中,数字图像压缩技术在图像处理中的地位越来越重要。这次课程设计让我对这门技术有了基础的理解。这门课程设计也用到了MATLAB,在学习这门课程得过程中又巩固了MATLAB的知识。在编程的过程中大家都特别齐心,共同商量怎么编程,使我们的团队意识进一步加强。当最终图像显示出来时,那种成功的喜悦油然而生。总之,这次课设让我学会了很多。谢谢老师在学习中的教导与课程设计中耐心的指导!