2.分配码字:码字分配从最后一步开始反向进行,对于每次相加的两个概率,给大的赋0,小的赋1(也可以完全相反,如果两个概率相等,则从中任选一个赋0,另一个赋1),读出时由该符号开始一直走到最后的概率和为1,将路线上所遇到的0和1按最低位到最高位的顺序排好,就是该符号的霍夫曼编码。
3.2霍夫曼压缩思想
由于进行的是无损压缩,所以要扫描图像的所有像素点,压缩过程分为四点:
1.扫描统计像素出现的概率并按大小排列;
2.建立最优二叉树;
3.霍夫曼编码;
4.保存编码。
经过霍夫曼编码后的图像中的不同像素分别用不同长度二进制编码表示,接下来的工作室就是保存重编码后的像素,由于无损压缩中编码前后一副图像的像素点数是相同的,如果仍然以像素为单位保存图像数据就无法实现压缩功能,能够实现压缩是因为编码前后表示像素的二进制编码的位数有所变化。
3.3霍夫曼解码的具体过程
(1).指针指向霍夫曼树的树根;
(2).根据当前一位编码为0或1从而指向左或右儿子节点;
(3).判断该节点的左,右儿子是否是空(即为0)不是则向后扫描一个编码,执行上一步,如是则完成一个解码,该叶子节点的数组下标即为像素值,继续解下一个。
3.4霍夫曼图像压缩算法运行结果及性能评价
1.霍夫曼编码对于e盘根目录下的图5.jpg的压缩结果如下图
2.针对运行结果我们要从三个方面来评价Huffman的性能:
(1)压缩比的大小;
(2)恢复效果的好坏,也就是能否尽可能的恢复原始数据;
(3)算法的简单易用性以及编、解码的速度。
首先分析一下对压缩比的影响因素(不同的著作中对压缩比的定义不尽相同,这儿我们采用如下定义:压缩比等于压缩之前的以比特计算的数据量比上压缩之后的数据量)。对于Huffman编码来说,我们因为要用额外的位保存和传输Huffman树而“浪费”掉一些存储位,也就是说,为了编、解码的方便,我们把本已减少的数据量又增加了一些。如果文件比较大的话,这一点多余的数据根本算不了什么,所占比例很小。但是,如果压缩的文件本来就很小的话,那么这笔数据就很可观了。一般来说,经典的Huffman算法的压缩比不是很高,这是无损压缩的“通病”。 第二点就不用说了,由于它是无损压缩,能够完全恢复压缩之前图像的本来面貌。这样一来,对较大的文件进行编码时,频繁的磁盘读写访问必然会降低数据编码的速度,如果用于网络的话,还会因此带来一些延时,不利于实时压缩和传输。另外,Huffman算法的编码和解码的速度是不对称的,解码快于编码,因为解码不需要生成Huffman树的环节。
总结
图像压缩编码的目的是以尽量少的比特数表征图像,同时保持复原图像的质量,使他符合预定应用场合的要求。压缩数据量,提高有效性是图像压缩编码的首要目的,通常把图像压缩编码简称为图像编码。
通过这次的学习我了解到数据压缩有两种基本类型:无损压缩和有损压缩。通常我们对“离散”的数据采用无损压缩技术,比如文本文件、字处理文件、应用程序等。有损压缩技术在压缩时会丢失一些信息,压缩后不能完全恢复出所有信息。而实际上,对于音频,图像和视频数据,我们人类可以感知的信息阀值是有限的,有选择的丢弃部分频率成分会产生更好的压缩比。
而对于压缩算法有霍夫曼编码、算术编码、行程编码等。本文主要讨论和利用的是霍夫曼编码。通过本次毕业设计,我对此种编码方法理解更加深入。本设 计基于VC++6.0开发环境采用win32 控制台应用程序设计而成。 VC++数字图像压缩算法研究与实现(HUFFMAN编码)(5):http://www.751com.cn/jisuanji/lunwen_632.html