图像压缩算法的分析与研究本科毕业设计论文

图像压缩算法的分析与研究本科毕业设计论文
图像压缩算法的分析与研究本科毕业设计论文

图像压缩算法的分析与研究本科毕业设计论文

河南理工大学

本科毕业设计

图像压缩算法的分析与研究

摘? 要

随着多媒体技术和通讯技术的不断发展, 多媒体娱乐、信息高速公路等不断对信息数据的存储和传输提出了更高的要求, 也给现有的有限带宽以严峻的考验, 特别是具有庞大数据量的数字图像通信, 更难以传输和存储, 极大地制约了图像通信的发展, 因此图像压缩技术受到了越来越多的关注。图像压缩的目的就是把原来较大的图像用尽量少的字节表示和传输,并且要求复原图像有较好的质量。利用图像压缩, 可以减轻图像存储和传输的负担, 使图像在网络上实现快速传输和实时处理。

本文主要介绍数字图像处理的发展概况,图像压缩处理的原理和特点,对多种压缩编码方法进行描述和比较,详细讨论了Huffman编码的图像压缩处理的原理和应用。

关键词:图像处理,图像压缩,压缩算法,图像编码,霍夫曼编码

Abstract

With the developing of multimedia technology and communication technology, multimedia entertainment, information, information highway have kept on data storage and transmission put forward higher requirements, but also to the limited bandwidth available to a severe test, especially with large data amount of digital image communication, more difficult to transport and storage, greatly restricted the development of image communication, image compression techniques are therefore more and more attention. The purpose of image compression is to exhaust the original image less the larger the bytes and transmission, and requires better quality of reconstructed images. Use of image compression, image storage

and transmission can reduce the burden of making the network fast image transfer and real-time processing.

This paper mainly introduces the development situation of the digital image processing, the principle and feature of image compression processing , and the variety of compression coding method was described and compared, detailedly discussed the principle and application of compression processing based on Huffman

Keywords: Image Processing,Image Compression,Compression algorithm,Image Coding,Huf.fman

目录

1.数字图像处理概述 5

1.1数字图像处理发展概况5

1.2数字图像处理主要研究的内容 6

1.3数字图像处理的基本特点7

2.图像压缩8

2.1图像压缩技术概述 8

2.2图像数据压缩原理 8

2.3.图像压缩编码 9

2.3.1霍夫曼编码9

2.3.2行程编码11

2.3.3算术编码11

2.3.4预测编码11

2.3.5变换编码12

2.3.6其他编码12

3 哈夫曼编码的图像压缩14

3.1 需求分析14

3.2 设计流程图14

3.3 哈弗曼树的构造15

3.4 图像压缩的具体实现 16

3.4.1 Huffman压缩类的接口与应用16

3.4.2 压缩类的实现20

4 运行结果显示及其分析28

4.1 结果显示: 28

4.2 结果分析: 30

总结31

参考文献32

致谢34

1.数字图像处理概述

1.1数字图像处理发展概况数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为一门学科大约形成于20世纪60年代初期。早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。图像处理中,输入的是质量

低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。首次获得实际成功应用的是美国喷气推进实验室(JPL)。他们对航天探测器徘徊者7号在1964年发回的几千张月球照片使用了图像处理技术,如几何校正、灰度变换、去除噪声等方法进行处理,并考虑了太阳位置和月球环境的影响,由计算机成功地绘制出月球表面地图,获得了巨大的成功。随后又对探测飞船发回的近十万张照片进行更为复杂的图像处理,以致获得了月球的地形图、彩色图及全景镶嵌图,获得了非凡的成果,为人类登月创举奠定了坚实的基础,也推动了数字图像处理这门学科的诞生。在以后的宇航空间技术,如对火星、土星等星球的探测研究中,数字图像处理技术都发挥了巨大的作用。数字图像处理取得的另一个巨大成就是在医学上获得的成果。1972年英国EMI公司工程师Housfield发明了用于头颅诊断的X射线计算机断层摄影装置,也就是我们通常所说的CT(Computer Tomograph)。CT的基本方法是根据人的头部截面的投影,经计算机处理来重建截面图像,称为图像重建。1975年EMI公司又成功研制出全身用的CT装置,获得了人体各个部位鲜明清晰的断层图像。1979年,这项无损伤诊断技术获得了诺贝尔奖,说明它对人类作出了划时代的贡献。与此同时,图像处理技术在许多应用领域受到广泛重视并取得了重大的开拓性成就,属于这些领域的有航空航天、生物医学工程、工业检测、机器人视觉、公安司法、军事制导、文化艺术等,使图像处理成为一门引人注目、前景远大的新型学科。随着图像处理技术的深入发展,从70年代中期开始,随着计算机技术和人工智能、思维科学研究的迅速发展,数字图像处理向更高、更深层次发展。人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。很多国家,特别是发达国家投入更多的人力、物力到这项研究,

