ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:447.15KB ,
资源ID:12539492      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12539492.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(游程编码的图像压缩.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

游程编码的图像压缩.docx

1、游程编码的图像压缩一、内容与要求1目的1、熟练掌握游程编码的方法;掌握游程码的编程实现。2内容1、根据游程 编码的方法步骤,编写二元游程编码的程序;2、对一幅二值图像进行编码。二、报告正文1课题描述 游程编码又称“运行长度编码”或“行程编码”,是一种统计编码,该编码属于无损压缩编码,是栅格数据压缩的重要编码方法。对于二值图有效。 在对图像数据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。相应地,信道编码是为了对抗信道中的噪音和衰减,通过增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。2 信源编码2.1概念 一种以提高通信有效性

2、为目的而对信源符号进行的变换;为了减少或消除信源剩余度而进行的信源符号变换,对输入信息进行编码,优化信息和压缩信息并且打成符合标准的数据包 2.2编码方式 最原始的信源编码就是莫尔斯电码,另外还有ASCII码和电报码都是信源编码。但现代通信应用中常见的信源编码方式有:Huffman编码、算术编码、L-Z编码,这三种都是无损编码,另外还有一些有损的编码方式。信源编码的目标就是使信源减少冗余,更加有效、经济地传输,最常见的应用形式就是压缩。另外,在数字电视领域,信源编码包括 通用的MPEG2编码和H.264(MPEGPart10 AVC)编码等。 相应地,信道编码是为了对抗信道中的噪音和衰减,通过

3、增加冗余,如校验码等,来提高抗干扰能力以及纠错能力。 2.3通信系统模型 信源-信源编码-信道编码-信道传输+噪声-信道解码-信源解码-信宿 一般信息论的书上都会有信源编码和信道编码的具体讲解,包括具体的编码方法。 2.4描述 为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对信源输出的符号序列所施行的变换。具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。 既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所

4、施行的变换或处理,都可以在这种意义下归入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。当然,这些都是广义的信源编码。 一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:使序列中的各个符号尽可能地互相独立;使序列中各个符号的出现概率尽可能地相等。前者称为解除相关性,后者称为概率均匀化。 信源编码的一般问题可以表述如下: 若某信源的输出为长度等于M的符号序列集合 式中符号A为信源符号表,它包含着K个不同的符号,A=k|k=1,K,这个信源至多可以输出KM个不同的符号序列。记U=KM。所谓对这个信源的输出 进行编码,就是用一个新的符号表B的符号序列集合V来表示信源输

5、出的符号序列集合U。若V的各个序列的长度等于 N,即 式中新的符号表B共含L个符号,B=bl|l=1,L。它总共可以编出LN个不同的码字。类似地,记VLN。为了使信源的每个输出符号序列都能分配到一个独特的码字与之对应,至少应满足关系 VLNUKM 或者 N/MlogK/logL。 假若编码符号表B的符号数L与信源符号表A的符号数K相等,则编码后的码字序列的长度N必须大于或等于信源输出符号序列的长度M;反之,若有NM,则必须有LK。只有满足这些条件,才能保证无差错地还原出原来的信源输出符号序列(称为码字的唯一可译性)。可是,在这些条件下,码字序列的每个码元所载荷的平均信息量不但不能高于,反而会低

6、于信源输出序列的每个符号所载荷的平均信息量。这与编码的基本目标是直接相矛盾的。下面的几个编码定理,提供了解决这个矛盾的方法。它们既能改善信息载荷效率,又能保证码字唯一可译。 离散无记忆信源的定长编码定理: 对于任意给定的0,只要满足条件 N/M(H(U)+)/logL。那么,当M足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。式中H(U)是信源输出序列的符号熵。 通常,信源的符号熵H(U)logK,因此,上述条件还可以表示为 【H(U)+】/logLN/MlogK/logL。 特别,若有KL,那么,只要H(U)logK,就可能有NM,从而提高信息载荷的效率。由

7、上面这个条件可以看出,H(U)离logK越远,通过编码所能获得的效率改善就越显著。实质上,定长编码方法提高信息载荷能力的关键是利用了渐近等分性,通过选择足够大的M,把本来各个符号概率不等因而H(U)logK的信源输出符号序列变换为概率均匀的典型序列,而码字的唯一可译性则由码字的定长性来解决。 离散无记忆信源的变长编码定理 变长编码是指V的各个码字的长度不相等。只要V中各个码字的长度 Ni(i1,V)满足克拉夫特不等式 这 V个码字就能唯一地正确划分和译码。离散无记忆信源的变长编码定理指出: 若离散无记忆信源的输出符号序列为, 式中 Ak|k=1,K,符号熵为H(U),对U进行唯一可译的变长编码

8、,编码字母表B的符号数为L,即B=bl|l=1,L,那么必定存在一种编码方法,使编出的码字Vi(vi1,viNi),(i=1,V),具有平均长度嚻: MH(U)/logL嚻MH(U)/logL+1 若L=K,则当H(U)logKlogL时,必有嚻M;H(U)离logK越远,则嚻越小于M。 具体实现唯一可译变长编码的方法很多,但比较经典的方法还是仙农编码法、费诺编码法和霍夫曼编码法。其他方法都是这些经典方法的变形和发展。所有这些经典编码方法,都是通过以短码来表示常出现的符号这个原则来实现概率的均匀化,从而得到高的信息载荷效率;同时,通过遵守克拉夫特不等式关系来实现码字的唯一可译。 霍夫曼编码方法

9、的具体过程是:首先把信源的各个输出符号序列按概率递降的顺序排列起来,求其中概率最小的两个序列的概率之和,并把这个概率之和看作是一个符号序列的概率,再与其他序列依概率递降顺序排列(参与求概率之和的这两个序列不再出现在新的排列之中),然后,对参与概率求和的两个符号序列分别赋予二进制数字0和1。继续这样的操作,直到剩下一个以1为概率的符号序列。最后,按照与编码过程相反的顺序读出各个符号序列所对应的二进制数字组,就可分别得到各该符号序列的码字。 例如,某个离散无记忆信源的输出符号序列及其对应的概率分布为 对这些输出符号序列进行霍夫曼编码的具体步骤和结果如表。 由表中可以看出,在码字序列中码元0和1的概

10、率分别为10/21和11/21,二者近乎相等,实现了概率的均匀化。同时,由于码字序列长度满足克拉夫特不等式 22-2+32-3+22-41,因而码字是唯一可译的,不会在长的码字序列中出现划错码字的情况。 以上几个编码定理,在有记忆信源或连续信源的情形也有相应的类似结果。在实际工程应用中,往往并不追求无差错的信源编码和译码,而是事先规定一个译码差错率的容许值,只要实际的译码差错率不超过这个容许值即认为满意(见信息率-失真理论和多用户信源编码)。游程长度编码的主要思想是将一个相同值的连续申用其值和申长(重复的个数)的数对二元组来替代。例如,在图像编码中,可以定义沿特定方向上具有相同灰度值的相邻像素

11、为一轮,其延续的长度称之为延续的行程,即游程。游程终点位置由前一游程终点的相对距离确定,这样就可以由灰度游程串来表示图像数据。例如,若沿水平方向有一串M 个像素具有相同的灰度N,则按游程长度编码后,只传递两个值(N,M)就可以代替这M 个像素的M个灰度值NJ简单来说,游程长度编码的主要任务是统计连续相同字符的个数,解码时要根据字符及连续相同字符的个数,恢复原来的数据。3 编码的实现3.1 游程编码算法 编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号(连续符号构成了一段连续的“行程”。行程编码因此而得名),使符号长度少于原始数据的长度。只在各行或者各列数据的代码发生变化时,一次记录

12、该代码及相同代码重复的个数,从而实现数据的压缩。 在m元序列中,可能m种游程,连着出现m种符号ar的游程,其长度L(r)就是r游程长度,这是一个随机变量。用L(r)也可构成游程序列但是这种变换必须再加一些符号,才能成为一一对应或可逆的。 游程长度编码的主要思想是将一个相同值的连续申用其值和申长(重复的个数)的数对二元组来替代。例如,在图像编码中,可以定义沿特定方向上具有相同灰度值的相邻像素为一轮,其延续的长度称之为延续的行程,即游程。游程终点位置由前一游程终点的相对距离确定,这样就可以由灰度游程串来表示图像数据。例如,若沿水平方向有一串M 个像素具有相同的灰度N,则按游程长度编码后,只传递两个

13、值(N,M)就可以代替这M 个像素的M个灰度值NJ简单来说,游程长度编码的主要任务是统计连续相同字符的个数,解码时要根据字符及连续相同字符的个数,恢复原来的数据。3.2 游程编码特点 游程编码仍是变长码,有其固有的缺点,及需要大量的缓冲和优质的信道。此外,编程长度1可以从一直到无限,这在码字的选择和码表的建立方面都有困难,实际应用是尚需采用某些措施来改进。一般情况下游程长度越长,其概率越小,这在以前的计算中也可以看见,而且将随着长度的增大渐进向零。对于小概率的码字,其长度为达到概率匹配或较长,损失不会太大,也就是对平均码字长度影响较小。再按哈夫曼编码或其他方法处理以达到压缩码率的目的 。3.3

14、 数据压缩算法流程 用游程长度编码压缩数据时,首先要计算每次连续相同字符的个数,然后将每次连续相同的字符及个数保存起来。这种压缩数据的方法,连续相同的字符及出现连续相同的次数越多,压缩比就越大,反之,压缩比就越小。(1)打开源数据文件和压缩后的数据文件;(2)从源数据文件中读取字符,并把它放人一个寄存器中,然后再循环读取后面的字符,并与寄存器中的字符相比较。如果相等,则计数器加1,否则,把寄存器中的字符和计数器中数写入压缩数据文件中,然后再把寄存器中字符不相等的字符放入寄存器中,并把计数器置1。3、实验结果(1)对灰值度矩阵编码 计算方法:设图像的灰度级为M,一行的长度为N,则对每一行来说,游

15、程数最少为1,最多为N。若将数对表示为(gk,lk)的序列, 用普通二进制码存放(gk,lk)序列,并设一行中的游程数为,则描述一行像素的码字长度为:.而直接存储原图像一行所需的位数为。效率P=1-/(*C).(c为行数),因此矩阵中游程数越大,会使得压缩效率越高此处为负值因为其在一行内游程数过多,单个游程的长度过短.所以为负值.(2)压缩二值图像实验数据分析CR:压缩比image1:压缩前的数据image4:压缩后的数据rev2_image:复原后的图像rec_image:复原后的数据从结果可以看出来压缩比CR=16.7229,压缩前的数据长度要比压缩后的数据长度要短的多,说明了图像经过编码

16、后的所占大小也变大。将一行中颜色值相同的相邻像素用一个计数值和该颜色来代替,之后再对该颜色和计数值分别进行编码,所以它比较适合于对有较多灰度相同的图像进行编码.如果一幅图像是由很多块颜色相同的大面积区域组成,即其中相同灰度的值较多时,采用游程编码的压缩效率是惊人的。然而,该算法也导致了一个致命的弱点,如果图像中每两个相邻点的颜色都不同,用这种算法不但不能压缩,反而数据量会增加。2问题回答以及遇到的问题1、游程编码特点 游程编码仍是变长码,有其固有的缺点,及需要大量的缓冲和优质的信道。此外,编程长度1可以从一直到无限,这在码字的选择和码表的建立方面都有困难,实际应用是尚需采用某些措施来改进。一般

17、情况下游程长度越长,其概率越小,这在以前的计算中也可以看见,而且将随着长度的增大渐进向零。对于小概率的码字,其长度为达到概率匹配或较长,损失不会太大,也就是对平均码字长度影响较小。再按哈夫曼编码或其他方法处理以达到压缩码率的目的。4、项目感想 由于在之前上课的时候,自己没有好好去理解游程编码的原理,导致今次在编码的过程中出现很多问题,使得自己没法及时完成这一份报告。不过通过这一次项目中,我再次掌握了一种新的编码方式,并对编码有了进一步的了解。附录:1源程序(1)对灰值矩阵编码演示#includeiostream.h#includeiomanip.h#includestdlib.h#includ

18、evector#includealgorithm#includemath.husing namespace std;/用于存储码字及其编码结果struct data int mz; vector code;/用于存储每个码字及其个数struct rle int length; int mz;/用于求出编码的长度int get_gd(int n) int i=0; int j=n-1; while(j0) j=(j-j%2)/2; i+; return i;/用于构建码字void Creadmz(int hd,vector& vd,int hs) int w=0; int ws=get_gd(h

19、d); for(int i=0;i0) if(w % 2 = 1) d.code.push_back(1); else d.code.push_back(0); w=(w-w%2)/2.0; for(int m = d.code.size();m ws;m+) d.code.push_back(0); vd.push_back(d); /用于输出编码结果表明void print( vectorvd) for(int i=0;ivd.size();i+) coutvdi.mz=0;j-) coutvdi.codej; coutendl; /输出码及其个数的组合void print1( vecto

20、r re) for(int i=0;ire.size();i+) coutrei.mz,rei.length ; /输出编码结果template void print2(vector cd,int n) int num=0; for(int i=0;icd.size();i+) coutcdi; num+; if(num%n=0) coutendl; coutendl;/读入要编码的灰度矩阵bool read(vector &vr,int hd,int & cor,int &rows) int row,acr; rle re; cout请输入矩阵的行列数:row; cinacr; cor=ac

