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.


本文标签: 编码 压缩 进行