取得了不少重要的研究成果。其中代表性的成果是70年代末MIT的Marr提出的视觉计算理论,这个理论成为计算机视觉领域其后十多年的主导思想。图像理解虽然在理论方法研究上已取得不小的进展,但它本身是一个比较难的研究领域,存在不少困难,因人类本身对自己的视觉过程还了解甚少,因此计算机视觉是一个有待人们进一步探索的新领域。

1.2数字图像处理主要研究的内容

数字图像处理主要研究的内容有以下几个方面:

1 图像变换由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。2图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。3图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立"降质模型",再采用某种滤波方法,恢复或重建原来的图像。4图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中

的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。5图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。6图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。

1.3数字图像处理的基本特点

1).目前,数字图像处理的信息大多是二维信息,处理信息量很大。如一幅256×256低分辨率黑白图像,要求约64kbit的数据量;对高分辨率彩色512×512图像,则要求768kbit数据量;如果要处理30帧/秒的电视图像序列,则每秒要求500kbit~22.5Mbit数据量。因此对计算机的计算速度、存储容量等要求较高。

2)数字图像处理占用的频带较宽。与语言信息相比,占用的频带要大几个数量级。如电视图像的带宽约5.6MHz,而语音带宽仅为4kHz左右。所以在成像、传输、存储、处理、显示等各个环节的实现上,技术难度较大,成本亦高,这就对频带压缩技术提出了更高的要求。3)数字图像中各个像素是不独立的,其相关性大。在图像画面上,经常有很多像素有相同或接近的灰度。就电视画面而言,同一行中相

邻两个像素或相邻两行间的像素,其相关系数可达0.9以上,而相邻两帧之间的相关性比帧内相关性一般说还要大些。因此,图像处理中信息压缩的潜力很大。

4)由于图像是三维景物的二维投影,一幅图象本身不具备复现三维景物的全部几何信息的能力,很显然三维景物背后部分信息在二维图像画面上是反映不出来的。因此,要分析和理解三维景物必须作合适的假定或附加新的测量,例如双目图像或多视点图像。在理解三维景物时需要知识导引,这也是人工智能中正在致力解决的知识工程问题。5)数字图像处理后的图像一般是给人观察和评价的,因此受人的因素影响较大。由于人的视觉系统很复杂,受环境条件、视觉性能、人的情绪爱好以及知识状况影响很大,作为图像质量的评价还有待进一步深入的研究。另一方面,计算机视觉是模仿人的视觉,人的感知机理必然影响着计算机视觉的研究。例如,什么是感知的初始基元,基元是如何组成的,局部与全局感知的关系,优先敏感的结构、属性和时间特征等,这些都是心理学和神经心理学正在着力研究的课题。

数字图像处理的再现性好,处理精度高,适用面宽,灵活性高,而图像是人类获取和交换信息的主要来源,因此,图像处理的应用领域必然涉及到人类生活和工作的方方面面。随着人类活动范围的不断扩大,图像处理的应用领域也将随之不断扩大。

2.图像压缩?

2.1图像压缩技术概述

图像压缩就是减少表示数字图像时需要的数据量。是指以较少的比特有损或无损地表示原来的像素矩阵的技术,也称图像编码。

在我们的生活中无论是普通人还是一些工作在科研领域的科技工作者,都