21、r; rows=row; cout请输入灰度值矩阵:endl; for(int i=0;in; if(n=hd)vr.clear(); return false; for(int j=1;jacr;) re.mz=n; re.length=0; while(n=re.mz&jn; if(n=hd)vr.clear(); return false; if(n!=re.mz) vr.push_back(re); if(j=acr) re.mz=n; re.length=1; vr.push_back(re); else if(j=acr) if(n=re.mz) re.length+; vr.pu

22、sh_back(re); else re.mz=n; re.length=1; vr.push_back(re); else vr.push_back(re); return true;/用于查找要编码的灰度值是否在灰度级范围内如果在反回相应码在编码序列中的位置int find(vector vd,int x) int low=0; int high=vd.size()-1; int mid=0; while(low=high) mid = (low + high)/2; if(vdmid.mz=x) return mid; else if(xvdmid.mz) high = mid-1; e

23、lse low = mid +1; coutthe element xnot find.endl; return -1;/对灰度矩阵进行编码操作成功则通过cd将其值代回void Encode(vector vr,vector vd,vector vh,vector &cd) int mc=0; int len=0; for(int i=0;i=0;j-) cd.push_back(vdmc.codej); else cout你要编码的元素不在灰度级范围内,编码失败.=0;k-) cd.push_back(vhlen.codek); void efficiency(int cl,int ml,i

24、nt col,int row) double ef; ef=1-(double)cl/(col*row*ml); cout此游程码的编码效率为:efendl;int main() int n=0; coutn; int cor,row; int j,k; int judge=0; int code_judge=0; vectorvd; vectorvh; vectorcd; vectorre; vector vc; vector vi; Creadmz(n,vd,0); cout灰度级编码结果:endl; print(vd); while(judge=0&!read(re,n,cor,row)

25、 cout你输入的中的灰度值不符合要求请输入0后重新输入,或输入1退出.judge; if(judge!=0) exit(0); j=get_gd(cor); k=get_gd(n); Creadmz(cor,vh,1); cout元素个数编码结果:endl; print(vh); Encode(re,vd,vh,cd); cout统计结果:; print1(re); coutendl; cout编码结果:endl; print2(cd,(j+k)*cor); efficiency(cd.size(),k,cor,row); return 0;(2)图像压缩% 载入原图像并转换为二值图像loa

26、d trees; image1=im2bw(X,map,0.4); figure,imshow(X,map); %显示原图像 title(载入matlab原有图像tree);figure,imshow(image1);title(转换得到的二值图像);X=image1(:); %令X为新建的二值图像的一维数据组x=1:1:length(X); % 编码之前的图像数据figure,plot(x,X(x);title(编码之前的图像数据);% 游程编码程序段 j=1; image4(1)=1;for z=1:1:(length(X)-1) if (X(z)=X(z+1) image4(j)=ima

27、ge4(j)+1;else data(j)=X(z); j=j+1;image4(j)=1;endenddata(j)=X(length(X); image1length=length(image1);image4length=length(image4); % 计算游程编码后的所占字节数y=1:1:image4length ; % 编码后数据信息figure,plot(y,image4(y);title(编码后的图像数据);CR=image4length/image1length; % 压缩比% 游程编码解压i=1; for m=1:image4length for n=1:1:image4(m); rec_image(i)=data(m); i=i+1; end end u=1:1:length(rec_image); % 解压后的图像数据 figure,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1