admin 管理员组文章数量: 1184232
2024年4月24日发(作者:webservice客户端是什么)
Technology Application
技术应用
DCW
哈夫曼编码在图像压缩中的应用与分析
吕姣霖,徐 艳
通讯作者
(四川大学锦城学院计算机与软件学院,四川 成都 611731)
摘要:互联网发展以来,在信息传递的过程中,难免会存在由于文件内存占用过大,导致传输效率低下,网络延迟等,
因此文件压缩、图像压缩等技术也逐渐应用于日常生活中。文章以哈夫曼编码为主要编码思想,通过C++语言对编码算法
进行实现,从而对图像压缩的相关技术进行研究,通过哈夫曼编码实现对图像的压缩和对比分析。
关键词:图像压缩;哈夫曼树;哈夫曼编码;C++
doi:10.3969/.1672-7274.2021.01.085
中图分类号:G642;TP3-4 文献标示码:A 文章编码:1672-7274(2020)01-0189-02
0 引言
在各个行业之间进行信息传输时,由于数据、图像
的传输需要占据较大的信道容量,因此在数据、图像传
输的过程中,会由于信道容量的大量被占用,导致网络
卡顿。为了解决这一问题,研究出了文件压缩、图像压
缩等方式,在对数据和图像进行传输之前,首先对其进
行压缩,使其传输过程中只需要占用比较小的内存,在
接收信息后,再对文件和图像等进行解压。本文所研究
的重点是常用的图像压缩技术-哈夫曼编码,通过C++
语言对编码算法进行实现,从而对图像压缩的相关技术
进行研究,通过哈夫曼编码实现对图像的压缩和对比分
析。
1 哈夫曼编码简介
哈夫曼编码出现于19世纪60年代,是国际有效的二
进制编码之一,该方法完全依据字符出现概率来构造异
字头的平均长度最短的码字,被认为是接近于压缩比上
限的最佳编码方法之一
[1]
。哈夫曼编码是常用的编码方
式,亦称为最佳编码、熵编码,适用于无损耗的数据压
缩
[2]
。在使用哈夫曼编码实现对图像的压缩过程中,首
先实现的是对图像中所分解出来的数据进行扫描,计算
出图像上各个像素所出现的概率,并根据各个数据出现
概率的不同,指定哈夫曼编码中的惟一码字与各个不同
概率的像素一一对应,并将所有码字组成哈夫曼码表,
在图像加压的过程中,可以通过压缩时所组成的哈夫曼
码表的对应关系,实现源图像数据的还原。
码由两个子节点和一个根节点构成,算法如下:
(1)定义哈夫曼树节点
哈夫曼树主要由一个根节点和两个子节点,一共三
个节点构成,因此本次哈夫曼树类型的构建一共定义4
个整型成员,分别表示树根节点、左节点、右节点和数量。
(2)构建哈夫曼树
按照哈夫曼树的构建步骤,按照出现概率的大小顺
序对字符进行排序,将字符出现次数最少的两个节点构
成哈夫曼树新的节点,使用循环,不断抽取排序中出现
数量最少的节点,不断合并组成新节点,直到最后只剩
下两组节点,构成最后的二叉树
[3]
。
(3)定义有关图片压缩的功能函数
结合哈夫曼树思想实现图片的压缩功能,通过对本
次系统需要实现的功能进行分析,定义的函数需要实现
创建哈夫曼树、递归、哈夫曼编码转换、计算字节长度、
解析字符串、读取文件、读取图片、复制图片信息、写
入图片等功能。
(4)主函数中调用定义的方法
在主函数中,首先输入图片的路径,读取出图片的
信息,再将读取到的图片的信息进行哈夫曼编码转换,
调用函数对转换后的编码进行排序,调用构建哈夫曼树
函数,构建出与本次图片压缩相关的哈夫曼树
[4]
。最后
调用解析函数,对数据进行解析,并将解析后的数据以
压缩图的形式输出。
2.2 哈夫曼编码实现图像压缩关键代码
在哈夫曼树构建时,对已经排序的编码出现的数量
进行比较,筛选出出现次数最少的字符,在排序长度之
内对字符编码出现的次数进行比较,若当前比较的编码
出现的次数小于当前编码出现的次数,将该编码赋值给
当前标记编码。
在对哈夫曼编码进行处理时,主要调用递归函数中
2 哈夫曼编码实现图像压缩
2.1 哈夫曼编码实现图像压缩算法
本文以C++为基础语言,结合哈夫曼编码的思想,
使编码符号与被压缩的图像数据一一对应,利用二叉树
的构造方法,不断置新新的根节点,使得最终的数据编
作者简介:吕姣霖(1998-) ,女,汉族,四川南充人,本科,研究方向为VR与游戏开发。
通讯作者:徐 艳(1979-),女,汉族,四川宜宾人,教授,硕士研究生,研究方向为网络计算与应用。
2021.01
数字通信世界
189
技术
IGITCW
应用
Technology Application
的方法,获取到图像数据所对应的编码表,并对哈夫曼
树左右子节点相对应的编码进行递归,关键代码如下:
if (nodes[pos].left == -1 && nodes[pos].right == -1) {
table[pos] = bits;
return;
}
buildTable(nodes, r, bits + "1", table);
buildTable(nodes, l, bits + "0", table);
进行哈夫曼编码转换的流程为:先对读取图片所获
得的数组进行初始化,再通过for循环对哈夫曼树所需
要的编码进行遍历,获取到图片对应的所有哈夫曼编码,
对哈夫曼树左右两个子节点依次进行转换。
对创建哈夫曼树所需要的编码进行转换后,创建哈
夫曼树,调用函数获取哈夫曼树编码表,对编码进行遍
历,并将遍历得出的编码存储于编码表文件,关键代码
如下:
int length = buildTree(nodes, counts);
string table[256];
buildTable(nodes, length - 1, "", table);
string table_path = "";
table_path = table_path + writepath + "_table";
fp = fopen(table_path.c_str(), "w");
for (int i = 0; i < 256; i++) {
if (table[i].size() == 0) {
fprintf(fp, "2n");
} else {
fprintf(fp, "%sn", table[i].c_str());
}
}
在使图片数据与哈夫曼编码一一对应,创建好哈夫
曼树后,打开文件,对哈夫曼编码表进行读取,解析哈
夫曼编码中的文件内容。
解析哈夫曼编码中的文件内容后,读取图像压缩后
的文件,并存储读取压缩文件后的信息,将图片压缩后
的信息输出,关键代码如下:
fread(&total_bit_length, sizeof(int), 1, fp);
int times = total_bit_length / 32 + 1;
for (int i = 0; i < times; i++) {
bitset<32> bits(words[i]);
string tmp = _string();
for (int j = 0; j < 32; j++) {
str[cur] = tmp[j];
cur++;
}
}
190
DIGITCW
2021.01
2.3 图片压缩前后对比分析
在完成哈夫曼编码实现对图片压缩功能的程序部分
后,用于测试的图像为如图1所示黑底背景的绿色水壶。
图1 测试图
图1所示测试图通过本次所设计的基于哈夫曼编码
的图像压缩系统进行压缩后,得到压缩图。对测试图原
图和压缩图进行比较后发现,压缩图与原图文件大小基
本一致,且压缩图与原图相比,压缩图的外观形状、大
小等特性与原图相同,可视清晰度也与原图相同。
3 结束语
本文以C++为系统开发的基础语言,以哈夫曼编
码构成哈夫曼树,以及哈夫曼树逆向解码过程为本次图
像压缩系统设计的思想,设计并完成了基于哈夫曼编码
对图片压缩的功能。本文选用测试图对其核心的图片压
缩功能进行了测试,测试图通过本次所设计系统压缩
功能的压缩后,所得到的压缩图与原图文件大小基本一
致,且视觉效果一致。通过对测试图原图与压缩图进行
比较,确定本次所设计的图像压缩功能,具有无损压缩
特性,在压缩的过程中,并不会存在数据的损坏与丢失。
因此通过哈夫曼编码与哈夫曼原理所设计出的图像压缩
系统,也是对需要压缩的图像的数据进行采集,并将采
集后的数据通过哈夫曼编码进行一一转化,使编码符号
与数字字符产生一一对应的关系,而不会因丢失图片的
数据,导致图片的变形或受损
[5]
。
参考文献
[1] 王兆丽, 肖春霞, 王梅娟,等. 哈夫曼编码在图像无损压缩中的应用[J].
计算机工程与科学, 2019(S1).
[2] 杨雨薇, 张亚萍, 李幸刚. 一种改进的JPEG图像压缩编码算法[J]. 云南师
范大学学报:自然科学版, 2016, 36(6):32-39
[3] 田端财, 殷晓丽. 基于哈夫曼编码的图像压缩技术研究[J]. 科技资讯,
2015(8):29-30
[4] 黄福莹, 黄开志. 基于矢量量化和Huffman编码的图像压缩方法[J]. 广西
科学院学报, 2012(4):19-20+25
[5] 王防修, 周康. 通过哈夫曼编码实现文件的压缩与解压[J]. 武汉工业学院
学报, 2017, 27(4):46.
版权声明:本文标题:哈夫曼编码在图像压缩中的应用与分析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1713906199a657051.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论