会对数据信息进行传输与存储有所接触。随着数字时代的到来,影像的制作、处理和存储都脱离了传统的介质(纸、胶片等),相比传统方式,数字图像有着传统方式无法比拟的优越性。但是每种技术出现的同时,都有制约其发展的一面。比如数字电视、遥感照片、由雷达、飞机等提供的军事侦察图像、可视电话、会议电视和传真照片,在教育、商业、管理等领域的图文资料、CT 机、X 射线机等设备的医用图像、天气云图等等,无论是利用哪种传输媒介进行传输的信息,都会都会遇到需要对大量图像数据进行传输与存储的问题。而对大量图像数据进行传输要保证其传输的质量、速度等,对其进行存储也要考虑其大小容量等。所以,要解决大量图像数据的传输与存储,在当前传输媒介中,存在传输带宽的限制,故在一些限制条件下传输尽可能多的活动图像,如何能对图像数据进行最大限度的压缩,并且保证压缩后的重建图像能够被用户所接受等问题,就成为研究图像压缩技术的问题之源。

图像数据之所以可以进行压缩,主要是因为一般原始图像数据是高度相关的,都含有大量的冗余信息。图像压缩编码的目的就是消除各种冗余,并在给定的畸变下用尽量少的比特数来表征和重建图像,使它符合预定应用场合的要求。

2.2图像数据压缩原理

由于图像数据之间存在这一定的冗余,所以使得数据的压缩成为可能。信息论的创始人Shannon 提出把数据看作是信息和冗余度(redundancy)的组合。所谓冗余度是由于一副图像的各像素之间存在着很大的相关性,可利用一些编码的方法删去它们,从而达到减少冗余压缩数据的目的。为了去掉数据中的冗余,常常要考虑信号源的统计特性,或建立信号源的统计模型。

图像的冗余包括以下几种:

●空间冗余:像素点之间的相关性;

●时间冗余:活动图像两个连续帧之间的冗余;

●信息熵冗余:单位信息量大于其熵;

●结构冗余:区域上存在非常强的纹理结构;

●知识冗余:有固定的结构,如人的头像;

●视觉冗余:某些图像的失真是人眼不易觉察的。

对数字图像进行压缩通常利用两个基本原理:一是数字图像的相关性。在图像的同一行相邻象素之间,相邻象素之间,活动图像的相邻帧的对应象素之间往往存在很强的相关性,去除或减少这些相关性,也即去除或减少图像信息中的冗余度也就实现了对数字图像的压缩。帧内象素的相关称做空域相关性。相邻帧间对应象素之间的相关性称做时域相关性。二是人的视觉心理特征。人的视觉对于边缘急剧变化不敏感视觉掩盖效应,对颜色分辨力弱,利用这些特征可以在相应部分适当降低编码精度而使人从视觉上并不感觉到图像质量的下降,从而达到对数字图像压缩的目的。

2.3.图像压缩编码

目前图像编码压缩的方法很多,其分类方法根据出发点不同而有差异。根据解压重建后的图像和原始图像之间是否具有误差,图像编码压缩分为无误差编码和有误差编码两大类。无损编码中删除的仅仅是图像数据中冗余的数据,经解码重建的图像和原始图像没有任何失真,常用于复制、保存十分珍贵的历史、文物图像等场合;有损编码是指解码重建的图像与原图像相比有失真,不能精确的复原,但视觉效果基本相同,是实现高压缩比的编码方法,数字电视、图像传输和多媒体等常采用这类编码方法。

图像压缩技术:

A:无损压缩:a.霍夫曼编码b.行程编码c.算术编码

B:有损压缩:a.预测编码 b.变换编码c.其他编码

2.3.1霍夫曼编码

Huffman编码在无损压缩的编码方法中,它是一种有效的编码方法。它是霍夫曼博士在1952 年根据可变长最佳编码定理提出的。依据信源数据中各信号出现的频率分配不同长度的编码。其基本思想是在编码过程中,对出现频率越高的值,分配越短的编码长度,相应地对出现频率越低的值则分配较长的编码长度,它是一种无损编码方法。采用霍夫曼编码方法的实质是针对统计结果对字符本身重新编码,而不是对重复字符或重复子串编码,得到的单位像素的比特数最接近图像的实际熵值。

