为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于JPEG2000小波变换原理在图像压缩中的应用--毕业论文

2017-09-29 50页 doc 738KB 33阅读

用户头像

is_686908

暂无简介

举报
基于JPEG2000小波变换原理在图像压缩中的应用--毕业论文基于JPEG2000小波变换原理在图像压缩中的应用--毕业论文 摘要 JPEG2000是新一代静止图像压缩国际标准,具有优越的图像压缩性能和较高的图像质量,不仅克服了传统JPEG静止图像压缩标准在高压缩时出现方块效应的缺点,还提供了图像渐进传输、图像质量可伸缩及感兴趣区域编码等特性,可以应用于数码相机、医疗图像、数字图书馆、网络传输等方面。JPEG2000的这些特性主要来源于小波变换、基于优化截断的嵌入式块编码(EBCOT)技术。 本文将首先介绍一下图像压缩的原理和JPEG2000的功能特点,其中将阐述小波变换原理在图像...
基于JPEG2000小波变换原理在图像压缩中的应用--毕业论文
基于JPEG2000小波变换原理在图像压缩中的应用--毕业论文 摘要 JPEG2000是新一代静止图像压缩国际,具有优越的图像压缩性能和较高的图像质量,不仅克服了传统JPEG静止图像压缩标准在高压缩时出现方块效应的缺点,还提供了图像渐进传输、图像质量可伸缩及感兴趣区域编码等特性,可以应用于数码相机、医疗图像、数字图书馆、网络传输等方面。JPEG2000的这些特性主要来源于小波变换、基于优化截断的嵌入式块编码(EBCOT)技术。 本文将首先介绍一下图像压缩的原理和JPEG2000的功能特点,其中将阐述小波变换原理在图像压缩中的应用,从而在此基础上重点分析和研究JPEG2000的核心内容——优化截取的嵌入式块编码(EBCOT)算法。最后使用VC++实现这一算法,从理论上和实践上验证其功能和特性。 关键字:图像压缩;JPEG2000;小波变换;EBCOT I Abstract JPEG2000 is the lasted generation of international still image compression standard.With excellent image compression performance and superior image quality,it not only addresses a number of weaknesses in the exiting JEPG standard,such as block effect, but also provides several features like image progressive transmission by pixel accuracy and resolution, scalable image quality,lossless/loss compression, region of interest coding,etc.Due to the excellent coding performance and attractive features,JPEG2000 has a large rang of applications such as digital camera, medical imaging, digital library, network transferring and so on. he paper introduced the theory of still image compression and the function and T the characteristics of standard of JPEG2000.The application of wavelet transform is related. And the point of the paper is the analysis and studies of the central content of standard of JPEG2000—EBCOT.It carry out EBCOT by the fact that the VC++ programming. Key words:Image compression;JPEG2000;Wavelet transform;EBCOT II 目录 前言 ............................................................................................................................1 1 绪论 ..........................................................................................................................2 1.1 问题的定义 .......................................................................................................2 1.2 图像数据压缩的发展.....................................................................................2 1.3 图像压缩的原理 ..............................................................................................4 1.4 基于小波变换的图像压缩方法 ..................................................................5 1.4.1 EZW编码方法 ...............................................................................................5 1.4.2 SPIHT编码方法.............................................................................................8 2 可行性分析 ..........................................................................................................12 2.1技术可行性 ......................................................................................................12 2.1.1 MFC..................................................................................................................12 2.1.2 API ....................................................................................................................13 2.2 经济可行性 .....................................................................................................15 2.2.1 设计成本........................................................................................................15 2.2.2 收益 .................................................................................................................15 2.3 用户操作可行性 ............................................................................................15 2.4 法律可行性 .....................................................................................................16 2.5 结论 ...................................................................................................................16 3 需求分析...............................................................................................................17 3.1 总体设计目标.................................................................................................17 3.2 图像标准 ..........................................................................................................17 3.2.1 JPEG.................................................................................................................17 3.2.2 JPEG2000标准 .............................................................................................19 3.3 EBCOT算法...................................................................................................24 3.3.1 编码块 ............................................................................................................25 3.3.2 位平面的编码通道 .....................................................................................27 3.3.3 EBCOT算法的优点....................................................................................30 3.4 小波变换 ..........................................................................................................32 3.4.1 小波变换在图像编码中的应用..............................................................34 3.4.2 小波变换的多分辨率分析 ....................................................... 35 3.4.3 小波提升算法 ..............................................................................................36 4 总体设计...............................................................................................................40 4.1 接口设计 ..........................................................................................................40 4.2 输入输出设计.................................................................................................40 5 详细设计...............................................................................................................41 5.1 程序逻辑设计.................................................................................................41 5.2 模块设计 ..........................................................................................................42 5.3 用户界面设计.................................................................................................43 6 编码 ........................................................................................................................45 6.1 设计使用的语言工具...................................................................................45 6.2 开发环境 ..........................................................................................................46 6.3 核心编码 ..........................................................................................................46 6.3.1 图像显示代码 ..............................................................................................46 6.3.2 小波变换代码 ..............................................................................................48 7 测试 ........................................................................................................................51 7.1 测试及测试方式概述 .........................................................................51 7.2 系统测试的用例及结果 ..............................................................................53 7.3 软件测试结论.................................................................................................56 8 结论 ........................................................................................................................57 致谢.............................................................................................................................58 参考文献 ...................................................................................................................59 附录A .........................................................................................................................60 附录B .........................................................................................................................67 附录C .........................................................................................................................77 辽宁工程技术大学毕业设计(论文) 前言 图像压缩的主要工作就是要减少表示数字图像时需要的数据量,由于数字图像的数据量非常巨大,若不经过压缩,数字图像所需的高速传输速率和所需的存储容量将阻碍数字图像的发展,所以图像压缩应运而生,而在压缩的过程中除了要求图像有一定的保真度以外,实时性也是非常重要的,这就要求在完成图像压缩时,要在确保不失真的前提下,提高速率。如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。在研究和充分了解图像压缩算法之后才能改善算法提高速率。 1 刘爽:基于EBCOT图像压缩编码算法的研究 1 绪论 1.1 问题的定义 随着信息量变得越来越大,越来越多样化,人们对信息的传输速率和保真程度也有了越来越高的要求。研究表明,在人类的感官所接受的所有外部信息中有60%以上是通过视觉接收到的,图像作为视觉的基础,自然成为了信息最常见和最直观的表现形式,为了有效的存储和传输图像信息,图像压缩成为图形处理中不可或缺的分支,也日益凸显它重要的意义。 一幅数字图像中通常含有大量的数据信息,例如,一页A4大小的文档,用分辨率为300dpi的扫描仪进行扫描,则扫描图像大小约为IMB,若不经过压缩,要在9600波特的电话线上传输15分钟:一副640480像素的彩色图像,每个像素用24bit表示,则大约需要0.87MB的存储空间,用12um的分辨率扫描一片35mm的电影胶片,得到的数字图像大小为3656像素2664线,每个像素用24bit表示,则大约需要29MB的空间。一张存储空间为600MB的CD盘满额使用时,如果图像不经过压缩,那么它可以存储600页文档扫描得到的图片,或者21副35mm的电影胶片的彩色扫描图片,或者30秒左右20MB的PAL制式视 [1]频图像。因此,必需对图像数据进行压缩编码,否则会给图像的存储和传送带来巨大的资源浪费。所以研究图像压缩的算法对于提高图像压缩的速度和质量有着至关重要的意义。 1.2 图像数据压缩的发展 在1843年出现的莫尔斯(Morse)电报码是最原始的变长码数据压缩实例。有关图像数据压缩的理论研究,还是在香农(C.E.Shannno)信息论基础上开始的。1948香农的经典论文“通信的数学原理” 中首次提到信息率-失真函数概念,1959年他又进一步建立了率失真理论,从而奠定了信源编码的理论基础。80年代初开始对作运动补偿(MC)所用的运动估值(ME)进行研究。变换编码是1968年H.CAndrews等人提出的,采用的是二维离散傅里叶变换。此后,相继出现了沃 2 辽宁工程技术大学毕业设计(论文) 尔什--哈达玛(Wa1Sh-Hadmaaard)变换、斜变换、K-L变换、离散余弦变换(DCT)等。对模型编码的研究始于80年代初,于1988年形成草案,1990年通过的ITU-TH.261建议,是图像编码技术走向实用化的重要一步。它是图像编码40年研究成果的结晶。 常用图片格式介绍总的来说,有两种截然不同的图像格式类型: 即有损压缩和无损压缩。 (1)所谓无损压缩格式,是利用数据的统计冗余进行压缩,可完全回复原始数据而不引起任何失真,但压缩率是受到数据统计冗余度的理论限制,一般为2:1到5:1,这类方法广泛用于文本数据,程序和特殊应用场合的图像数据(如指纹图像,医学图像等)的压缩。 由于压缩比的限制,仅使用无损压缩方法是不可能解决图像的存储和传输的所有问题.经常使用的无损压缩方法有 Shannon-Fano 编码,Huffman 编码,游程(Run-length)编码,LZW(Lempel-Ziv-Welch)编码和算术编码等。 无损压缩的基本原理是相同的颜色信息只需保存一次。压缩图像的软件首先会确定图像中哪些区域是相同的,哪些是不同的。包括了重复数据的图像(如蓝天)就可以被压缩,只有蓝天的起始点和终结点需要被记录下来。但是蓝色可能还会有不同的深浅,天空有时也可能被树木、山峰或其他的对象掩盖,这些就需要另外记录。从本质上看,无损压缩的方法可以删除一些重复数据,大大减少要在磁盘上保存的图像尺寸。但是,无损压缩的方法并不能减少图像的内存占用量,这是因为,当从磁盘上读取图像时,软件又会把丢失的像素用适当的颜色信息填充进来。如果要减少图像占用内存的容量,就必须使用有损压缩方法。无损压缩方法的优点是能够比较好地保存图像的质量,但是相对来说这种方法的压缩率比较低。 (2)有损压缩 所谓有损压缩是利用了人类对图像或声波中的某些频率成分不敏感的特性,允许压缩过程中损失一定的信息;虽然不能完全回复原始数据,但是所损失的部分对理解原始图像的影响缩小,却换来了大得多的压缩比。有两种基本的有损压缩机制: 一种是有损变换编解码,首先对图像或者声音进行采样、切成小块、 [2]变换到一个新的空间、量化,然后对量化值进行熵编码。 3 刘爽:基于EBCOT图像压缩编码算法的研究 另外一种是预测编解码,先前的数据以及随后解码数据用来预测当前的声音采样或者图像帧,预测数据与实际数据之间的误差以及其它一些重现预测的信息进行量化与编码。有些系统中同时使用这两种技术,变换编解码用于压缩预测步骤产生的误差信号。 有损压缩图像的特点是保持颜色的逐渐变化,删除图像中颜色的突然变化。生物学中的大量实验证明,人类大脑会利用与附近最接近的颜色来填补所丢失的颜色。例如,对于蓝色天空背景上的一朵白云,有损压缩的方法就是删除图像中景物边缘的某些颜色部分。当在屏幕上看这幅图时,大脑会利用在景物上看到的颜色填补所丢失的颜色部分。利用有损压缩技术,某些数据被有意地删除了,而被取消的数据也不再恢复。利用有损压缩技术可以大大地压缩文件的数据,但是会影响图像质量。如果使用了有损压缩的图像仅在屏幕上显示,可能对图像质量影响不太大,至少对于人类眼睛的识别程度来说区别不大。可是,如果要把一幅经过有损压缩技术处理的图像用高分辨率打印机打印出来,那么图像质量就会有明显的受损痕迹。 1.3 图像压缩的原理 图像压缩就是保证一定的图像质量的前提下,以尽可能少的比特数表征图像,使它符合预定应用场合的要求,压缩数据量,提高有效性是图像压缩编码的首要目的。图像数据可以进行压缩主要有三大方面的原因: (1)原始图像数据是高度相关的,存在很大的冗余度。大多数图像内相邻像素之间有较大的相关性(称之为空间冗余度),多光谱遥感图像各谱之间也有相关性(称之为频率域冗余度),这种数据的冗余度造成比特数的浪费,消除这些冗余度就可以节约码字,从而达到图像数据压缩的目的。 (2)若用相同的码长来表示不同出现概率的符号也会造成比特数的浪费(即存在符号冗余度),而若采用可变长编码技术,就可消除符号冗余度,从而节约码字,达到数据压缩目的。 (3)人眼的视觉特性允许图像编码存在一定的失真(即存在视觉冗余度)。这是因为人眼往往是图像通信系统的最终接收者,在许多应用场合,人们并不要求恢复图像与原始图像完全相同,而是允许恢复图像存在一定的失真,只要这种 4 辽宁工程技术大学毕业设计(论文) 失真不被人的眼睛所察觉,或者是在人的视觉所允许的失真范围之内,这无疑为图像编码提高压缩比提供了十分有利的条件。 1.4 基于小波变换的图像压缩方法 1.4.1 EZW编码方法 小波变换具有频率压缩待性、空间压缩持性和系数分布相似性,此外,随着 [3]尺度的递减,小波系数的幅值也大体上呈减少的趋势。因此下述假定在很大的概率下是成立的,即如果上一级的小波系数小于某阈值,则下一级同一方向上相同位置的小波系数也会小于该阈值。EZW算法定义POS、NEG、ZI、ZTR四个零树符号来充分利用上述性质对幅值进行预测并编码,即在阈值的意义下(隐含的量化),用上一级的小波系数预测了下一级的小波系数,这类似于JPEG的游程编码中对于量化后的零值采用的块终止符EOB。一个图像的嵌入式编码实质上与一个实数的二进制编码类似,它是一个二进制的判断,它以“零”或“全灰”图像区分处一个图像。嵌入式编码把一个图像变成一个比特流,与实数的二进制表示类似,这些比特是按其重要性进行排序的。这样,嵌入式编码者可以在任何时刻结束并且提供图像“最好”的表示。嵌入式编码有如下特色: (1)离散小波变换提供了图像一个紧凑的多分辨率描述。 (2)零树编码提供了“重要图”的一个紧凑多分辨表示,这种“重要图”是指出了重要系数位置的二进制图。在各个层次上,零树成功地预测了非重要系数,从而有效描述为指数生长树的部分。 (3)逐次逼近提供了重要系数紧凑的多重精密的表示,并使嵌入编码简化。 (4)优先,由系数的重要性排序。 (5)合适的多水平算术编码,它为符号串的熵编码提供了快速算法,而并不要求预先存储的表格。 (6)当达到一个大的比特率或失真目标时,算法可继续运行或停止。对于给定的比特率,方法可精确达到。 如图1-1,一个幅度值由大到小排序后的变换系数的二进制列表。表中每一列代表一个变换系数的二进制表示,每一行代表一层位平面,最上层为符号位, 5 刘爽:基于EBCOT图像压缩编码算法的研究 越高层的位平面的信息权重越大,对于编码也越重要。编码的次序是从最重要的位到最不重要的位逐个编码,直到达到所需码率为止。EZW编码的输出信息主要包括两部分:排序信息和重要象素的位信息。其中,位信息是编码必不可少的有效信息,对应于表中箭头所划过的比特位,而排序信息则是辅助的信息按其所有的重要性从左到右排列,反映了重要象素在原图上的空间位置。 图1-1按幅度排序信息的二进制表示 Fig.1-1 According to scope sorting information binary expression 图1-2给出了图像经过三级小波分解后的子带构成示意图。图1-3图像小波分解的原图和3级小波变换后的图。小波系数的分布特点是越往低频子带系数值越大,包含图像信息越多,越往高频子带系数值越小,包含图像信息越少。EZW算法充分利用了小波变换后系数分布特点,先传输较低频的系数的重要比特,后 传输较高频系数的重要比特。 图1-2三级小波分解 Fig.1-2 Third-level wavelet decomposition 6 辽宁工程技术大学毕业设计(论文) 图1-3小波分解的原图和3级小波变换后的图 Fig.1-3 wavelet decomposition original map and 3 level of wavelet transformation chart (1)零树结构的定义 任选一个小波变换后的图像系数,对于给定门限T,如果有>T则称小波系数是重要系数,反之定义为不重要系数。如果一个小波系数在一个粗的尺度上关于给定门限T不重要,在较细的尺度上与该系数对应的同样空间位置中的所有小波系数关于门限T也不重要,则这些小波系数形成了一个零树,并粗尺度上的小波系数为父系数或零树根,较细尺度上相应位置上的小波系数为子系数。 (2)对零树的预测 首先对图像进行小波变换,并规定对零树的搜索从最低频子带开始,在最低频子带中找到的每个零树根都有三个孩子分别位于三个次低频子带的相应位置,其余子带(最高频子带除外)的结点都有四个孩子位于高一级子带的相应位置。 (3)生成零树结构下的重要系数图 规定对于给定的T,如果小波系数气和它的所有子孙都小于T,则称该点为零树根;如果小于T,但其子孙中至少有一个大于或等于T的系数,则该点就称为孤立零。在某一给定阈值下,搜索所有图像系数,找到该阈值上的全部重要系数、零树及孤立零,当编码到最高分辨率层的系数时,由于它们没有子孙,不存在零树根,因此仅搜索重要系数即可。 (4)逐次逼近量化(SAQ,Sueeessive Approximation Quantization) SAQ的核心思想是按从大到小的顺序建立一系列阈值,,,, 7 刘爽:基于EBCOT图像压缩编码算法的研究 并规定阈值的选取应满足>>,其中为小波图像中的最大系数。按照阈值递减的顺序搜索重要系数并输出其位置与幅值的编码信息。 EZW算法是一种简单,高效的图像编码算法,它不要求图像的先验知识,也不要求大的内存容量,并且采用了嵌入的方式,压缩效果也比较理想,而且允许用户自己的需要设定压编比,是一个具有很大潜力的编码算法。EZW具有以上的优点是因为采用了四个新技术:离散小波变换,零树编码,渐进量化和自适应算术编码。离散小波变换有效地消除了原始图像像素间的相关性,使大多数系数可以作为按指数增长的零树的一部分被有效地编码;零树编码通过跨尺度预测不重要系数,获得了巨大的编码增益,远远超过了针对重要图的一阶熵编码;渐进量化通过对多级重要图采用零树编码,可使编码和解码在不同的位率下随时停止;自适应算术编码进一步消除了比特流自身的冗余。虽然EZW算法有以上优点,但它还存在的问题是: (1)由于编码时形成多棵零树,因而要多次扫描图像造成效率很低,耗时长,而且每一棵树必须在前一棵树形成之后才能形成,所以也很难用并行算法优化。 2)对所有的频域进行等同重要度的编码,不能充分利用小波变换的特点。 ( (3)在一棵零树中包含的元素越多,则越有利于数据压缩,在EZW算法中存在这样的树间冗余。 (4)在同一子带中相邻元素间有一定的相关性,尤其在高频子带存在大量的低值元素,而EZW算法并没有充分利用这种相关性。 1.4.2 SPIHT编码方法 SPIHT算法的核心思想在于,任何基于比较的算法的执行路径都被分支点的比较结果隐含地定义了。其目的是针对解决EZW算法中明显的把小波系数的零树符号编码过程与算术编码过程分成两个部分进行改进。SPIHT算法的改进是,在阈值测试时没有输出零树符号,而是输出一比特的测试函数值,实际上这相当于在此时就已将零树符号进行了编码。这样做既降低了比特率,又加快了算法的执行。SPIHT算法的求精扫描与EZW算法的次扫描步骤相比,在执行中相对延 8 辽宁工程技术大学毕业设计(论文) 迟了一步,而前者通过解码时对系数的补偿达到了与后者相同的系数重建精度,换句话说,要达到同样的压缩效果SPIHT算法只需要更少的比特数,从而又提高了算法的性能。如果采用整数小波变换来替换非整数小波,SPIHT算法还可用 [4]于无损压缩领域。由Said和Pearlman提出的分层小波树集合分割算法(SPIHT)则利用空间树分层分割方法,有效地减小了比特面上编码符号集的规模。同EZW相比,SPIHT算法构造了两种不同类型的空间零树,更好地利用了小波系数的幅值衰减规律。同EZW编码器一样,SPIHT编码器的算法复杂度低,产生的也是嵌入式比特流,但编码器的性能较EZW有很大的提高。 基于分层树集合分割排序(Set Partitioning in Hierarchical Trees,SPIHT)的编码算法。它采用了空间方向树(SOT:spatial orientation tree)、集合和L(i,j)更有效地表示这样的系数结构,从而提高了编码效率。算法中的一些符号和概念说明如下: H:空间方向树所有根结点的坐标集合; Z(i,j):点(i,j)及其所有的后代的坐标集合,即指空间方向树; D(i,j):点(i,j)的所有后代(子孙)的坐标集合,不包括(i,j)点本身; O(i,j):点(i,j)的直接后代(儿子)的坐标集合,在分层塔形结构的最高层H有O(i,j)={(i+LL,j),(i,j+LL),(i+LL,j+LL)},除此之外的结点有O(i,j)={(2i,2j),(2i,2j+1),(2i+1,2j),(2i+1,2j+1)},这里LL为最高层H的尺度。 L(i,j):点(i,j)除直接后代外所有后代坐标的集合;SPIHT算法是EZW算法的改进,它继承了小波系数的零树结构,这里称作“空间方向树”结构。 (1)排序过程 编码中使用了三个表:不重要系数表LIP(the list of insignificant pixels)、重要系数表LSP(the list of significant pixels)和不重要集合表LIS(the list of insiginificant sets)。LSP初始化为空表,LIP用最低频子带系数(如三级分解中的LL3、LH3、HL3、HH3中的系数)初始化,LIS用每一个空间方向树的根结点(如三级分解中的LH3、HL3、HH3中的系数位置)来初始化。对重要图的确定主要是通过空间方向树的多次分裂来实现的。一个三级空间方向树在初始化时分裂成树头结点和剩余集合D(i,j)。对判断其重要性,若重要则转到LSP中。对集合D(i,j) 进行重要性测试,若D(i,j)是不重要的,则D(i,j)用一 9 刘爽:基于EBCOT图像压缩编码算法的研究 个符号就可以表示出来。若D(i,j)是重要的,则D(i,j)继续分裂为两个集合O(i,j)和L(ij)。对O(i,j)中的每个元素分别进行重要性测试,把重要元素转到LSP中。对L(i,j)集合进行重要性测试,若L(i,j)不重要,则用一个符号就可以表示该集合,若L(i,j)重要,则L(i,j)分裂为四部分,每部分由相应空间方向树的位置上的元素构成,每一部分与O(i,j)中的四个元素分别构成四棵新树,由于每棵新树的头结点已经判断,只对新树的剩余部分也就是L(i,j)分裂出的四个集合即进行判断。如此重复对每棵树进行分裂和判断直到找出每棵树中的所有重要元素,把它们转到LSP中。可以看到SPIHT算法对重要图的排序是通过一系列的集合分裂完成的,即一棵树T(i,j)分裂成头结点元素和剩余部分D(i,j),对重要的D(i,j)继续分裂成头结点的直接四个孩子O(i,j)和剩余部分L(i,j),对重要的集合L(i,j)再继续分裂为四棵新树的剩余部分。对每棵树的分裂不是一次进行到底的,而是要按照一定的扫描顺序进行。对各个子带的扫描顺序与EZW算法的扫描顺序相同。对由最低频子带和头结点构成的LIP中的元素是按从上到下、从左到右的顺序进行扫描的。而对其它子带则是按2×2的块为单位从上到下、从左到右依次扫描。对每个2×2块中元素还是按从上到下、对每个2×2块中元素还是按从上到下、从左到右顺序扫描。 (2)量化过程: SPIHT采用与EZW算法相同的逐次逼近量化。与EZW算法的比较: SPIHT算法继承了EZW算法中的小波系数的零树结构,这里称为“空间方向树结构”。该算法不但把零树作为一个集合,而且把剩余树(即除去头结点的零树)也作为一个集合处理。假设在HH3中的某个元素是重要的,而其后所对应的HH2、HH1中的元素是不重要的,则在EZW算法中第一次扫描把赋予符号P,对其后的所有元素形成四棵零树ZTR(2i,2j)、ZTR(2i,2j+1)、ZTR(2i+1,2j)、ZTR(2i+1,2j+1)。在SPIHT中C(i,j)即放在LIP中,又放在LIS中。对LIP中元素的比较之后把转到LSP中。而对LIS比较之后发现D(i,j)是不重要的(D(i,j_)是指以(i,j)为树根的树除去根结点外所有的结点),可用一个符号来表示。整个结构可用两个符号表示出来。所以该算法比EZW算法提高了压缩率。SPIHT算法初始化过程、细化过程类似与EZW算法,它改进了EZW 重要图的表示方 10 辽宁工程技术大学毕业设计(论文) 法,也就是重要系数在表中的排序信息,使得集合的表示更为精简,从而提高了编码效率。SPIHT算法在不同的比特率下比EZW算法的峰值信噪比都有所提高。 11 刘爽:基于EBCOT图像压缩编码算法的研究 2 可行性分析 2.1技术可行性 VC++作为一个主流的开发平台一直深受编程爱好者的喜爱,但是严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。 VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势。 2.1.1 MFC MFC微软基础类(Microsoft Foundation Classes),同VCL类似,是一种Application Framework,随微软Visual C++ 开发工具发布。该类库提供一组通用的可重用的类库供开发人员使用。大部分类均从CObject 直接或间接派生,只有少部分类例外。MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC 提供了MFC AppWizar自动生成框架。Windows 应用程序中,MFC 的主包含文件为“Afxwin.h”。 此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。由于它的易用性,初学者常误认为VC++开发必须使用MFC。这种想法是错误的。作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE、WS、PlatForm,MFC同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的。MFC是Win API与C++的结合API即微软提供的WinDOS下 12 辽宁工程技术大学毕业设计(论文) 应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方的编程语言来进行对WinDOS下应用程序的开发,使这些被开发出来的应用程序能在WinDOS下运行,比如VB、VC++、Java、Dehpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在WinOS的消息机制和绘图里,遵守WinDOS作为一个操作系统的内部实现,这其实也是一种必要。CWnd:窗口,它是大多数“看得见的东西”的父类(Windows里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图CView、框架窗口CFrameWnd、工具条CToolBar、对话框CDialog、按钮CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。CDocument文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写)。CView视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate( )来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。CDC设备文本,无论是显示器还是打印机,都是画图给用户看。这图就抽象为CDC。CDC与其他GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把CDC想象成一张纸,每个窗口都有一个CDC相联系,负责画窗口。CDC有个常用子类CClientDC(窗口客户区),画图通常通过CClientDC完成。CDialog对话框 CWinApp应用程序类。似于C中的main函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance( ):初始化。CGdiObject及子类,用于向设备文本画图。它们都需要在使用前选进DC。 2.1.2 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。如图2-1中向下的箭头?表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。在应用程序中要完成某个功能,都是以函数调用的形式实 13 刘爽:基于EBCOT图像压缩编码算法的研究 现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。 应用程序 消息队列 ? ? 图2-1Windows 运行原理 操作系统 Fig.2-1Windows systems operation principle ? ? API 分为四种类型: 远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实输入输出设备 现程序间的通信。 标准查询语言(SQL):是标准的访问数据的查询语言,通过通用数据库实现应用程序间的数据共享。 文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。 信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。 当前应用于 API 的标准包括 ANSI 标准 SQL API。另外还有一些应用于其它类型的标准尚在制定之中。API 可以应用于所有计算机平台和操作系统。这些 API 以不同的格式连接数据(如共享数据缓存器、数据库结构、文件框架)。每种数据格式要求以不同的数据命令和参数实现正确的数据通信,但同时也会产 14 辽宁工程技术大学毕业设计(论文) 生不同类型的错误。因此,除了具备执行数据共享任务所需的知识以外,这些类型的 API 还必须解决很多网络参数问题和可能的差错条件,即每个应用程序都必须清楚自身是否有强大的性能支持程序间通信。相反由于这种 API 只处理一种信息格式,所以该情形下的信息交付 API 只提供较小的命令、网络参数以及差错条件子集。正因为如此,交付 API 方式大大降低了系统复杂性,所以当应用程序需要通过多个平台实现数据共享时,采用信息交付 API 类型是比较理想的选择。 2.2 经济可行性 2.2.1 设计成本 经济可行性首先要进行待开发软件的成本估算和效益分析,以确定待开发软件是否有开发的价值。这里的效益包括新开发的系统所带来的收入增加,以及新开发的系统比原有系统在使用费用上的减少。对于开发成本低、经济效益高的软件应积极开发,而对于开发成本高、经济效益低的软件或开发成本和经济效益差不多的软件通常不应该开发。而本设计使用的开发工具都是开源软件,不需要支付费用,运行服务器只需用户的个人电脑,软件无需管理只需将来更新即可。 2.2.2 收益 本设计可简单的进行数字图像压缩,采用的是JPEG2000算法EBCOT,它比其他的算法更加快速,保证了一定的保真度。对于了解和研究算法EBCOT有一定的实际意义。 2.3 用户操作可行性 本设计界面简单,功能只是进行数字图像压缩,而图像压缩的过程全部在后台执行,无需用户有很专业是知识,就可以进行操作。如果有需要进行更新,由人员进行操作就可。 15 刘爽:基于EBCOT图像压缩编码算法的研究 2.4 法律可行性 本设计所用到的工具都为免费工具,所用资料都是可共享资料,不存在任何知识产权等任何法律问题。 2.5 结论 基于以上对本网站开发的技术可行性、经济可行性、用户操作可行性、法律可行性的分析,本设计可以开发并实现。 16 辽宁工程技术大学毕业设计(论文) 3 需求分析 3.1 总体设计目标 需求分析就是分析用户的需求,并了解用户需要什么,想实现什么,需求分析有两个目的: (1)告诉用户我已经了解你的需求,让用户相信我们能开发好该系统,最好能能说服用户:我们开发的系统在甚至比他们想象的还要好。让他们相信的一个主要手段就是分析用户的需求,并把分析的结果告诉用户。该文档的重点最好侧重功能,操作以及操作规则描述,如果需要,还可以包含安全需求,性能需求,运行环境需求等。 (2)需求分析的另外一个目的就是为下阶段的分析设计提供抽象的数据与 [5]功能模型。 本设计主要是基于JPEG2000的核心算法EBCOT来实现数字图像压缩,从而验证EBCOT算法实现压缩的效果。提供给用户简单易操作的数字图像压缩。主要是以进行学习和研究算法EBCOT为目的。JPEG2000是图像压缩的必然发展趋势,研究和了解JPEG2000也是当今的的一大方向,作为核心算法的EBCOT,当然首当其冲成为研究的重点。 3.2 图像标准 3.2.1 JPEG JPEG(Joint Picture Expert Group)标准于1992年正式批准为国际标准。编码时,先将一幅原始图像转换为自己的色彩系统,按照人眼特点对其中各个色彩分量作不同的取样,经由离散余弦变换(Discrete Cosine Transform,DCT)从空间域变为频域,接着将变换后的数据量化以丢弃无用信息,然后用预编码、熵编码等对量化后的系数进行编码得到压缩数据,最后将色彩分量信息、量化表、编码表和各个色彩分量的压缩数据等混合成一个整体数据流,即形成JPEG文件。解 17 刘爽:基于EBCOT图像压缩编码算法的研究 码的时候,JPEG解码器先从数据流中获取解码所必须的信息(色彩分量信息、量化表和编码表等),然后将各个色彩分量分别解码,其过程和编码时恰好相反。JPEG标准以其优良的压缩性能得到了广泛的应用,在国际互联网上传输的静止图像70%以上是JPEG格式的。但是随着多媒体和Internet等应用的不断扩展,人们发现已有的静止图像压缩标准已经难以满足某些方面的需求。 JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换 [6](Discrete Cosine Transform,DCT)为基础的有损压缩算法,另一种是采用以预测技术为基础的无损压缩算法。使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。例如,在V-CD和DVD-Video电视图像压缩技术中,就使用JPEG的有损压缩算法来取消空间方向上的冗余数据。为了在保证图像质量的前提下进一步提高压缩比,近年来JPEG专家组正在制定JPEG 2000(简称JP 2000)标准,这个标准中将采用小波变换(wavelet)算法。 JPEG压缩是有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。压缩编码大致分成三个步骤: (1)使用正向离散余弦变换(forward discrete cosine transform,FDCT)把空间域表示的图变换成频率域表示的。 (2)使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的。 (3)使用霍夫曼可变字长编码器对量化系数进行编码。 其局限性体现在:目前的压缩标准如JPEG在低比特率(对于高细节化的灰度图像小于0.125bpp)压缩时,如和图3-,主观失真度难以接受,尚没有一个标准能够在同一码流中同时提供高性能的有损压缩和无损压缩;当前的压缩标准一般都针对自然图像有较好的性能,但对于计算机产生的图像却性能不佳;在噪声环境中传输时,比特误码会使JPEG压缩图像质量急剧下降;对于不同类型的图像必须采用不同的压缩标准,如JPEG由于对二值图像的压缩性能不佳而很少用于复合文件。基于上述原因,随着基于小波变换的图像压缩算法研究的深入,联合图片专家组制定了新一代的静止图像压缩标准JPEG2000。 18 辽宁工程技术大学毕业设计(论文) 图3-1 0.125 bpp下的JPEG压缩效果 Fig.3-1 JPEG at 0.125 bpp 图3-2 0.125bpp下JPEG2000的压缩效果 Fig.3-2 JPEG2000 at 0.125 bpp 3.2.2 JPEG2000标准 因特网的发展多媒体的广泛应用带来了数据压缩方面的一场革命。随着网络的普及与多媒体概念的深入人心,人们对图像质量、文档尺寸、图像读取速度的要求越来越高,图像压缩已经成为数据压缩的一个核心组成部分。因此在图像的 19 刘爽:基于EBCOT图像压缩编码算法的研究 压缩舞台上,如GIF、JPEG、PNP等各种图像压缩格式应运而生。最近成为热点的JPEG2000就是在这种背景下诞生的。该标准是由联合图像专家组于1997年开始征集提案,把它作为JPEG标准的一个更新换代标准。它的目标是进一步改进目前压缩算法的性能,以适应低带宽、高噪声的环境,以及医疗图像、电子图书馆、传真、Internet网上服务和保安等方面的应用。国际标准化组织的WG1小组已于2000年8月制定了最终的国际标准化草案(The Final Draft International Standard,简称FDIS)。 早在1997年,ISO/ITU-T组织下的IEC JTC1/SC29/WG1小组便开始着手制定新的静止图像压缩标准——JPEG2000。与JPEG不同,JPEG2000基于小波变换,采用当前最新的嵌入式编码技术,在获得优于目前JPEG标准压缩效果的同时,生成的码流有较强的功能,可应用于多个领域。JPEG2000标准可分为7大部分:第1部分JPEG2000图像编码系统,是JPEG2000标准的核心系统;第2部分扩展系统,在核心系统上添加了一些第一部分的扩展功能;第3部分Motion JPEG2000(JPEG2000用于压缩活动视频序列);第4部分一致性(测试用不同方法实现该标准的一致性);第5部分参考软件;第6部分复合图像文件格式,主要针对印刷和传真应用;第7部分技术报告,介绍实现第一部分所需要的最小支持环境。JPEG2000对传统的JPEG编码的最大改进是以离散小波变换(DWT)代替了离散余弦变换(DCT)。在JPEG基本系统中,首先把原始图像分成大小相等的图像块,然后对图像块进行离散余弦变换DCT(图像块的能量集中到少量的系数),再用基于人类视觉系统(HVS)特性的矩阵对变换后得到的系数矩阵进行量化,从而大幅度地压缩了矩阵系数,同时也造成了损失。最后对量化后得到的矩阵系数进行无损熵编码。预处理后的数据将进行离散小波变换,进一步降低了数据之间的相关性,与离散余弦变换相比,DWT具有很好的局部性,从而有可能取得更好的压缩比,而且可以提供实现无损压缩的机制。 JPEG2000之所以相对于现在的JPEG标准有了很大的技术飞跃,就是因为它放弃了JPEG所采用的以离散余弦变换(DCT)算法为主的区块编码方式,而改用以离散小波变换(Discrete Wavelet Transform,DWT)算法为主的多解析编码方式。离散小波变换算法是现代谱分析工具,在包括压缩在内的图像处理与图像分析领域正得到越来越广泛的应用。这种算法对于时域或频域的考察都采取局 20 辽宁工程技术大学毕业设计(论文) 部的方式,所以对于非平稳过程也一样十分有效。小波在信号分析中对高频成分采用由粗到细渐进的时空域上的取样间隔,所以能够像自动调焦一样看清远近不同的景物,并放大任意细节,是构造图像多分辨率的有力工具。此外,JPEG2000还将彩色静态画面采用的JPEG编码方式与二值图像采用的JBIG编码方式统一起来,成为对应各种图像的通用编码方式。JPEG2000标准提供了一套新的特征,这些特征对于一些新产品(如数码相机)和应用(如互联网)是非常重要的。它把JPEG的四种模式(顺序模式,渐进模式,无损模式和分层模式)集成在一个标准之中。在编码端以最大的压缩质量(包括无失真压缩)和最大的图像分辨率压缩图像,在解码端可以从码流中以任意的图像质量和分辨率解压图像,最大可达到编码时的图像质量和分辨率。JPEG2000应用的领域包括互联网、彩色传真、打印、扫描、数字摄像、遥感、移动通信、医疗图像和电子商务等等。 JPEG2000的主要的特征如下: (1)高压缩率:由于在离散子波变换算法中,图像可以转换成一系列可更加有效存储像素模块的“子波”,因此,JPEG2000格式的图片压缩比可在现在的JPEG基础上再提高10,,30,,而且压缩后的图像显得更加细腻平滑,这一特征在互联网和遥感等图像传输领域有着广泛的应用。 (2)无损压缩和有损压缩的实现:在JPEG2000中,进行嵌入操作,以无损为图像质量的上限,能够从一个比特流提取任意质量的图像。在需要无损压缩的情况下,必须采用带整数值系数的可逆小波变换。若比特流被嵌入,则满足解码比特量与重建的图像质量成正比关系。例如,压缩某图像,作为具有A字节的比特流文件。可从该比特流解码B字节(BGetDibSaveDim(); // 图像每行的字节数 LONG lLineBytes; //得到图像的宽度和高度 CSize SizeDim; SizeDim = pDib->GetDimensions(); lWidth = SizeDim.cx; lHeight = SizeDim.cy;; // 计算图像每行的字节数 lLineBytes = SizeRealDim.cx; //图像数据的指针 LPBYTE lpDIBBits = pDib->m_lpImage; // 循环变量 int i, j; // 像素的值 int nPixelValue; // 将图像二值化,利用 BAYER 表抖动显示图像 for (j = 0; j < lHeight ; j++) { for(i = 0; i < lLineBytes ; i++) { // 指向源图像倒数第 j 行,第 i 个像素的指针 lpSrc = (unsigned char *)lpDIBBits + lLineBytes * j + i; nPixelValue = (*lpSrc); 47 刘爽:基于EBCOT图像压缩编码算法的研究 nPixelValue =nPixelValue; // 右移两位后做比较 if ( (nPixelValue>>2) > BayerPattern[j&7][i&7]) //打白点 *(lpSrc)=(unsigned char)255; else //打黑点 *(lpSrc)=(unsigned char)0; } } return true; } 6.3.2小波变换代码 如下编码可以实现小波变换及反变换 //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[j*lLineBytes+3*i]; g=m_pData[j*lLineBytes+3*i+1]; r=m_pData[j*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j = 0; j < height; j ++) { for(i = 0; i < nWidth; i ++) { int w = i *2; 48 辽宁工程技术大学毕业设计(论文) temp2[j*width+i] = temp1[j*width+w]; //偶 temp2[j*width+nWidth+i] = temp1[j*width+w+1]; //奇 } } //通过图像的差分,完成小波变换 for(j=0; jtemp2[j*width+i]) minVal=temp2[j*width+i]; } } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; 49 刘爽:基于EBCOT图像压缩编码算法的研究 //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp2[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[j*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; delete temp2; } 50 辽宁工程技术大学毕业设计(论文) 7 测试 7.1 测试原则及测试方式概述 软件测试的是站在用户的角度,对产品进行全面测试,尽早、尽可能多地发现Bug,并负责跟踪和分析产品中的问题,对不足之处提出质疑和改进意见。零缺陷(Zero-Bug)是一种理念,足够好(Good-Enough)是测试的基本原则。 (1) 在软件测试过程中,应注意和遵循的具体原则,可以概括为十大项:所有测试的标准都是建立在用户需求之上。正如我们所知,软件测试的目标就是验证产品的一致性和确认产品是否满足客户的需求,所以测试人员要始终站在用户的角度去看问题、去判断软件缺陷的影响,系统中最严重的错误是那些导致程序无法满足用户需求的缺陷。 (2) 软件测试必须基于“质量第一”的思想去开展各项工作,当时间和质量冲突时,时间要服从质量。 (3) 质量的理念和文化(如零缺陷的“第一次就把事情做对” )同样是软件测试工作的基础。 (4) 事先定义好产品的质量标准。有了质量标准,才能依据测试的结果对产品的质量进行正确的分析和评估,例如,进行性能测试前,应定义好产品性能的相关的各种指标。同样,测试用例应确定预期输出结果,如果无法确定测试结果,则无法进行校验。 (5) 软件项目一启动,软件测试也就是开始,而不是等程序写完,才开始进行测试。在代码完成之前,测试人员要参与需求分析、系统或程序设计的审查工作,而且要准备测试计划、测试用例、测试脚本和测试环境,测试计划可以在需求模型一完成就开始,详细的测试用例定义可以在设计模型被确定后开始。应当把“尽早和不断地测试”作为测试人员的座右铭。 (6) 穷举测试是不可能的。甚至一个大小适度的程序,其路径排列的数量也非常大,因此,在测试中不可能运行路径的每一种组合,然而,充分覆盖程序逻辑,并确保程序设计中使用的所有条件是有可能的。 51 刘爽:基于EBCOT图像压缩编码算法的研究 (7) 第三方进行测试会更客观,更有效。程序员应避免测试自己的程序,为达到最佳的效果,应由第三方来进行测试。测试是带有“挑剔性”的行为,心理状态是测试自己程序的障碍。同时对于需求规格说明的理解产生的错误也很难在程序员本人测试时被发现。 (8) 软件测试计划是做好软件测试工作的前提。 两种常用的测试方法 (1) 黑盒测试 这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构。内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。黑盒测试又叫做功能测试或数据驱动测试。用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。 (2) 白盒测试 此方法把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。软件人员使用白盒测试方法,主要想对程序模块进行如下的检查;对程序模块的所有独立的执行路径至少测试一次;对所有的逻辑判定,取“真”与取“假”的两种情况都至少测试一次;在循环的边界和运行界限内执行循环体;测试内部数据结构的有效性等。本设计中将采用这种测试方法。 52 辽宁工程技术大学毕业设计(论文) 7.2 系统测试的用例及结果 测试需求说明:设计中主要的模块为图像压缩模块,主要设计用例测试程序是否能够成功压缩图像。 表7-1系统测试1 Table.7-1 system test 1 模块 用例测试 操作 预测结果 测试结果 1.添加文件 导入图像文件 导入成功 导入成功 文件模 2.添加文件(其他导入其他格式文件 导入失败 导入失败 块 格式) 1.保存文件 把压缩后的文件保存 保存成功 保存成功 2.删除文件 删除已导入的文件 删除成功 删除成功 编辑模块 1.撤销 撤销已进行的操作 撤销成功 撤销成功 2.清除 清除在压缩界面的文件 清除成功 清除成功 参数设置 1.设置参数 设置参数(设定范围内数设置成功 设置成功 模块 值) 2.设置违规参数 设置参数(设定范围外数设置违规 设置违规 值) 图像压缩 1.选择算法 选择EBCOT算法 压缩成功 压缩成功 模块 2.选择算法 选择EZW算法 压缩成功 压缩成功 3.未选择算法 未选择任何算法 操作失败 操作失败 53 刘爽:基于EBCOT图像压缩编码算法的研究 表7-2 系统测试2 Table.7-2 system test 2 测试目的操作 预测结果 测试结果 的 基于EZW选择EZW算法对图像文可以进行压缩 可以进行压缩 压缩是否件进行压缩 运行正常 基于算法 选择EBCOT算法对图像可以进行压缩 可以进行压缩 EBCOT压文件进行压缩 缩是否运 行正常 压缩效果分别用两种算法对同一个基于EBCOT算基于EBCOT算 比较 图像文件进行压缩 法的压缩效果法的压缩效果比 比基于EZW算基于EZW算法 法的压缩效果的压缩效果好 好 速度快 速度快 表7-3系统测试3 Table.7-3 system test 3 EZW算法 EBCOT算法 用时 249ms 196ms 压缩比 16:1 16:1 PSNR 34.832 37.135 以一张PSNR为38.987dB和bits为415574的图片为例进行压缩,测试压缩效果如图7-1、图7-2、图7-3。 54 辽宁工程技术大学毕业设计(论文) 图7-1原图 Fig.7-1 original image 图7-2 基于EBCOT算法 Fig.7-2 image compression based on EBCOT 55 刘爽:基于EBCOT图像压缩编码算法的研究 图7-3基于EZW算法 Fig.7-3 image compression based on EZW 7.3 软件测试结论 经过测试,系统的出错率稳定在15%左右,在现有功能的基础上,测试的结果基本能满足系统的要求。 56 辽宁工程技术大学毕业设计(论文) 8 结论 本文研究了图像压缩的原理及过程,并对两种标准进行了比较及JPEG和JPEG2000的比较,也描述了小波变换的原理和其在图像压缩中的应用,并重点的比较了EBCOT算法和其他算法的优缺点,主要对EZW算法和SPIHT算法与EBCOT算法的原理上进行了详细的分析,最后基于VC++实现了三种算法的图像压缩,更加形象的证明了EBCOT算法的优越性。通过对EBCOT算法的研究,我对于图像压缩原理及过程和JPEG2000都有了比较系统的认识。 由于时间的仓促和自身经验与知识的匮乏,在算法的实践结果上没能做到最好,原理分析上也有很多不足,只是对EBCOT算法的原理进行了分析和研究而没有做出什么改善和完善。 ROI编码处理思想不仅能够满足人们在低比特率条件下对重要的图像信息实现高质量,甚至无损恢复的要求,还可以通过与图像压缩算法相结合来很好的解决通讯过程中的带宽瓶颈、存储空间等问题。这些突出的优点使得ROI编码处理方法成为了近年来图像处理领域的研究热点之一。具体到对图像的压缩和传输处理方面,我们总是希望自己所感兴趣的图像区域能够得到相对于背景区域更好的压缩效果,并且能够在传输过程中得到优先的处理。这类图像应用问题,就是图像处理中的“感兴趣区域(ROI)”编码处理问题。现在出现的ROI区域设计都需要人为干预,设计出来一个由算法自动寻找ROI区域需要与模式分类、识别、图像分割等相关学科的结合,这个技术具有十分强大的实用意义。作为JPEG2000中一个很重要的特性,人们一直都在对ROI编码技术进行研究,ROI编码随着研究的进行始终都在不断地进步,也不断的有新的成果出现。对多ROI区域的编码是一个很现实的问题,多ROI编码技术可以实现一幅图像中多个感兴趣区域的不同质量的压缩,这方面还需要进一步的研究。本文对ROI的选取主要是通过手工选择的,其实对一些标准的图像有一定的规律,如果能结合图像自身的特点来自动指定感兴趣区将可以更好的完成感兴趣区域编码功能也就是如何能结合图像的规律自动进行感兴趣区域的确定将是将来研究的重点之一。 57 刘爽:基于EBCOT图像压缩编码算法的研究 致谢 感谢所有老师在我做毕设期间给予我的帮助和指导,尤其是杨子扬老师,从论文的选题、论证、研究到最后顺利完成,杨老师都给了我最大的支持和帮助,在我做毕业设计期间受到挫折时,杨老师给了我莫大的鼓励,并不厌其烦的悉心指导。而且由于我知识的欠缺,老师帮我查阅了大量的资料供我学习和参考。 感谢大学期间的所有老师,正是有这些老师的教育和指导,为我做毕业设计打下了良好的理论基础和知识储备。所有老师无论是在学术上的造诣,还是谦虚、勤谨的品格都是我今后治学为人的榜样。 更要衷心感谢所有帮助过我的同学和朋友,感谢他们在毕业设计期间无论是生活上还是学习上给予我的支持和鼓励。 58 辽宁工程技术大学毕业设计(论文) 参考文献 [1] 高文.多媒体数据压缩技术[M].电子工业出版社,2001.5. ):40~47. [2] 徐孟侠.图像编码的进展[J].通信学报,1993,14(2 [3] 周庆忠.基于小波变换的图像编码研究:[D].成都:理工大学,2004. [4] 郭武,梅丽,罗建书.一种基于SPIHT的ROI图像编码[J].中国空间科学技术,2003,1 (2):61~65. [5] 张海藩.软件工程导论[M].第5版.北京:清华大学出版社,1998. [6] Antonini.M.Image coding using wavelet transform.IEETrans[J].ImageProc,1992(1):205~220. [7] E. Atsumi and N. Farvardin.Lossy/lossless region-of-interest image coding based on setpartitioning in hierarchical trees[Z].IEEE International Conference on Image Processing,1998,1(10):87~91. [8] D. Nister and C. Christopoulos .Lossless Region of Interest with a naturally progressive still image coding algorithm .Proceedings of IEEE [Z].International Conference on Image Processing(ICIP 98),1998,4(7):856~860. [9] ]Said A,Pearlman W A.A new,fast,and efficient image codec based on set partitioning in hierarchical trees[Z].IEEE Trans. on Circuits and System for Video Technology, 1996, 6(3): 243~249. [10] 丁艳等.小波变换在图像压缩中的应用研究[J].光学技术,1999.1:64~67. [11] 程正兴.小波分析算法与应用[M].西安:西安交通大学出版社,2002. 59 刘爽:基于EBCOT图像压缩编码算法的研究 附录A 小波系数零树在嵌入式图像编码中的应用 摘要:嵌入零树小波算法(EZW)是一个简单,而且效率显著的图像压缩算法。这种算法得到比特流中的比特是按其重要性排序的,完全服从嵌入编码。嵌入式编码通过一串二进制来判断和区分一个图像的。使用嵌入式编码算法,编码者能够在任意点结束编码,所以允许精确达到一个目标比率或目标失真,而这时仍能确切地产生同样的图像。同样,对给定的比特流,解码者也可在任意点结束解码,且仍能确切地产生和转换时同样的图像。而且产生一个完全嵌入比特流,在标准图像实验中,EZW产生的压缩结果比所有其他压缩法的更具有优势。而且这种算法的实现是绝对不要求训练的,不要求预存储点格式码书,也不要求图像源的任何预先知识。 EZW算法是基于这四个概念:1) 离散小波变换或子带层分解;2) 通过利用图像子相关性及尺度预测一系列重要信息;3)熵编码的成功近似量化;4) 自适应算法编码。 本文介绍两个问题:1) 用给定比特率获得最好的图像;2)在嵌入趋势中完成此任务,例如,在这种方法中所有图像的低比特率码被嵌入到目标比特率的开始比特流中。 这个问题在许多应用中非常重要,特别是在渐进传输,图像浏览,多媒体应用,及在数字复杂层次比特率中传输马的兼容。在这种情形下,比特按其重要性规则排序,自然的就控制了层次保护表优先权效果。 A 嵌入式编码 嵌入式编码是一种用一串二进制表示和判断从以“零”或“全灰”图像中区分出一个图像。因此,嵌入式编码在比特流开始它包含所有低比特率码的嵌入,这些比特是按其重要性排序的。使用嵌入式编码,编码者可在任一点结束编码,所允许精确达到一个目标比特率或目标失真时,仍能确切产生同样图像。在编码处理中,一些典型的目标参数比如能被检测到的比特数。当达到目标时编码停止。同样,对给定的比特流解码者可在任一点结束解码,而且能达到对应低比特率编 60 辽宁工程技术大学毕业设计(论文) 码的重构。 嵌入式编码与用确切二进制来表示实数的方法是相似的。任何数都能用二进制数字字符表示出来。这种表示右边的树位越多,就越精确。而且“编码”可在任何时终止,且在二进制数表示规则内达到“最好”的实数表示。同样,嵌入式编码可在任何时刻结束编码,且提供在他的规则内达到“最好”的图象表示。 这里所提到的嵌入式编码表是由普通编码来促动的,而普通编码表已用于编码器试着对无预先知识源进行规范无损数据压缩编码。一个优秀的普通编码评论可在[3]中找到。对一般编码器,编码者必须学他的统计源作为进展。换句话说,源模型是真实比特流的合成。在普通有损压缩编码器中游和少的工作。典型图像编码器需要大量对数量和非自适应熵编码产生的训练,如哈夫曼编码。本文描述的嵌入式编码器通过学习所有自己的比特流合并来接近普通编码器。这些是通过高级自适应算法编码来完成的。 直觉性告诉我们对给定率或变形的情形,则非嵌入式编码应比嵌入式更有效,因为它是嵌入式通过自由逼近得道的。尽管最优性从来没被声明,但一个在不牺牲图像质量情形下产生一个嵌入式比特流的方法早已发展起来。 B嵌入式编码的特征 EZW算法包含以下特征: 1、离散小波变换提供了图像一个紧凑的多分辨率描述。 2、零树编码提供了“重要图”的一个紧凑多分辨率表示,这种“重要图”是指出个层次上,零树成功地预测了非重要系数,从而有效地描述为指数生长树部分。 3、逐次逼近提供了重要系数紧凑的多重精密描述,并使嵌入式编码简化。 4、优先协议,通过精确无误重要尺度和小波系数位置等的重要性排序。特别注意,一个大的系数比一个小的系数更重要。 5、合适的多水平算术编码,它为符号串的熵编码提供了一个快速有效的算法,而并不要求训练或预先存储的表格。在实验中,用到的编码算法在[31]中是普遍的。 6、当达到一个大的比特率或失真目标时,算法可继续运行或停止。通过点对点,可能精确达到目标比特率和估算出一个能利用的失真率函数。 61 刘爽:基于EBCOT图像压缩编码算法的研究 第二部分讨论小波理论和多分辨率分析如何提供一个好方法,利用在统计学上相等的根点来描述其趋势和特例。尽管事实上,它仅是图像采样的一个极小趋势,但由于边缘在图像处理中非常重要,它被认为是在空间领域的一个特例,它描述的是非常重要的信息。第三部分介绍零树的概念和表明如何通过用尺度来预测一些重要信息来对重要图的小波系数进行有效的零树编码。第四部分讨论如何成功在零树编码连接中应用逼近量化和编码算法来有效完成嵌入式编码。讨论描述的是EZW试图根据比特重要作为优先协议。 2小波理论和多分辨率分析 A趋势和特例 一个在信号处理和统计学中最古老的问题是如何选择一个分析窗的大小,块大小或数据机率长度以便于在好的信号模型窗中统计估算。一个分析窗的选择包括分析特例的交换能力,或信号在时间域变窄行为,则在频域有变宽趋势,或信号在频域变窄行为,则在时间域有很多滞后数出现。通过诉随机处理来调制数据作为其产生,以便于统计估算变得更有意义。 小波理论和多分辨率分析的主要贡献是它提供了一个简洁的规则,在这规则中,在一个相同根处能够分析特例和趋势。小波提供一个信号描述,在其中一些系数应用尺度概念,数据表示为一个连续分变换,其在时间域(或图像的空间)和频域是可获得的。 B相关图像编码 在图像处理中,多数图像空间典型地代表了其位置的趋向,或高数字位置区间的相关性。然而像边缘或图像边界这样异例的呈现,相对图像来说,比数字能量更有意义。传统的变换编码,比如应用DCT编码,把图象分解成每个系数反映一个固定大小空间区域和固定频率带宽。在这里带宽和空间位置对所有的系数都一样有效。边缘信息易于分解,所以许多非零系数被用于以高保真度来表示边缘。然而,就整个图像来讲,边缘代表的是不重要能量。传统的变换编码器,比如DCT编码,在高、中比特率的情况下编码效果非常成功。但是如果比特率极低,传统的编码技术如JPEG,留过多给其趋势,而给异例很少。结果是图像出现块状。 小波技术在低比特率的情况下,效果较好。这是由于各级的趋势、异例和信 62 辽宁工程技术大学毕业设计(论文) 息都可获得。一个大的难题是良好的细节系数的表示可以的异例构成最大的系数,因此,为了有效的利用多分辨率分析来反映,则很多的信息都被用于表示少数那些相当重要异例系数的位置。 本论文讨论的技术是允许编码者通过有效表现那些重要异例小波系数位置的方法来有效的利用多分辨分析。 C离散小波变换 本文用到的离散小波变换是个分层子带相同的系统,子带是对数频域空间和分解的一个描述。在分解开始,图像被分为四个子带,分解结果如图1所示。每个系数描述了与原始图像相对应的大约为2x2的空间区域。低频描述相对应的带宽大约为。高频对应带宽为。四个子带是通过竖直和水平0,w,a/2a/2,w,a 滤波器产生的。标号为LH1、HL1和HH1的子带表示的是最高阶小波系数。为获得下一阶小波系数,子带LL1被分解为如图2所示的样子,这种处理持续到最后一级完成。注意对每个粗略扫描,其系数描述了一个图的大区域空间,除了窄频带。在每个尺度,有三个子带;依然最低频子带含有粗略扫描的全部信息。 变化系统和子带系统只是术语上的不同,二者只是从不同的角度描述了同一种数字处理系统。设x为一柱矢量,它的成分代表图象象素的扫描。设X为另一柱状矢量,它的成分代表小波变化和子带分解由于应用了x而产生的系数矩阵。从变化手的角度看,X代表了x的线性变化,通过矩阵w来形成 x=wX。 (1) 图1一阶离散小波变换 图2两阶小波分解 3小波零树系数 在这一段重点讲的是对于低比特率图像编码的非零值传输。下述通过熵编码应用尺度量化,目的是达到非常低的比特率,例如至少每像素1比特,在零符号量化后出现与之相似符的可能性极高。典型的,比特预算的一个趋势是对重要图编码的花费,或用二进制决定作为是否采样的判断。在这种情况下,二维离散小 63 刘爽:基于EBCOT图像压缩编码算法的研究 波变换系数有零或非零量化值。下述是一个对重要图获得相应的有效压缩编码的重要的改进讨论:这些系数位置码被作为。 A重要图编码 为了增加重要图编码的重要性,则把通过熵编码尺度量化得到的非对应性变换看作是一个典型的编码系统。下述讨论不是意指重要图编码的证明,而仅是给读者提供一系列包含位置信息的相关编码代价,在重要途中有些丰富的相关符号信息。 变换的目的是减少系数的相关性。如果可能,我们把它看作是通过采样来清除所有相关性的一种变换。假定在某一刻变换效果非常好,则变换后的系数不仅是非相关的,而且统计独立的。同样,假定我们已消除平均值和规则分离使变换系数被做成零值的模型,但或许为不相同的随机变量分布。而且,我们可能附加一个逼近模型以便于概率密度函数对系数是对称的。 B小波系数零树在重要图压缩的应用 为改进小波系数对重要图的压缩,则定义一个零树的数据结构。对于给定如 X,T果小波系数X有,则X被叫做不重要系数。零树是建立在一个小波系数与给定阈值粗略比较是不重要的基础上的假设,因而所有在较细尺度位置上的小波系数相对阈值T是不重要的。根据大量经验证明这种假设是正确的,特别是在一个等级子带系统中,除了最高阶频域子带,对于给定阶数的每一个系数能在同方向的下阶中找到与它相关的系数。在粗尺度上的小波系数被称为母体,在较细的尺度相应位置上的所有小波系数被称为孩子。的阈值T,对于给定母体,则较细尺度相应位置上的所有小波系数被称为子孙。相似的,对于给定孩子,则在较粗的尺度相应位置上的系数被称为祖先。对一个子带的正交金子塔分割后,父母与孩子的关联如图4所示。在子带HH3 中一个小波系数在小波树的子孙分布同样从图4中可以看出。除了低频子带外,所有父母都有四个孩子。对低频子带来说,父母与孩子关系被定义为每个父母节点有3个孩子。 在第四部分将看到除了重要图编码外,对重要图和重要系数一起编码时非常有用的。因此在实际中,被分为四种特征:1)零树根,2)孤立零,3)正重要系数和4)负重要系数。这些此要的附加物对嵌入非常重要。决定每个系数的流程图如图6所示。注意包含的这两个附加物也很重要,如正/负重要,且子孙是零树 64 辽宁工程技术大学毕业设计(论文) 等等。在实际中,可以发现低比特率,是由于这些附加物增加了重要图编码的代价。让我们看一下存在这种情况的原因是由于考虑到有对置为正(负)重要系数的子孙进行提取它们哪些是零树,哪些是重要而付出的代价。如果这个决定的代价为C比特,则一个零树编码的代价至少C/4比特,因而用区分四个零树特征码比用附加特征更有效。 图4 子带的母体—孩子关系 图5 子图排序示意图 零树编码降低了用相关性对重要图编码的代价。即使是用非相应变换产生的变换图像有非重要系数的存在也不是独立事件。大部分传统变换编码技术典型地用一些变长编码形成编、译码图。不像零树符号一样,要用单一的根点特征和提供的所有树枝,变长编码要对每个变长符号必须编码。在JPEG中应用的一种技术称快结束点符与零树符号非常相似,它表明在块中所有离散余弦变换系数被量化为零。让我们来看为什么零树可以提供一个比快结束点有利的符号,这是考虑到零树表示一些不重要信息,且在给定的方向上有许多空间区域,并在不同的尺度级有着不同的零数根。因为小波变换是一个阶层式的描述,在不同的尺度上其零树根在不断变化,以适应对空间领域那些不重要信息的表示。这个快结束点符号,不管怎样,总是无价值的表示着那个相同的空间领域,虽然这些频率数在那些空间领域中是成比例的变化。对给定的大小的块,例如8x8,在小波变换中这是一个精确的尺度,如果在小波变换中找到一个零树根,则它的对应的空间领域与DCT一样是以块状形。如果在一个低等的尺度时没定义零树根,然后关于预测到的大领域等是没有意义的。相同的如果在这个尺度内不存在零树根,然后在同一尺度中不同阶层的分割和控制的方法中去寻找零树,然后寻到的这些空间区域即使像DCT块状形位置一样也是无意义的。因此,一些系数能在一个典型尺度根的平滑领域中预测出来。而且,零树处理感兴趣的是对非零的进行详细描述,而 65 刘爽:基于EBCOT图像压缩编码算法的研究 对大的不重要的部分尽量少的描述。 66 辽宁工程技术大学毕业设计(论文) 附录B Embedded Image Coding Using Zero-trees of Wavelet Coefficients Jerome M. Shapiro Abstract-The embedded zero-tree wavelet algorithm (EZW)is a simple, yet remarkably effective, image compression algorithm, having the property that the bits in the bit stream are generated in order of importance, yielding a fully embedded code. The embedded code represents a sequence of binary decisions that distinguish an image from the “null” image. Using an embedded coding algorithm, an encoder can terminate the encoding at any point thereby allowing a target rate or target distortion metric to be met exactly. Also, given a bit stream, the decoder can cease decoding at any point in the bit stream and still produce exactly the same image that would have been encoded at the bit rate corresponding to the truncated bit stream. In addition to producing a fully embedded bit stream, EZW consistently produces compression results that are competitive with virtually all known compression algorithms on standard test images. Yet this performance is achieved with a technique that requires absolutely no training, no pre-stored tables or codebooks, and requires no prior knowledge of the image source. The EZW algorithm is based on four key concepts: 1) a discrete wavelet transform or hierarchical subband decomposition, 2) prediction of the absence of significant information across scales by exploiting the self-similarity inherent in images, 3) entropy-coded successive-approximation quantization, and 4) universal lossless data compression which is achieved via adaptive arithmetic coding. I. INTRODUCTION AND PROBLEM STATEMENT This paper addresses the two-fold problem of 1) obtaining the best image quality for a given bit rate, and2) accomplishing this task in an embedded fashion, i.e., in such a way that all encodings of the same image at lower bit rates are embedded in the beginning of the bit stream for the target bit rate. 67 刘爽:基于EBCOT图像压缩编码算法的研究 The problem is important in many applications, particularly for progressive transmission, image browsing [25], multimedia applications, and compatible transcoding in a digital hierarchy of multiple bit rates. It is also applicable to transmission over a noisy channel in the sense that the ordering of the bits in order of importance leads naturally to prioritization for the purpose of layered protection schemes. A. Embedded Coding An embedded code represents a sequence of binary decisions that distinguish an image from the “null,” or all gray, image. Since, the embedded code contains all lower rate codes “embedded” at the beginning of the bit stream, effectively, the bits are “ordered in importance. ” Using an embedded code, an encoder can terminate the encoding at any point thereby allowing a target rate or distortion metric to be met exactly. Typically, some target parameter, such as bit count, is monitored in the encoding process. When the target is met, the encoding simply stops. Similarly, given a bit stream, the decoder can cease decoding at any point and can produce reconstructions corresponding to all lower-rate encodings. Embedded coding is similar in spirit to binary finiteprecision representations of real numbers. All real numbers can be represented by a string of binary digits. For each digit added to the right, more precision is added. Yet, the “encoding” can cease at any time and provide the “best” representation of the real number achievable within the framework of the binary digit representation. Similarly, the embedded coder can cease at any time and provide the “best” representation of an image achievable within its framework. The embedded coding scheme presented here was motivated in part by universal coding schemes that have been used for lossless data compression in which the coder attempts to optimally encode a source using no prior knowledge of the source. An excellent review of universal coding can be found in [3]. In universal coders, the encoder must learn the source statistics as it progresses. In other words, the source model is incorporated into the actual bit stream. For lossy compression, there has been little work in universal coding. Typical image coders require extensive training for 68 辽宁工程技术大学毕业设计(论文) both quantization (both scalar and vector) and generation of nonadaptive entropy codes, such as Huffman codes. The embedded coder described in this paper attempts to be universal by incorporating all learning into the bit stream itself. This is accomplished by the exclusive use of adaptive arithmetic coding. Intuitively, for a given rate or distortion, a nonembedded code should be more efficient than an embedded code, since it is free from the constraints imposed by embedding. In their theoretical work [9], Equitz and Cover proved that a successively refinable description can only be optimal if the source possesses certain Markovian properties. Although optimality is never claimed, a method of generating an embedded bit stream with no apparent sacrifice in image quality has been developed. B. Features of the Embedded Coder The EZW algorithm contains the following features A discrete wavelet transform which provides a compact multiresolution representation of the image. Zero-tree coding which provides a compact multiresolution representation of significance maps, which are binary maps indicating the positions of the significant coefficients. Zero-trees allow the successful prediction of insignificant coefficients across scales to be efficiently represented as part of exponentially growing trees. Successive Approximation which provides a compact multiprecision representation of the significant coefficients and facilitates the embedding algorithm. A prioritization protocol whereby the ordering of importance is determined, in order, by the precision, magnitude, scale, and spatial location of the wavelet Coefficients. Note in particular, that larger coefficients are deemed more important than smaller coefficients regardless of their scale. Adaptive multilevel arithmetic coding which provides a fast and efficient method for entropy coding strings of symbols, and requires no training or prestored tables. The arithmetic coder used in the experiments is a customized version of that in [31]. The algorithm runs sequentially and stops whenever a target bit rate or a target distortion is met. A target bit rate can be met exacrly, and an operational ratevs-distortion function (RDF) can be computed pointby- point. 69 刘爽:基于EBCOT图像压缩编码算法的研究 C. Paper Organization Section 11 discusses how wavelet theory and multiresolution analysis provide an elegant methodology for representing “trends” and “anomalies” on a statistically equal footing. This is important in image processing because edges, which can be thought of as anomalies in the spatial domain, represent extremely important information despite that fact that they are represented in only a tiny fraction of the image samples. Section 111 introduces the concept of a zero-tree and shows how zero-tree coding can efficiently encode a significance map of wavelet coefficients by predicting the absence of significant information across scales. 11. WAVELET THEORY AND MULTIRESOLUTION ANALYSIS A. Trends and Anomalies One of the oldest problems in statistics and signal processing is how to choose the size of an analysis window, block size, or record length of data so that statistics computed within that window provide good models of the signal behavior within that window. The choice of an analysis window involves trading the ability to analyze “anomalies, ” or signal behavior that is more localized in the time or space domain and tends to be wide band in the frequency domain, from “trends,” or signal behavior that is more localized in frequency but persists over a large number of lags in the time domain. To model data as being generated by random processes so that computed statistics become meaningful, stationary and ergodic assumptions are usually required which tend to obscure the contribution of anomalies. The main contribution of wavelet theory and multiresolution analysis is that it provides an elegant framework in which both anomalies and trends can be analyzed on an equal footing. Wavelets provide a signal representation in which some of the coefficients represent long data lags corresponding to a narrow band, low frequency range, and some of the coeficients represent short data lags corresponding to a wide band, high frequency range. Using the concept of scale, data representing a continuous tradeoff between time (or space in the case of images) and frequency is available. B. Relevance to Image Coding In image processing, most of the image area typically represents spatial “trends,” 70 辽宁工程技术大学毕业设计(论文) or areas of high statistical spatial correlation. However “anomalies,” such as edges or object boundaries, take on a perceptual significance that is far greater than their numerical energy contribution to an image. Traditional transform coders, such as those using the DCT, decompose images into a representation in which each coefficient corresponds to a fixed size spatial area and a fixed frequency bandwidth, where the bandwidth and spatial area are effectively the same for all coefficients in the representation. Edge information tends to disperse so that many non-zero coefficients are required to represent edges with good fidelity. However, since the edges represent relatively insignificant energy with respect to the entire image, traditional transform coders, such as those using the DCT, have been fairly successful at medium and high bit rates. At extremely low bit rates, however, traditional transform coding techniques, such as JPEG , tend to allocate too many bits to the “trends,” and have few bits left over to represent “anomalies.” As a result, blocking artifacts often result. Wavelet techniques show promise at extremely low bit rates because trends, anomalies, and information at all “scales” in between are available. A major difficulty is that fine detail coefficients representing possible anomalies constitute the largest number of coefficients, and therefore, to make effective use of the multiresolution representation, much of the information is contained in representing the position of those few coefficients corresponding to significant anomalies. The techniques of this paper allow coders to effectively use the power of multiresolution representations by efficiently representing the positions of the wavelet coefficients representing significant anomalies. C. A Discrete Wavelet Transform The discrete wavelet transform used in this paper is identical to a hierarchical subband system, where the subbands are logarithmically spaced in frequency and represent an octave-band decomposition. To begin the decomposition, the image is divided into four subbands and critically subsampled as shown in Fig. 1. Each coefficient represents a spatial area corresponding to approximately a 2 X 2 area of the original image. The low frequencies represent a bandwidth approximately 71 刘爽:基于EBCOT图像压缩编码算法的研究 corresponding to 0 < |wI < a/2. where as the high frequencies represent the band from a / 2 < IwI < a. The four subbands arise from separable application of vertical and horizontal filters. The subbands labeled LHI , HLI, and HHI, represent the finest scale wavelet coefficients. To obtain the next coarser scale of wavelet coefficients, the subband LL, is further decomposed and critically sampled as shown in Fig. 2. The process continues until some final scale is reached. Note that for each coarser scale, the coefficients represent a larger spatial area of the image but a narrower band of frequencies. At each scale, there are three subbands; the remaining lowest frequency subband is a representation of the information at all coarser scales. The issues involved in the design of the filters for the type of subband decomposition described above have been discussed by many authors and are not treated in this paper. Interested readers should consult [l], [6], [32], [35], in addition to references found in the bibliographies of the tutorial papers cited above. It is a matter of terminology to distinguish between a transform and a subband system as they are two ways of describing the same set of numerical operations from differing points of view. Let x be a column vector whose elements represent a scanning of the image pixels, let X be a column vector whose elements are the array of coefficients resulting from the wavelet transform or subband decomposition applied to x. From the transform point of view, X represents a linear transformation of x represented by the matrix W, i.e., x = Wx. (1) Fig. 1. First stage of a discrete Fig. 2. A two-scale wavelet decomposition wavelet transform 111. ZEROTREES OF WAVELET COEFFICIENTS In this section, an important aspect of low bit rate image coding is discussed: the coding of the positions of those coefficients that will be transmitted as nonzero values. 72 辽宁工程技术大学毕业设计(论文) Using scalar quantization followed by entropy coding, in order to achieve very low bit rates, i.e., less than 1 bit/pel, the probability of the most likely symbol after quantization-the zero symbol-must be extremely high. Typically, a large fraction of the bit budget must be spent on encoding the significance map, or the binary decision as to whether a sample, in this case a coefficient of a 2-D discrete wavelet transform, has a zero or nonzero quantized value. It follows that a significant improvement in encoding the significance map translates into a corresponding gain in compression efficiency. A. Significance Map Encoding To appreciate the importance of significance map encoding, consider a typical transform coding system where a decorrelating transformation is followed by an entropycoded scalar quantizer. The following discussion is not intended to be a rigorous justification for significance map encoding, but merely to provide the reader with a sense of the relative coding costs of the position information contained in the significance map relative to amplitude and sign information. The goal of the transformation is to produce coefficients that are decorrelated. If we could, we would ideally like a transformation to remove all dependencies between samples. Assume for the moment that the transformation is doing its job so well that the resulting transform coefficients are not merely uncorrelated, but statistically independent. Also, assume that we have removed the mean and coded it separately so that the transform coefficients can be modeled as zero-mean, independent, although perhaps not identically distributed random variables. Furthermore, we might additionally constrain the model so that the probability density functions (PDF) for the coefficients are symmetric. B. Compression of Significance Maps using Zero-trees of Wavelet Coeficients To improve the compression of significance maps of wavelet coefficients, a new data structure called a zero-tree is defined. A wavelet coefficient x is said to be insignificant with respect to a given threshold T if 1x1 < T. The zero-tree is based on the hypothesis that if a wavelet coefficient at a coarse scale is insignificant with 73 刘爽:基于EBCOT图像压缩编码算法的研究 respect to a given threshold T, then all wavelet coefficients of the same orientation in the same spatial location at finer scales are likely to be insignificant with respect to T. Empirical evidence suggests that this hypothesis is often true. More specifically, in a hierarchical subband system, with the exception of the highest frequency subbands, every coefficient at a given scale can be related to a set of coefficients at the next finer scale of similar orientation. The coefficient at the coarse scale is called the parent, and all coefficients corresponding to the same spatial location at the next finer scale of similar orientation are called children. For a given parent, the set of all coefficients at all finer scales of similar orientation corresponding to the same location are called descendants. Similarly, for a given child, the set of coefficients at all coarser scales of similar Orientation corresponding to the same location are called ancestors. For a QMF-pyramid subband decomposition, the parent-child dependencies are shown in Fig 4. A wavelet tree descending from a coefficient in subband HH3 is also seen in Fig. 4. With the exception of the lowest frequency subband, all parents have four children. For the lowest frequency subband, the parent-child relationship is defined such that each parent node has three children. Given a threshold level T to determine whether or not a coefficient is significant, a coefficient x is said to be an element of a zero-tree for threshold T if itself and all of its descendents are insignificant with respect to T. An element of a zero-tree for threshold T is a Zero-tree root if it is not the descendant of a previously found zero-tree root for threshold T, i.e., it is not predictably insignificant from the discovery of a zero-tree root at a coarser scale at the same threshold. A zero-tree root is encoded with a special symbol indicating that the insignificance of the coefficients at finer scales is completely predictable. The significance map can be efficiently represented as a string of symbols from a 3-symbol alphabet which is then entropycoded The three symbols used are 1) zero-tree root, 2) isolated zero, which means that the coefficient is insignificant but has some significant descendant, and 3) significant. When encoding the finest scale coefficients, since coefficients have no children, the symbols in the string come from a 2-symbol alphabet, whereby the zero-tree symbol is not used. 74 辽宁工程技术大学毕业设计(论文) As will be seen in Section IV, in addition to encoding the significance map, it is useful to encode the sign of significant coefficients along with the significance map. Thus, in practice, four symbols are used: 1) zero-tree root, 2) isolated zero, 3) positive significant, and 4) negative significant. This minor addition will be useful for embedding. The flow chart for the decisions made at each coefficient are shown in Fig. 6. Note that it is also possible to include two additional symbols such as „„positive/negative significant, but descendants are zero-trees” etc. In practice, it was found that at low bit rates, this addition often increases the cost of coding the significance map. To see why this may occur, consider that there is a cost associated with partitioning the set of positive (or negative) significant samples into those whose descendents are zerotrees and those with significant descendants. If the cost of this decision is C bits, but the cost of encoding a zero-tree is less than C/4 bits, then it is more efficient to code four zero-tree symbols separately than to use additional symbols. Fig. 4. Parent-child dependencies Fig. 5. Scanning order of the subbands for of subbands encoding a significance map Zero-tree coding reduces the cost of encoding the significance map using self-similarity. Even though the image has been transformed using a decorrelating transform the occurrences of insignificant coefficients are not independent events. More traditional techniques employing transform coding typically encode the binary map via some form of run-length encoding . Unlike the zero-tree symbol, which is a single “terminating” symbol and applies to all tree-depths, run-length encoding requires a symbol for each run-length which much be encoded. A technique that is closer in spirit to the zerotrees is the end of- block (EOB) symbol used in JPEG , 75 刘爽:基于EBCOT图像压缩编码算法的研究 which is also a “terminating” symbol indicating that all remaining DCT coefficients in the block are quantized to zero. To see why zerotrees may provide an advantage over EOB symbols, consider that a zero-tree represents the insignificance information in a given orientation over an approximately square spatial area at all finer scales up to and including the scale of the zero-tree root. Because the wavelet transform is a hierarchical representation, varying the scale in which a zero-tree root occurs automatically adapts the spatial area over which insignificance is represented. The EOB symbol, however, always represents insignificance over the same spatial area, although the number of frequency bands within that spatial area varies. Given a fixed block size, such as 8 X 8, there is exactly one scale in the wavelet transform in which if a zero-tree root is found at that scale, it corresponds to the same spatial area as a block of the DCT. If a zero-tree root can be identified at a coarser scale, then the insignificance pertaining to that orientation can be predicted over a larger area. Similarly, if the zero-tree root does not occur at this scale, then looking for zerotrees at finer scales represents a hierarchical divide and conquer approach to searching for one or more smaller areas of insignificance over the same spatial regions as the DCT block size. Thus, many more coefficients can be predicted in smooth areas where a root typically occurs at a coarse scale. Furthermore, the zero-tree approach can isolate interesting non-zero details by immediately eliminating large insignificant regions from consideration. 76 辽宁工程技术大学毕业设计(论文) 附录C #include fndef _EBCOT_H_ #i #define _EBCOT_H_ #include "stdio.h" #include "stdlib.h" #include "mq.h" #define KRUN 9 #define KUNI 18 fine LL #de0 #define LH 1 #define HL 2 #define HH 3 static char SIGNIFICANCE_TABLE1[3][3][5] = { 0,1,2,2,2, 3,3,3,3,3, 4,4,4,4,4, 5,6,6,6,6, 7,7,7,7,7, 7,7,7,7,7, 8,8,8,8,8, 8,8,8,8,8, }; static char SIGNIFICANCE_TABLE2[3][3][5] = { 77 刘爽:基于EBCOT图像压缩编码算法的研究 0,1,2,2,2, 5,6,6,6,6, 8,8,8,8,8, 3,3,3,3,3, 7,7,7,7,7, 4,4,4,4,4, 7,7,7,7,7, 8,8,8,8,8, }; static char SIGNIFICANCE_TABLE3[5][5] = { 0,1,2,2,2, 3,4,5,5,5, 6,7,7,7,7, 8,8,8,8,8, 8,8,8,8,8, }; static char SIGN_TABLE[3][3][2] = { 14,-1, 13,-1, 12,-1, 11,-1, 10,1, 11,1, 12,1, 13,1, 14,1, 78 辽宁工程技术大学毕业设计(论文) }; #define HEIGHT 42 #define WIDTH 51 struct Tile { short int value[HEIGHT][WIDTH]; char sign[HEIGHT][WIDTH]; char sig_state[HEIGHT][WIDTH]; char sig_state1[HEIGHT][WIDTH]; char tilekind; char bp; int tileHeight; int tileWidth; }; struct Tile tile; har Sig(int h,int w) c { // return tile.sig_state[h-1][w-1]+tile.sig_state[h-1][w]+tile.sig_state[h-1][w+1] // + tile.sig_state[h][w-1]+tile.sig_state[h][w+1] // + tile.sig_state[h+1][w-1]+tile.sig_state[h+1][w]+tile.sig_state[h+1][w+1]; return tile.sig_state[h][w-1]+tile.sig_state[h][w+1]; /* int kh=tile.sig_state[h][w-1] + tile.sig_state[h][w+1]; int kv=tile.sig_state[h-1][w] + tile.sig_state[h+1][w]; int kd=tile.sig_state[h-1][w-1] + tile.sig_state[h-1][w+1] + tile.sig_state[h+1][w-1] + tile.sig_state[h+1][w+1]; if(tile.tilekind==HL) return SIGNIFICANCE_TABLE2[kh][kv][kd]; if(tile.tilekind=HH) return SIGNIFICANCE_TABLE3[kd][kh+kv]; return SIGNIFICANCE_TABLE1[kh][kv][kd]; 79 刘爽:基于EBCOT图像压缩编码算法的研究 */ } void Get_KSign_XFlip(int h,int w,char * Ksign,char * Xflip) { int xh=tile.sign[h][w-1]*tile.sig_state[h][w-1]+tile.sign[h][w+1]*tile.sig_state[h][w +1]; int xv=tile.sign[h-1][w]*tile.sig_state[h-1][w]+tile.sign[h+1][w]*tile.sig_state[h+1] [w]; int _xh=min(1,xh)*xh>0?1:-1; int _xv=min(1,xv)*xv>0?1:-1; *Ksign=SIGN_TABLE[_xh+1][_xv+1][0]; *Xflip=SIGN_TABLE[_xh+1][_xv+1][1]; } char Kmag(int h,int w) { char Ksign,Xflip; // return tile.sig_state[h][w]+16; // if(tile.sig_state[h][w]==1) return 17; // Get_KSign_XFlip(h,w,&Ksign,&Xflip); // if(Ksign>0) return 16; return 15; } //---------------------------------------- static char lastSign=1; void Encode_Sign(int h,int w) { if(tile.sign[h][w]==lastSign) { mq_encode(0,10); } 80 辽宁工程技术大学毕业设计(论文) else { mq_encode(1,10); lastSign ^= 1; } /* char Ksign,Xflip; Get_KSign_XFlip(h,w,&Ksign,&Xflip); if(tile.sign[h][w]*Xflip==1) { mq_encode(0,Ksign); } else { mq_encode(1,Ksign); } */ } void Decode_Sign(int h,int w) { int x=mq_decode(10); if(x==0) { tile.sign[h][w]=lastSign; } else { lastSign ^= 1; 81 刘爽:基于EBCOT图像压缩编码算法的研究 tile.sign[h][w]=lastSign; } /* char Ksign,Xflip; Get_KSign_XFlip(h,w,&Ksign,&Xflip); int x=mq_decode(Ksign); if(x==0) { tile.sign[h][w]=Xflip; } else { tile.sign[h][w]=-Xflip; } */ } void SeparateSign() { int w,h; for(h=0; h=0) { tile.sign[h][w]=1; } else { tile.sign[h][w]=0; tile.value[h][w]=-tile.value[h][w]; 82 辽宁工程技术大学毕业设计(论文) } } } void CombinationSign() { int w,h; for(h=0; h=lowLayer) { Pass2(); } length=mq_enc_flush(); //mq_enc_flush(); mq_enc_destroy(); return length; } int Decode(int highLayer,int lowLayer,unsigned char * pStream) { int length=0; if(highLayer=lowLayer) { De_Pass2(); } CombinationSign(); length=mq_dec_len(); mq_dec_destroy(); return length; } unsigned char stream[100000]; int testEBC2() { short int vv[HEIGHT][WIDTH]; int h, w; int count=0,c=1; tile.tilekind=LL; 85 刘爽:基于EBCOT图像压缩编码算法的研究 tile.tileHeight=10; tile.tileWidth=10; memset(tile.value, 0, sizeof(short int )*WIDTH*HEIGHT); tile.value[0][0]=0; tile.value[1][0]=0; tile.value[2][0]=0; tile.value[3][0]=0; tile.value[4][0]=0; tile.value[0][1]=0; tile.value[1][1]=-22; tile.value[2][1]=-1; tile.value[3][1]=18; tile.value[4][1]=-9; for(h=1; h<=tile.tileHeight; h++) for(w=1; w<=tile.tileWidth; w++) { tile.value[h][w]=(h+w)%256; vv[h][w]=tile.value[h][w]; } Encode(7,0,stream); memset(tile.value,0,sizeof( short int )*WIDTH*HEIGHT); Decode(7,0,stream); 86 辽宁工程技术大学毕业设计(论文) for(h=1; h<=tile.tileHeight; h++) for(w=1; w<=tile.tileWidth; w++) { c=vv[h][w]-tile.value[h][w]; if(c!=0) { count++; } } return 0; } #endif 87 刘爽:基于EBCOT图像压缩编码算法的研究 #include "stdafx.h" #include "windowsx.h" #include "math.h" #include "MainFrm.h" #include "DynSplitView2.h" //#include "wavelets.h" //#include "DIP_System.h" #include "WvltTransDib.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif CWvltTransDib::CWvltTransDib() { layer1=FALSE; layer2=FALSE; layer3=FALSE; } CWvltTransDib::~CWvltTransDib() { } void CWvltTransDib::Hangbianhuan() 88 辽宁工程技术大学毕业设计(论文) { int i,j; LONG width,height; BYTE r, g, b; LPBYTE temp1, temp2; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth(); height=this->GetHeight(); int nWidth=width/2; LONG lLineBytes = (width*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[j*lLineBytes+3*i]; g=m_pData[j*lLineBytes+3*i+1]; r=m_pData[j*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j = 0; j < height; j ++) { 89 刘爽:基于EBCOT图像压缩编码算法的研究 for(i = 0; i < nWidth; i ++) { int w = i *2; temp2[j*width+i] = temp1[j*width+w]; //偶 temp2[j*width+nWidth+i] = temp1[j*width+w+1]; //奇 } } //通过图像的差分,完成小波变换 for(j=0; jtemp2[j*width+i]) minVal=temp2[j*width+i]; } } 90 辽宁工程技术大学毕业设计(论文) //计算获取图像小波系数的极值差 difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp2[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[j*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; delete temp2; } void CWvltTransDib::Liebianhuan() { int i,j; LONG width,height; BYTE r, g, b; 91 刘爽:基于EBCOT图像压缩编码算法的研究 LPBYTE temp1, temp2; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth(); height=this->GetHeight(); int nHeight=height/2; LONG lLineBytes = (width*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[j*lLineBytes+3*i]; g=m_pData[j*lLineBytes+3*i+1]; r=m_pData[j*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(i = 0; i < width; i ++) { for(j = 0; j < nHeight; j ++) { int h = j *2 ; temp2[j*width+i] = temp1[h*width+i]; //even 92 辽宁工程技术大学毕业设计(论文) temp2[(nHeight + j)*width+i] = temp1[(h+1)*width+i]; //odd } } //通过图像的差分,完成小波变换 for(i=0; itemp2[j*width+i]) minVal=temp2[j*width+i]; } } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) 93 刘爽:基于EBCOT图像压缩编码算法的研究 { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp2[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[j*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } 删除临时的数据空间 // delete temp1; delete temp2; } void CWvltTransDib::Once() { // Hangbianhuan(); // Liebianhuan(); int i,j; LONG width,height,nWidth,nHeight; BYTE r, g, b; LPBYTE temp1, temp2,temp3; float tpBuffer; short maxVal,minVal,difVal; 94 辽宁工程技术大学毕业设计(论文) width=this->GetWidth(); height=this->GetHeight(); nWidth=width/2; nHeight=height/2; LONG lLineBytes = (width*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; temp3 = new BYTE[height*width]; //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[j*lLineBytes+3*i]; g=m_pData[j*lLineBytes+3*i+1]; r=m_pData[j*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j = 0; j < height; j ++) { for(i = 0; i < nWidth; i ++) { int w = i *2; temp2[j*width+i] = temp1[j*width+w]; //偶 95 刘爽:基于EBCOT图像压缩编码算法的研究 temp2[j*width+nWidth+i] = temp1[j*width+w+1]; //奇 } } //通过图像的差分,完成小波变换 for(j=0; jtemp3[j*width+i]) minVal=temp3[j*width+i]; } } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; 小波经过处理后,放入显示缓存中 // for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp3[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[j*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer; 97 刘爽:基于EBCOT图像压缩编码算法的研究 } } //删除临时的数据空间 delete temp1; delete temp2; delete temp3; layer1=TRUE; } void CWvltTransDib::Twice() { Once(); int i,j; LONG width,height,nWidth,nHeight; BYTE r, g, b; LPBYTE temp1, temp2,temp3; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth()/2; height=this->GetHeight()/2; nWidth=width/2; nHeight=height/2; LONG lLineBytes = (this->GetWidth()*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; temp3 = new BYTE[height*width]; 98 辽宁工程技术大学毕业设计(论文) //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[(j+height)*lLineBytes+3*i]; g=m_pData[(j+height)*lLineBytes+3*i+1]; r=m_pData[(j+height)*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j = 0; j < height; j ++) { for(i = 0; i < nWidth; i ++) { int w = i *2; temp2[j*width+i] = (temp1[j*width+w]); //偶 temp2[j*width+nWidth+i] = (temp1[j*width+w+1]); //奇 } } //通过图像的差分,完成小波变换 for(j=0; jtemp3[j*width+i]) minVal=temp3[j*width+i]; } 100 辽宁工程技术大学毕业设计(论文) } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp3[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[(j+height)*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[(j+height)*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[(j+height)*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; delete temp2; delete temp3; layer2=TRUE; } void CWvltTransDib::Thrice() { Twice(); 101 刘爽:基于EBCOT图像压缩编码算法的研究 int i,j; LONG width,height,nWidth,nHeight; BYTE r, g, b; LPBYTE temp1, temp2,temp3; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth()/4; height=this->GetHeight()/4; nWidth=width/2; nHeight=height/2; LONG lLineBytes = (this->GetWidth()*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; temp3 = new BYTE[height*width]; //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[(j+height*3)*lLineBytes+3*i]; g=m_pData[(j+height*3)*lLineBytes+3*i+1]; r=m_pData[(j+height*3)*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j = 0; j < height; j ++) 102 辽宁工程技术大学毕业设计(论文) { for(i = 0; i < nWidth; i ++) { int w = i *2; temp2[j*width+i] = (temp1[j*width+w]); //偶 temp2[j*width+nWidth+i] = (temp1[j*width+w+1]); //奇 } } //通过图像的差分,完成小波变换 for(j=0; jtemp3[j*width+i]) minVal=temp3[j*width+i]; } } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp3[(height-1-j)*width+i]; tpBuffer-=minVal; 104 辽宁工程技术大学毕业设计(论文) tpBuffer*=255; tpBuffer/=difVal; m_pData[(j+height*3)*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[(j+height*3)*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[(j+height*3)*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; delete temp2; delete temp3; layer3=TRUE; } void CWvltTransDib::IDWT() { if ((layer1==TRUE)||(layer2==TRUE)||(layer3==TRUE)) { if(layer3) IDWT_Thrice(); if(layer2) IDWT_Twice(); if(layer1) IDWT_Once(); } else AfxMessageBox("请先做小波变换。",MB_OK,NULL); } void CWvltTransDib::IDWT_Once() 105 刘爽:基于EBCOT图像压缩编码算法的研究 { int i,j; LONG width,height,nWidth,nHeight; BYTE r, g, b; LPBYTE temp1, temp2,temp3; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth(); height=this->GetHeight(); nWidth=width/2; nHeight=height/2; LONG lLineBytes = (width*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; temp3 = new BYTE[height*width]; memset(temp1,0,height*width); memset(temp2,0,height*width); memset(temp3,0,height*width); //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[j*lLineBytes+3*i]; g=m_pData[j*lLineBytes+3*i+1]; r=m_pData[j*lLineBytes+3*i+2]; 106 辽宁工程技术大学毕业设计(论文) temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j=0; jtemp3[j*width+i]) minVal=temp3[j*width+i]; } } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp3[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[j*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[j*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; 108 辽宁工程技术大学毕业设计(论文) delete temp2; delete temp3; layer1=FALSE; } void CWvltTransDib::IDWT_Twice() { int i,j; LONG width,height,nWidth,nHeight; BYTE r, g, b; LPBYTE temp1, temp2,temp3; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth()/2; height=this->GetHeight()/2; nWidth=width/2; nHeight=height/2; LONG lLineBytes = (this->GetWidth()*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; temp3 = new BYTE[height*width]; memset(temp1,0,height*width); memset(temp2,0,height*width); memset(temp3,0,height*width); //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) 109 刘爽:基于EBCOT图像压缩编码算法的研究 { for( i=0; i<(int)width; i++) { b=m_pData[(j+height)*lLineBytes+3*i]; g=m_pData[(j+height)*lLineBytes+3*i+1]; r=m_pData[(j+height)*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j=0; jtemp3[j*width+i]) minVal=temp3[j*width+i]; } } 计算获取图像小波系数的极值差 // difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp3[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[(j+height)*lLineBytes+3*i] = (BYTE)tpBuffer; 111 刘爽:基于EBCOT图像压缩编码算法的研究 m_pData[(j+height)*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[(j+height)*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; delete temp2; delete temp3; layer2=FALSE; } void CWvltTransDib::IDWT_Thrice() { int i,j; LONG width,height,nWidth,nHeight; BYTE r, g, b; LPBYTE temp1, temp2,temp3; float tpBuffer; short maxVal,minVal,difVal; width=this->GetWidth()/4; height=this->GetHeight()/4; nWidth=width/2; nHeight=height/2; LONG lLineBytes = (this->GetWidth()*3+3)/4 *4; //分配临时数据空间 temp1 = new BYTE[height*width]; temp2 = new BYTE[height*width]; temp3 = new BYTE[height*width]; 112 辽宁工程技术大学毕业设计(论文) memset(temp1,0,height*width); memset(temp2,0,height*width); memset(temp3,0,height*width); //从设备缓存中获得原始图像数据 for(j=0; j<(int)height; j++) { for( i=0; i<(int)width; i++) { b=m_pData[(j+height*3)*lLineBytes+3*i]; g=m_pData[(j+height*3)*lLineBytes+3*i+1]; r=m_pData[(j+height*3)*lLineBytes+3*i+2]; temp1[(height-1-j)*width+i]=(BYTE)(0.3*r+0.59*g+0.11*b); } } for(j=0; jtemp3[j*width+i]) minVal=temp3[j*width+i]; } } //计算获取图像小波系数的极值差 difVal=maxVal-minVal; //小波经过处理后,放入显示缓存中 for(j=0; j<(int)height; j++) { for(i=0; i<(int)width; i++) { //因为小波变换后的小波系数有可能超过255甚至更多,那么就将 114 辽宁工程技术大学毕业设计(论文) //小波系数的范围映射到0~255区间内,以后出现类似的处理,目的都是一样的 tpBuffer=temp3[(height-1-j)*width+i]; tpBuffer-=minVal; tpBuffer*=255; tpBuffer/=difVal; m_pData[(j+height*3)*lLineBytes+3*i] = (BYTE)tpBuffer; m_pData[(j+height*3)*lLineBytes+3*i+1]= (BYTE)tpBuffer; m_pData[(j+height*3)*lLineBytes+3*i+2]= (BYTE)tpBuffer; } } //删除临时的数据空间 delete temp1; delete temp2; delete temp3; layer3=FALSE; } void CWvltTransDib::LowFilter() { int i,j; LONG width,height,nWidth,nHeight; width=this->GetWidth(); height=this->GetHeight(); nWidth=width/2; nHeight=height/2; LONG lLineBytes = (width*3+3)/4 *4; Once(); for(j=0;jnHeight))) { m_pData[j*lLineBytes+3*i] = (BYTE)128; m_pData[j*lLineBytes+3*i+1]= (BYTE)128; m_pData[j*lLineBytes+3*i+2]= (BYTE)128; } } } IDWT_Once(); } void CWvltTransDib::HighFilter() { int i,j; LONG width,height,nWidth,nHeight; width=this->GetWidth(); height=this->GetHeight(); nWidth=width/2; nHeight=height/2; LONG lLineBytes = (width*3+3)/4 *4; Once(); for(j=0;jnHeight)) { m_pData[j*lLineBytes+3*i] = (BYTE)128; m_pData[j*lLineBytes+3*i+1]= (BYTE)128; m_pData[j*lLineBytes+3*i+2]= (BYTE)128; } } } IDWT_Once(); } 117
/
本文档为【基于JPEG2000小波变换原理在图像压缩中的应用--毕业论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索