图像统计编码演示程序的设计_毕业设计论文.doc_第1页
图像统计编码演示程序的设计_毕业设计论文.doc_第2页
图像统计编码演示程序的设计_毕业设计论文.doc_第3页
图像统计编码演示程序的设计_毕业设计论文.doc_第4页
图像统计编码演示程序的设计_毕业设计论文.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业论文(设计) 题 目: 图像统计编码演示程序的设计 学 制: 4年 专 业: 通信工程 目 录摘要(1)关键词(1)1matlab简介(1)1.1matlab概述(1)1.2matlab在数字图像处理中的应用(2)2数字图像处理(3)2.1概述(3)2.2图像统计编码(3) 2.2.1霍夫曼编码(3) 2.2.2霍夫曼编码算法(4)3图像统计编码程序设计(5)3.1总体方案设计(5)3.1.1系统运行环境(5)3.1.2功能模块划分(5)3.1.3系统方框图(6)3.2各模块功能实现程序(7)4测试和调试(21)4.1霍夫曼编码实现效果(21)4.2算术编码的结果(23)6总结(25)参考文献(25)abstract(26)第 2 页 共 19 页键入文字图像统计编码演示程序的设计作 者:xxx指导老师:xxx摘要:数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人们服务。数字图像处理是一种通过计算机采用一定的算法对图形图像进行处理的技术。数字图像处理技术已经在各个领域上都有了比较广泛的应用。图像处理的信息量很大,对处理速度的要求也比较高。matlab强大的运算和图形展示功能,使图像处理变得更加的简单和直观。本文介绍了matlab 语言的特点,基于matlab的数字图像处理环境,介绍了如何利用matlab及其图像处理工具箱进行数字图像处理,并通过一些例子来说明利用matlab图像处理工具箱进行图像处理的方法。主要论述了利用matlab实现图像编码等图像处理。关键词:matlab;数字图像处理;图像统计编码;霍夫曼编码1 matlab简介1.1 matlab概述matlab 是matrix laboratory(“矩阵实验室”)的缩写,是由美国mathworks 公司开发的集数值计算、符号计算和图形可视化三大基本功能于一体的,功能强大、操作简单的语言。是国际公认的优秀数学应用软件之一。matlab的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用matlab来解算问题要比用c,fortran等语言完相同的事情简捷得多。matlab包括拥有数百个内部函数的主包和三十几种工具包(toolbox).工具包又可以分为功能性工具包和学科工具包.功能工具包用来扩充matlab的符号计算,可视化建模仿真,文字处理及实时控制等功能.学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类.开放性使matlab广受用户欢迎.除内部函数外,所有matlab主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包.1.2 matlab在数字图像处理中的应用图像处理工具包是由一系列支持图像处理操作的函数组成的。所支持的图像处理操作有:图像的几何操作、邻域和区域操作、图像变换、图像恢复与增强、线性滤波和滤波器设计、变换(dct变换等) 、图像分析和统计、二值图像操作等。下面就matlab 在图像处理中各方面的应用分别进行介绍。 (1) 图像文件格式的读写和显示。matlab 提供了图像文件读入函数 imread(),用来读取如:bmp、tif、tiffpcx 、jpg 、gpeg 、hdf、xwd等格式图像文;图像写出函数 imwrite() ,还有图像显示函数 image()、imshow()等等。 (2) 图像处理的基本运算。matlab 提供了图像的和、差等线性运算 ,以及卷积、相关、滤波等非线性算。例如,conv2(i,j)实现了i,j两幅图像的卷积。(3) 图像变换。matlab 提供了一维和二维离散傅立叶变换(dft) 、快速傅立叶变换(fft) 、离散余弦变换 (dct) 及其反变换函数,以及连续小波变换(cwt)、离散小波变换(dwt)及其反变换。(4) 图像的分析和增强。针对图像的统计计算matlab 提供了校正、直方图均衡、中值滤波、对比度调整、自适应滤波等对图像进行的处理。(5) 图像的数学形态学处理。针对二值图像,matlab 提供了数学形态学运算函数;腐蚀(erode)、膨胀(dilate)算子,以及在此基础上的开 (open)、闭(close)算子、厚化 (thicken) 、薄化 (thin) 算子等丰富的数学形态学运算。以上所提到的 matlab在图像中的应用都是由相应的matlab函数来实现的,使用时,只需按照函数的调用语法正确输入参数即可。具体的用法可参考matlab丰富的帮助文档。图像边缘对图像识别和计算机分析十分有用,在matlab中,函数 edge()用于灰度图像边缘的提取,它支持六种不同的边缘提取方法,即sobel方法、prewitt 方法、robert 方法,laplacian2gaussian方法、过零点方法和canny方法。2 数字图像处理2.1概述图像处理就是对图像信息进行加工处理,以满足人得视觉心理和实际应用的需求。图像处理可以应用光学方法、电子学方法,从60年代开始,随着计算机技术的发展,数字图像处理获得了飞跃的发展。所谓数字图像处理,就是利用数字计算机或其他高速、大规模集成数字硬件,对从图像信息转换来的数字电信号进行某些数字运算或处理,一起提高图像质量或达到人们要求的某些与预期的结果。如对被噪声污染的图像去除噪声;对信息微弱的图像进行增强处理;对失真的图像进行几何校正;从遥感图片中辨别农作物、森林、琥珀和军用设施等等。应用计算机处理图像精度高,改变软件即可变换处理方法,灵活方便。但由于计算机是顺序处理技术,因此对信息量较大的图像,运算处理速度不如光学方法快。2.2图像统计编码统计编码又称熵编码,他建立在图像统计特征基础之上的数据压缩方法。根据香农的观点,信息冗余来自信息源数据本身的相关性和信源内事件的概率分布不均,只要找到去除相关性和改变概率分布不均的方法,也就找到了信源数据的统计编码方法。熵编码即编码过程中按熵原理不丢失任何信息的编码。信息熵为信源的平均信息量(不确定性的度量)。常见的熵编码有:lzw编码、香农(shannon)编码、霍夫曼(huffman)编码和算术编码(arithmetic coding)。2.2.1霍夫曼编码 霍弗曼编码完全依据信源字符出现的概率来构造其码字,对出现概率大的字符使用较短的码字,面对出现概率低的字符使用较长的码字,从而达到压缩数据的目的。霍夫曼编码有时有称为最佳编码(一般直接称为霍夫曼编码),最初主要用于文本文件压缩。霍夫曼编码是一种变长编码(vlc),同时也是一种无失真编码。在具有相同信源概率分布的前提下,他的平均码字长度比其他任何一种有效编码方法都短。2.2.2霍夫曼编码算法霍夫曼编码是以信源字符的概率分布为基础的,若理论上并不知道信源字符的概率分布,那么可以根据对大量数据进行统计所得到的统计分布来近似代替。以统计数据代替实际概率分布,可能会导致实际应用时霍夫曼编码无法达到最佳编码效果,应用中可以根据输入数据序列自适应的匹配信源概率分布的方法,这样能在一定程度上能改进霍夫曼编码的性能。香农编码也是一种典型的可变字长编码。与霍夫曼编码相似,当信源符号出现的概率正好为2的负幂次方时,香农编码的编码效率可以达到100%从理论上分析,采用霍夫曼编码可以获得最佳信源字符编码效果,但实际应用中,由于信源字符出现的概率并非满足2的负幂次方,因此往往无法达到理论上的编码效率和信息压缩比。为了提高编码效率,elias等人提出了算术编码算法。算术编码是信息保持型编码,他不像霍夫曼码,无需为一个符号设定一个码字。算术编码可以分为固定方式编码和自适应方式编码两种。选择不同的编码方式,将直接影响到编码效率。自适应算术编码的方式,无需先定义概率模型,适合于无法知道信源字符概率分布的情况。这也是算术编码优于霍夫曼编码的地方之一。同时,当信源字符出现的概率比较接近时,算术编码效率高于霍夫曼编码的效率,在图像通信中常用它来取代霍夫曼编码。不足之处是实现算术编码算法的硬件比霍夫曼编码复杂。3 图像统计编码程序设计3.1总体方案设计3.1.1系统运行的环境windows xp、matlab7.03.1.2功能模块的划分huffman编码中:主程序调用huffencode函数对输入矩阵vector进行huffman编码,返回编码后的向量(压缩后数据)及相关信息;再调用huffdecode函数对输入矩阵vector进行huffman解码,返回解压后的图像数据;调用addnode函数添加节点;调用frequency函数计算各符号出现的概率;调用decode函数返回码字对应的符号。huffman编码的步骤: l)将信号源的符号按照出现概率递减的顺序排列。 2)将两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。 3)重复进行步骤1和2直到概率相加的结果等于1为止。 4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。 5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。算术编码中: 主程序调用arithencode函数对symbol进行算术编码; 再调用arithdecode对算术编码进行解码。算术编码不是将单个信源符号映射成一个码字,而是把整个信源表示为实数线上的0到1之间的一个区间,其长度等于该序列的概率。再在该区间选择一个代表性的小数,转化成二进制作为实际的编码输出。消息序列中的每个元素都要缩短为一个区间。消息序列中元素越多,所得到的区间就越小。当区间变小时,就需要更多的数位来表示这个区间。采用算术编码,每个符号的平均编码长度可以为小数。3.1.3系统方框图 huffman编码: 开始加载图像将图像转换成无符号的8位整数调用huffman编码程 序进行压缩调用huffman解码程 序进行解码结束子程序:函数调用显示图像,原始图像和经编码解码后的图像显示压缩比算术编码: 3.2各功能模块的主要实现程序3.2.1用matlab程序实现huffman编码clearx = imread(rice.tif); %从mat文件下载到工作空间data = uint8(x); %将该图片定义为无符号8为整数zipped, info =huffencode(data); %调用huffman编码程序进行压缩unzipped = huffdecode(zipped, info); %调用huffman解码程序进行解码subplot(121);imshow(data); %显示原图像subplot(122);imshow(unzipped); %显示经编码、解码后的图像erms = compare(data( :),unzipped( :) %计算两幅图,得均方根误差cr = info.ratiowhos data unzipped zippedfunction zipped, info = huffencode(vector) %函数声明,huffencode对输入矩阵vector进行huffman编码 %输入和输出都是uint8格式ifisa(vector, uint8) %若矩阵vector是给定类时,为真 error(input argument must be a uint8 vector); %跳出函数并显示信息endm ,n = size(vector); %检查矩阵的阶数vector = vector( :); %将矩阵按列排列f = frequency(vector); %计算各符号出现的概率symbols = find(f=0); %查找概率不为零符号的下标f = f(symbols);f, sortindex = sort(f); %将符号按照出现的概率大小排列symbols = symbols(sortindex);len = length(symbols); %求矩阵的长度symbols_index = num2cell(1: len); %把数字数组变换为单元阵列codeword_tmp = cell(len, 1);while length(f)1 %生成huffman树,得到码字编码表 index1 = symbols_index1; index2 = symbols_index2; 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); symbols_index = index1,index2 symbols_index(3:end); f, sortindex = sort(f); %将各符号的概率列向重新排列 symbols_index = symbols_index(sortindex);endcodeword = cell(256,1); %建立单元阵列codeword(symbols) = codeword_tmp;len = 0;for index = 1:length(vector) %得到整个图像所有比特数 len = len + length(codeworddouble(vector(index) +1);endstring = repmat(uint8(0),1,len);pointer = 1;for index = 1:length(vector) %对输入图像所有比特数 code = codeworddouble(vector(index) +1; len = length(code); string(pointer+(0:len-1) = code; pointer = pointer + len;endlen = length(string);pad = 8-mod(len, 8); %非8整数倍时,最后补pad个零if pad0 string = string uint8(zeros(1,pad);endcodeword = codeword(symbols); codelen = zeros(size(codeword);weights = 2.(0:23);maxcodelen = 0;for index = 1:length(codeword) len = length(codewordindex); if lenmaxcodelen maxcodelen = len; end if len0 code = sum(weights(codewordindex =1); code = bitset(code,len+1); codewordindex = code; codelen(index) = len; endendcodeword = codeword:; %计算压缩后的向量 cols = length(string)/8; %将字符串的长度除以8,得到列数string = reshape(string,8,cols); %对这个字符串阶数重组,8行,cols列weights = 2.(0:7);zipped = uint8(weights*double(string);huffcodes = sparse(1,1); %码表存储到一个稀疏矩阵for index = 1:nnz(codeword) %length(codeword),numel(codeword) huffcodes(codeword(index),1) = symbols(index);end %填写解码时所需的结构信息info.pad = pad; %添加的比特数info.huffcodes = huffcodes; %产生huffman码字info.ration = cols./length(vector); %显示原始图像的列数除以矩阵长度的值info.length = length(vector); %显示原始图像数据长度info.maxcodelen = maxcodelen; %显示最大码长info.rows = m; %显示原始图像的行数info.cols = n; %显示原始图像的列数function vector = huffdecode(zipped,info,image) %huffdecode函数对输入矩阵vector进行 huffman解码,返回解压后的图像数据ifisa(zipped,uint8) error(input argument must be a uint8 vector);endlen = length(zipped); %产生0、1序列,每位占一个字节string = repmat(uint8(0),1,len.*8);bitindex = 1:8;for index = 1:len string(bitindex+8.*(index-1) = uint8(bitget(zipped(index),bitindex);endstring = logical(string(:);len = length(string);string(len-info.pad+1):end)=;len = length(string);weights = 2.(0:51); %开始解码vector = repmat(uint8(0),1,info.length);vectorindex = 1;codeindex = 1;code = 0;for index = 1:len code = bitset(code,codeindex,string(index); codeindex = codeindex+1; byte = decode(bitset(code,codeindex),info); if byte0 vector(vectorindex) = byte-1; codeindex = 1; code = 0; vectorindex = vectorindex+1; endendvector = reshape(vector,info.rows,info.cols);function codeword_new = addnode(codeword_old,item) %函数addnode添加节点codeword_new = cell(size(codeword_old);for index = 1:length(codeword_old) codeword_newindex = item codeword_oldindex;endfunction f=frequency(vector) %函数frequency计算各符号出现的概率ifisa(vector,uint8) error(input rgument must be a uint8 vector);endf =repmat(0,1,256);len = length(vector);for index = 0:255 f(index+1) = sum(vector =uint8(index);endf = f./len;function byte = decode(code, info) %函数decode返回码字对应的符号byte = info.huffcodes(code);3.2.3算术编码的matlab实现clear all;format long e; %设置输出格式symbol = abcd; %将信源符号定义为符号函数,四个信源符号分别为a、b、c、dps = 0.1 0.4 0.2 0.3; %四个信源符号出现的概率inseq = (cadacdb); %设定某一消息序列codeword = arithencode(symbol,ps,inseq)outseq = arithdecode(symbol,ps,codeword,length(inseq)function acode = arithencode(symbol,ps,inseq) %函数arithencode对symbol进行算术编码high_range = ; %定义high_rangefor k = 1:length(ps)high_range = high_range sum(ps(1:k);endlow_range = 0 high_range(1:length(ps)-1);sbidx = zeros(size(inseq);for i= 1:length(inseq) sbidx(i) = find(symbol = inseq(i);endlow = 0;high = 1;for i=1:length(inseq); range = high-low;high = low+range*high_range(sbidx(i);low = low+range*low_range(sbidx(i);endacode = low;function symbos = arithdecode(symbol,ps,codeword,symlen) %函数arithdecode对算术编码进行解码format long e;high_range = ;for k = 1:length(ps) high_range = high_range sum(ps(1:k);endlow_range = 0 high_range(1:length(ps)-1);psmin = min(ps);symbos = ;for i= 1:symlen idx = max(find(low_range=codeword);codeword = codeword-low_range(idx); if abs(codeword-ps(idx)0.01*psmin idx = idx+1; codeword = 0;end symbos = symbos symbol(idx); codeword = codeword/ps(idx); if abs(codeword)0.01*psmin i=symlen+1; endend4 测试和调试4.1 huffman编码实现的效果另外对“woman”进行上述实验的效果图:对“pout.tif”进行上述实验的效果图:对“ westconcordorthophoto.png”进行上述实验的效果图:4.2 算数编码的结果codeword = 5.143876000000001e-001outseq =cadacdb对算数编码的又一次的调试:clear all;format long e; %设置输出格式symbol = abcdef; %将信源符号定义为符号函数, 四个信源符号分别为a、b、c、d、e、fps = 0.1 0.2 0.3 0.05 0.15 0.2; %六个符号出现的概率inseq = (aefcdbcc); %设定某一消息序列codeword = arithencode(symbol,ps,inseq)outseq = arithdecode(symbol,ps,codeword,length(inseq)function acode = arithencode(symbol,ps,inseq) %函数arithencode对symbol进行算术编码high_range = ; %定义high_rangefor k = 1:length(ps)high_range = high_range sum(ps(1:k);endlow_range = 0 high_range(1:length(ps)-1);sbidx = zeros(size(inseq);for i= 1:length(inseq) sbidx(i) = find(symbol = inseq(i);endlow = 0;high = 1;for i=1:length(inseq); range = high-low;high = low+range*high_range(sbidx(i);low = low+range*low_range(sbidx(i);endacode = low;function symbos = arithdecode(symbol,ps,codeword,symlen) %函数arithdecode对算术编码进行解码format long e;high_range = ;for k = 1:length(ps) high_range = high_range sum(ps(1:k);endlow_range = 0 high_range(1:length(ps)-1);psmin = min(ps);symbos = ;for i= 1:symlen idx = max(find(low_range=codeword);codeword = codeword-low_range(idx); if abs(codeword-ps(idx)0.01*psmin idx = idx+1; codeword = 0;end symbos = symbos symbol(idx); codeword = codeword/ps(idx); if abs(codeword)0.01*psmin i=symlen+1; endend结果:codeword = 7.844801000000001e-002outseq =aefcdbcc总结这次的课程设计,让我对单matlab的理论有了更加深入的了解,同时在具体的制作过程中,我们发现现在书本上的知识与实际的应用存在着不小的差距。这次实践使我更深刻的体会到了理论联系实际的重要性,我们在今后的学习工作中会更加的注重实践。本文主要介绍了数字图像统计编码的方法以及matlab语言的特点,基于matlab的数字图像处理环境,介绍了如何利用matlab及其数字图像统计编码的方法,并利用matlab来实现数字图像统计编码。参考文献1徐明远,刘增力,matlab仿真在信号处理中的应用,西安电子科技大学出版社,2007.112于万波,基于matlab的图像处理,清华大学出版社,2008.33飞思科技产品研发中心,matlab6.5辅助图像处理,电子工业出版社,2003.14章毓晋,图像处理与分析,北京清华大学出版社 2004.75张志涌,精通matlab6.5, 北京北航电子版,2002.126孙家广,杨长贵.,计算机图形学, 清华大学出版社,1995.57闫敬文,数字图像处理matlab版,国防工业出版社,2007.28陈杨,陈荣娟,matlab6.x图像编程与图像处理,西安电子科技大学出版社,2002.109周新伦,柳建,数字图像处理,国防工业出版社,1986.310李信真,车明刚,计算方法,西安西北工业大学出版社,2000.811陈桂明,张明照,应用matlab语言处理信号与数字图像,科学出版社,2000.5the statistic image coding demonstration programauthor : chen r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论