例如,在英文中,e的出现概率很高,而z的出现概率则最低。当利用哈夫曼编码对一篇英文进行压缩时,e极有可能用一个位bit来表示,而z则可能花去25个位(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个位。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。

例如:假设信源符号为【a、b、c、d、e、f、g】,其出现的概率相应的为【0.25、0.025、0.025、0.05、0.35、0.25、0.05】,一共7个字符,对其进行huffman 编码,算法如下:

首先按照每个字符出现的频率大小从左到右排列:0.35、0.25、0.25、0.05、0.05、0.025、0.025;选出最小的两个值作为叶子节点构成一棵二叉树,值较大的

叶子节点在左,两个叶子节点对应的频率之和作为根节点。把原排列中最小的两个节点删除,新的根节点插入排列保持大小从左到右的排列顺序不变;重复执行2),直到最后得到值为1 的根节点。得到一棵huffman 树,如下图所示: 图 2.1

在得到的huffman 树上左分支标记1,右分支标记0,所有的字符根据其频率标记到对应的叶子节点上,从根节点到叶子节点路径上遇到的0、1 字符串即为对应叶子节点所在字符的编码。a、b、c、d、e、f、g七个字符的huffman 编码分别是:10、0001、0000、0011、11、01、0010,可以看到,符号只能出现在树叶上,任何一个字符的路径都不会是另一字符路径的前缀路径。

2.3.2行程编码

行程编码又称RLE压缩方法,其中RLE是Run-Length-Encoding的缩写,这种缩写方法广泛用于各种图像格式的数据压缩处理中,是最简单的压缩图像方法之一。

行程编码技术是在给定的图像数据中寻找连续重复的数值,然后用两个字符值取代这些连续值。例如,有一串字母表示的数据为“aaabbbbccccdddedddaa”经过行程编码处理可表示为“3a4b4c3d1e3d2a”。这种方法在处理包含大量重复信息的数据时可以获得很好的压缩效率。但是如果连续重复的数据很少,则难获得较好的压缩比。而且甚至可能会导致压缩后的编码字节数大于处理前的图像字节数。所以行程编码的压缩效率与图像数据的分布情况密切相关。

2.3.3算术编码

??算术编码与霍夫曼编码方法相似,都是利用比较短的代码取代图像数据中出现比较频繁的数据,而利用比较长的代码取代图像数据中使用频率比较低的数据从而达到数据压缩的目的。其基本思想是将被编码的数据序列表示成0

和 1 之间的一个间隔(也就是一个小数范围),该间隔的位置与输入数据的概率分布有关。信息越长,表示间隔就越小,因而表示这一间隔所需的二进制位数就越多(由于间隔是用小数表示的)。算术压缩算法中两个基本的要素为源数据出现的频率以及其对应的编码区间。其中,源数据的出现频率、编码区间则决定算术编码算法最终的输出数据。

2.3.4预测编码

预测编码方式是目前应用比较广泛的编码技术之一。预测编码中典型的压缩方法有脉冲编码调制(PCM,Pulse Code Modulation)、差分脉冲编码调制(DPCM,Differential Pulse Code Modulation)、自适应差分脉冲编码调制(ADPCM,Adaptive Differential Pulse Code Modulation)等,它们较适合于声音、图像数据的压缩,因为这些数据由采样得到,相邻样值之间的差相差不会很大,可以用较少位来表示。通常,图像的相邻像素值具有较强的相关性,观察一个像素的相邻像素就可以得到关于该像素的大量信息。这种性质导致了预测编码技术。采用预测编码时,传输的不是图像的实际像素值(色度值或亮度值),而是实际像素和预测像素值之差,即预测误差。预测编码分为无失真预测编码和有失真预测编码。无失真预测编码是指对预测误差不进行量化,所以不会丢失任何信息。有失真编码要对预测误差进行量化处理,而量化必然要产生一定的误差。

2.3.5变换编码

预测编码认为冗余度是数据固有的,通过对信源建模来尽可能精确地预测源数据,去除图像的时间冗余度。但是冗余度有时与不同的表达方法也有很大的关系,变换编码是将原始数据“变换”到另一个更为紧凑的表示空间,去除图像的空间冗余度,可得到比预测编码更高的数据压缩。

变换编码是将图像时域信号变换到系数空间(频域)上进行处理的方法。在时域空间上具有很强相关的信息,在频域上反映出在某些特定的区域内能量常常被集中在一起或者是系数矩阵的分布具有某些规律,从而可以利用这些规律分配频域上的量化比特数而达到压缩的目的。变换编码的目的在于去掉帧内或帧间图像内容的相关性,它对变换后的系数进行编码,而不是对图像的原始像素进行编码。

先对信号进行某种函数变换, 从一种信号(空间)变换到另一信号(空间)然后再对变换后的信号进行编码。比如将时城信号变换到频域,就是因为声音和图像的大部分信号都是低频信号,在频域中信号能比较集中,换为频域信号后再进行采样、编码,可以达到压缩数据的效果。可以看出预测编码和变换编码相比:预测编码主要在时空域上进行,变换编码则主要在变换域上进行。采用变换编码的有DEF(傅立叶变换)、DTC(离散余弦变换等)。

2.3.6其他编码

LZW 编码:LZW(Lempel-Ziv-Welch Encoding)编码原理是将每一个字节的值都要与下一个字节的值配成一个字符对,并为每个字符对设定一个代码。当同样的一个字符对再度出现时,就用代号代替这一字符对,然后再以这个代号与下个字符配对。LZW 编码原理的一个重要特征是,代码不仅仅能取代一串同值的数据,也能够代替一串不同值的数据。在图像数据中若有某些不同值的数据经常重复出现,也能找到一个代号来取代这些数据串。在此方面,LZW 压缩原理是优于RLE 的。

矢量量化编码:利用相邻图像数据间的高度相关性,将输入图像数据序列分组,每一组m个数据构成m维矢量,一起进行编码,即一次量化多个点。矢量量

化编码属于有损压缩编码,它的缺点是复杂度随矢量维数呈指数增加,数据量和计算量都很大。子带编码的基本思想是使用一组带通滤波器把输入图像的傅立叶频谱分成若干个连续的频段,每个频段称为子带。对每个子带中的图像信号采用单独的编码方案去编码。采用对每个子带分别编码的优点是:第一,对每个子带信号分别进行自适应控制,量化阶的大小可以按照每个子带的能量电平加以调节。具有较高能量电平的子带用大的量化阶去量化,以减少总的量化噪声。第二,可根据每个子带信号在感觉上的重要性,对每个子带分配不同的位数,用来表示每个样本值。例如,在低频子带中,为了保护图像的边缘轮廓结构,就要求用较小的量化阶、较多的量化级数,即分配较多的位数来表示样本值。而图像中的噪声及图像的细节,通常出现在高频子带中,对它分配较少的位数。第三,各子带的量化噪声都局限在本子带内,即使某个子带内的信号能量较小,也不会被其他子带的量化噪声掩盖掉。

3 哈夫曼编码的图像压缩

3.1 需求分析

设计目标是实现Huffman压缩的编码器。编码器的工作过程呢个如下;首先读入待压缩的源文件,为保证与源文件信息完全一致,对文件的读写操作都用二进制文件的方式进行。与这只偶那个方式对应的是ASCII方式读写。然后建立并分析字母表,对读入内存的源文件我们以字节为单元进行分析,将类型表示,其用C++内建的CHAR,最多将有256中可能的字符。我们对每种字符的出现频度进行统计,以频度作为建立Huffman树的权值。频度表建好之后,就可以根据前述算法建立Huffman树,对出现的每种字符进行Huffman编码。此入时,再次读入源文件,逐字节编码,将得到的编码流写入到磁盘文件。

可以看出编码的核心是Huffman树,它也是连接编码的纽带。考虑到Huffman树节点的设计。编码时从叶节点逐步构建中间节点,到整颗树。树的节点应该应该包括的信息有:节点表示的字符,子字节的位置,字符出现的频度,父节点的位置等,这些都是构造Huffman所需要的。而解码时,我们只需要能够根据位序列从树的根节点循次遍历到叶节点,叶节点保留其表示的字符,这就足够了。

3.2 设计流程图本设计目的是为了实现图像压缩,霍夫曼算法是实现此目的关键步骤。因此本设计流程图是以霍夫曼为中心展开叙述的。流程图如图3-1所示。

需求分析

构建Huffman树

设计Huffman压缩类的接口

设计Huffman压缩类

结果显示

测试及分析

图3-1流程图

3.3 Huffman数的构造

基类设计如下:

// NIL 表示一个空子树

const short NIL -1;

// 压缩文件中Huffman树的节点对象

class DiskHuffNode

public:

// 存储的字符

unsigned char ch;

// 子节点的指针(索引)

short left;

short right;

DiskHuffNode unsigned char c 0, short lptr NIL, short rptr NIL: chc, leftlptr, rightrptr

;

// 单个字符的最大位码大小

const int BITSIZE 255;

typedef bitset BitCode;

// 构建Huffman树的节点

// 压缩算法使用这些属性以及基类DiskHuffNode建立节点

// 此类中的属性在解压缩算法中并不需要

class HuffNode: public DiskHuffNode

public:

int freq;// f字符ch的出现频度

int index;// 自身节点在树中的索引

int parent;// 自身节点的父节点

int numberOfBits;// ch的Huffman编码的bit数目

BitCode bits; // 放置Huffman码的bitset容器

HuffNode unsigned char c 0, short lptr NIL, short rptr NIL, int

f 0, int indx NIL, int p 0,

int numBits 0, int SizeOfBits BITSIZE:

DiskHuffNodec, lptr, rptr, freqf, indexindx,

parentp, numberOfBitsnumBits, bits0

// “”和“”运算符是构建最大优先级队列和最小优先级队列必须的

friend bool operator const HuffNode& lhs, const HuffNode& rhs

return lhs.freq rhs.freq;

friend bool operator const HuffNode& lhs, const HuffNode& rhs

return lhs.freq rhs.freq;

;

3.4 图像压缩的具体实现

3.4.1 Huffman压缩类的接口与应用

本设计设计了Hcompress类来执行文件的压缩操作,文件hufcomp.cpp是使用Hcompress类进行压缩的主程序。

Hcompress类的声明如下:

class HCompress

public:

HCompressconst string& fname, bool v false;

// 构造函数。调用setFile 打开源文件fname,

// 生成二进制输出文件并添加后缀".huf"标识,任何先前的扩展名都被替换

// 逻辑标志v确定是否输出进度消息

void setFileconst string& fname;

// 打开源文件fname,生成二进制输出文件以".huf"为后缀void compress;

// 压缩文件

void dispCompRatio const;

// 显示压缩比

int size const;

// 返回Huffman树中节点数目

void displayTree const;

// 显示Huffman树

// 考虑屏幕尺寸,当树大小 11时推荐这样做

private:

fstream source;

fstream dest;

// 输入输出流

vector charFreq, charLoc;

// charFreq用于统计字符频率

// charLoc维护文件出现的字符在Huffman树中的下标

int numberLeaves;

// numberLeaves是树的叶节点(字符节点)数目

short treeSize;

// 压缩文件中Huffman树节点数目

vector tree;

// 存储Huffman树

bool verbose;

// 输出进度消息否?

unsigned long fileSize;

// 源文件的大小

unsigned long totalBits;

// 源文件的压缩镜像中使用的总bits数目

bool oneChar;

// 树仅有一个唯一字符么?

bool filesOpen;

// 源和目的文件打开了么?

void freqAnalysis;

// 判断源文件中字符频度并将它们存储到charFreq

// 同时确定numberLeaves,并列出fileSize

// 这样我们可以看出压缩算法的效果

void buildTree;

// 构造Huffman树void generateCodes;

// 对每个叶节点,沿Huffman树上溯以确定每个字符的Huffman码// 并计算被压缩数据的总位数

void writeCompressedData;

// 再次读入源文件

相关主题
相关文档
最新文档