压缩与熵编码
- 格式:pdf
- 大小:371.65 KB
- 文档页数:57
通信网络中的数据压缩与编码算法数据压缩与编码算法在通信网络中起着重要的作用。
随着互联网的快速发展,数据传输的速度和效率变得至关重要。
为了实现高效的数据传输,通信网络中的数据压缩和编码算法应运而生。
本文将就数据压缩与编码算法在通信网络中的应用进行讨论,并介绍一些常见的压缩和编码算法。
一、数据压缩的概念与分类数据压缩是指通过某种算法或方法,将原始数据转换为经过压缩的数据,以减少存储空间或传输带宽的占用。
根据压缩过程中的信息丢失程度,数据压缩可以分为有损压缩和无损压缩两种类型。
1. 有损压缩有损压缩是指在压缩过程中会丢失一定数量的原始数据信息,从而实现更高的压缩比。
常见的有损压缩算法包括JPEG(Joint Photographic Experts Group)和MP3(MPEG-1 Audio Layer 3)等。
2. 无损压缩无损压缩是指在压缩过程中不会丢失任何原始数据信息,完全可以还原成原始数据。
常见的无损压缩算法包括ZIP和GZIP等。
二、数据编码的概念与分类数据编码是指将数据按照一定的规则转换成特定的编码形式。
根据编码方式的不同,数据编码可以分为传统编码和熵编码两种类型。
1. 传统编码传统编码是指通过固定长度的编码方式来表示不同的数据,常见的传统编码方式有ASCII码和Unicode码等。
传统编码通常只能表示有限数量的字符,无法对海量数据进行高效的编码。
2. 熵编码熵编码是一种根据数据出现概率进行编码的方式,通过将出现频率较高的数据用较短的编码表示,出现频率较低的数据用较长的编码表示,从而提高编码效率。
常见的熵编码算法有霍夫曼编码和算术编码等。
三、数据压缩与编码算法的应用数据压缩与编码算法广泛应用于通信网络中的数据传输过程,旨在提高通信效率和降低网络带宽的占用。
以下是几种常见的算法应用:1. 图像压缩在图像传输过程中,为了减少数据量,使用有损压缩算法如JPEG 可以有效地压缩图像数据。
JPEG算法通过量化、离散余弦变换和熵编码等步骤,将图像数据转换为压缩后的形式。
数据压缩原理数据压缩是一种常见的数据处理技术,通过对数据进行压缩可以减少存储空间的占用,提高数据传输的效率,以及节省网络带宽。
数据压缩原理是指通过某种算法或编码方式,对原始数据进行处理,使其在占用空间上变得更小,但又能够在解压缩后还原为原始数据。
本文将介绍数据压缩的原理以及常见的压缩算法。
数据压缩的原理主要包括两种方法,有损压缩和无损压缩。
有损压缩是指在压缩数据的过程中,会丢失一部分数据信息,但在实际应用中,这部分信息对整体数据的表达并不会造成明显的影响。
常见的有损压缩算法有JPEG、MP3等。
而无损压缩则是在压缩数据的过程中,不会丢失任何信息,通过一定的编码方式使得数据在解压缩后完全还原为原始数据。
常见的无损压缩算法有Huffman编码、LZW算法等。
在实际应用中,数据压缩算法的选择需要根据具体的需求来进行。
如果对数据的精确性要求较高,那么就需要选择无损压缩算法;如果对数据的精确性要求不高,而对压缩比较看重,那么就可以选择有损压缩算法。
在实际应用中,常常会根据数据的特点和应用的场景来选择合适的压缩算法。
除了有损压缩和无损压缩之外,数据压缩还可以根据压缩的原理来进行分类。
按照压缩原理的不同,数据压缩可以分为字典压缩、算术编码、熵编码等。
字典压缩是指通过建立一个字典,将数据中的重复部分进行替换,从而达到压缩数据的目的。
算术编码是一种将符号串映射到实数区间的编码方式,通过对数据进行编码,可以达到较高的压缩比。
而熵编码是一种基于信息熵的编码方式,通过对数据的统计特性进行编码,可以达到较高的压缩效果。
总的来说,数据压缩是一种非常重要的数据处理技术,它可以在存储和传输数据时起到重要的作用。
通过选择合适的压缩算法和原理,可以达到较高的压缩比,从而节省存储空间和提高数据传输的效率。
在实际应用中,需要根据具体的需求来选择合适的压缩算法和原理,以达到最佳的压缩效果。
压缩算法的分类
压缩算法的分类可以根据不同的标准和角度进行。
以下是一些常见的分类方式:
1.有损压缩和无损压缩:根据压缩后数据是否可逆,可以分为有损和无
损压缩。
无损压缩能够完全还原原始数据,而有损压缩则无法完全还原,会丢失一些数据。
2.熵编码和非熵编码:根据是否利用数据本身存在的冗余和相关性,可
以分为熵编码和非熵编码。
熵编码是一种无损压缩方法,它利用数据本身存在的冗余和相关性进行压缩;而非熵编码则是一种有损压缩方法,它通过去除数据中的冗余和相关性来压缩数据。
3.字典编码和算术编码:根据使用数据的存储方式,可以分为字典编码
和算术编码。
字典编码将出现过的字符串存入字典中,并用位置来代替这些字符串;而算术编码则是将数据表示为一个范围在0到1之间的概率值。
4.单独压缩和联合压缩:根据是否针对单个文件进行压缩,可以分为单
独压缩和联合压缩。
单独压缩是对单个文件进行压缩,而联合压缩则是将多个文件组合在一起进行压缩。
5.基于预测的压缩和基于统计的压缩:根据使用数据的不同方法,可以
分为基于预测的压缩和基于统计的压缩。
基于预测的压缩利用前一个或多个数据点的值来预测当前数据点的值,并去除预测误差来压缩数据;而基于统计的压缩则是利用数据的概率分布来进行压缩。
这些分类方式只是其中的一部分,根据不同的标准还可以将压缩算法分为更多类别。
了解压缩算法的不同分类方式有助于更好地选择和应用适当的算法。
jpeg 压缩原理JPEG(Joint Photographic Experts Group)是一种常见的图像压缩格式,广泛应用于数字摄影、网页设计、图像传输等领域。
JPEG 压缩原理是一种有损压缩方法,通过舍弃图像中的一些细节信息,以减少图像文件的大小,从而实现压缩的目的。
JPEG压缩原理主要包括离散余弦变换(DCT)、量化和熵编码三个步骤。
JPEG使用离散余弦变换(DCT)将图像从空域转换到频域。
DCT 将图像分解成一系列频率分量,这些频率分量代表了图像中不同频率的变化。
高频分量通常代表了图像中的细节信息,而低频分量则代表了图像的整体结构。
通过DCT变换,JPEG将图像转换为一系列频率分量的系数,从而为后续的压缩操作提供了基础。
接下来,JPEG使用量化操作对DCT系数进行处理。
量化是一种将连续数值转换为离散数值的过程,它通过将频率分量系数除以一个固定的量化矩阵中的对应元素,得到一个整数值。
量化过程中,高频分量的系数经过除以较大的量化值,从而减小了它们的数值,而低频分量的系数经过除以较小的量化值,保留了更多的信息。
这就导致了高频分量的细节信息丢失,从而实现了图像压缩。
JPEG使用熵编码对量化后的系数进行编码。
熵编码是一种根据数据出现的概率进行编码的方法,它将出现概率较高的数据用较短的编码表示,而将出现概率较低的数据用较长的编码表示。
JPEG使用基于哈夫曼编码的熵编码方法,根据不同系数的出现概率分配不同的编码,从而进一步减小了图像文件的大小。
总结起来,JPEG压缩原理通过离散余弦变换将图像转换到频域,然后通过量化和熵编码来减小图像文件的大小。
这种有损压缩方法能够在保持图像质量的前提下,显著减小图像文件的大小,从而实现更高效的图像传输和存储。
然而,需要注意的是,JPEG压缩是一种有损压缩方法,会引入一定的失真。
压缩比越高,图像质量损失越大。
因此,在实际应用中,需要根据具体要求和场景来选择合适的压缩比,以平衡图像质量和文件大小的关系。
熵编码码率【原创实用版】目录1.熵编码的定义与原理2.熵编码的作用与应用领域3.码率的概念与计算方法4.码率与熵编码的关系5.熵编码与码率在数据压缩中的重要性正文1.熵编码的定义与原理熵编码是一种数据压缩技术,通过对数据进行编码,使其在存储和传输过程中所占的空间减小。
熵编码的原理是基于信息论中的熵概念,即数据中的不确定性。
通过去除数据中的冗余信息,可以有效降低数据的熵,从而达到压缩的目的。
2.熵编码的作用与应用领域熵编码在很多领域都有广泛的应用,如通信、图像处理、音频处理等。
在通信领域,熵编码技术可以有效地降低数据传输的带宽需求,从而提高通信系统的性能。
在图像和音频处理领域,熵编码技术可以大幅度地减小数据量,方便存储和传输。
3.码率的概念与计算方法码率是指在单位时间内传输的比特数,通常用来衡量数据传输的速度。
码率的计算方法是将传输数据的总比特数除以传输时间。
在数据压缩中,码率也可以用来衡量压缩效果,即在压缩后的数据中,每秒钟需要传输的比特数。
4.码率与熵编码的关系码率与熵编码有密切的关系。
熵编码技术的目标是降低数据的熵,从而减小数据量。
在码率一定的情况下,熵越低,压缩效果越好。
反之,如果熵编码技术不能有效降低数据的熵,那么码率就会变得很高,导致传输时间和存储空间增加。
5.熵编码与码率在数据压缩中的重要性熵编码与码率在数据压缩中起着关键作用。
通过熵编码技术,可以在保证数据质量的前提下,降低数据的熵,从而减小数据量。
合适的码率可以确保在压缩数据的同时,不会影响数据的传输和存储效率。
无损压缩行程编码熵编码
无损压缩是指在压缩数据的同时不丢失任何信息的压缩算法。
行程编码和熵编码都是无损压缩算法的一种。
行程编码是一种基于数据中连续出现的重复项的压缩方法。
它通过记录数据中连续出现的相同项的个数来实现压缩。
例如,在一串数据中,如果有多个连续的相同字符,行程编码可以用一个字符和该字符连续出现的次数来进行表示,从而减少数据的存储空间。
熵编码是一种基于信息熵原理的压缩方法。
它通过将出现频率高的符号用较短的编码表示,出现频率低的符号用较长的编码表示,从而实现数据的压缩。
熵编码根据数据的统计特性来决定每个符号的编码长度,以使得数据的平均编码长度最小化。
行程编码和熵编码经常结合使用,以达到更好的压缩效果。
行程编码可以有效地压缩连续重复的数据,而熵编码可以进一步减少数据的存储空间,提高压缩比。
常见的无损压缩算法如LZ77、LZW等就是基于行程编码和熵编码的思想。
熵编码的几种方法
熵编码是一种常见的数据压缩方法,它通过利用信息源的统计特性,将出现概率较高的符号用较短的编码表示,从而实现数据压缩的目的。
下面将介绍几种常见的熵编码方法。
1. 霍夫曼编码:霍夫曼编码是一种最为广泛应用的熵编码方法。
它通过构建霍夫曼树来生成编码表,将频率较高的符号赋予较短的编码,频率较低的符号赋予较长的编码。
由于霍夫曼编码是无前缀编码,因此可以唯一地解码。
2. 遍历编码:遍历编码是一种简单直观的熵编码方法。
它按照符号出现的顺序进行编码,每个符号的编码长度相等。
遍历编码适用于符号出现概率相近的情况,编码效率会有所降低。
3. 均衡编码:均衡编码是一种分布均匀的熵编码方法。
它将总体编码长度分配给出现概率较高的符号,使得编码平均长度较短,同时保持解码的唯一性。
均衡编码适用于符号概率分布相对均匀的情况。
4. 自适应编码:自适应编码是一种根据数据源实时统计信息进行动态调整的熵编码方法。
它根据当前的统计信息动态更新编码表,适应符号概率的变化。
自适应编码可以实时调整编码,适用于动态统计信息的场景。
总而言之,熵编码的几种方法各有优劣。
在实际应用中,根据数据的特性和需求,选择合适的熵编码方法可以有效地实现数据的高效压缩和解压缩。
熵编码与码率1. 引言熵编码是一种无损数据压缩技术,它通过利用数据的统计特性来减少数据的冗余度,从而实现对数据的高效编码。
在信息论中,熵被定义为随机变量的不确定性度量,因此熵编码可以看作是一种将高熵(高不确定性)的数据转换为低熵(低不确定性)的过程。
码率是指在单位时间内传输或处理的数据量。
在熵编码中,我们可以通过调整编码算法和参数来控制输出数据的码率。
合理选择编码算法和参数可以实现更高效的压缩,并且在保证解压缩质量不受明显影响的前提下降低传输或存储成本。
本文将详细介绍熵编码和其与码率之间的关系,并讨论常见的熵编码算法及其应用。
2. 熵编码原理2.1 信息熵信息熵是衡量一个随机变量不确定性的度量。
对于离散随机变量X,其信息熵H(X)定义如下:n(x i)log2p(x i)H(X)=−∑pi=1其中,n表示X可能取值的个数,p(x i)表示X取值为x i的概率。
2.2 熵编码基本原理熵编码的基本思想是根据数据的统计特性对数据进行编码。
具体来说,熵编码将出现概率较高的符号用较短的二进制码表示,而将出现概率较低的符号用较长的二进制码表示。
熵编码分为两个阶段:编码和解码。
在编码阶段,根据输入数据的统计特性构建一个概率模型,并将输入数据映射到相应的二进制码。
在解码阶段,根据相同的概率模型将二进制码转换回原始数据。
2.3 算术编码算术编码是一种常见且有效的熵编码算法。
它通过维护一个区间来表示待编码数据的范围,并动态地调整区间大小以逐步确定唯一的二进制序列。
算术编码过程如下:1.初始化区间为[0, 1)。
2.对于每个输入符号,根据当前区间和符号出现概率调整区间大小,并更新区间范围。
3.重复步骤2直到处理完所有输入符号。
4.输出最终确定的二进制序列。
算术编码的码率可以通过调整输入符号的概率分布来控制。
当输入符号的概率分布更平坦时,编码后的二进制序列较长,码率较高;反之,编码后的二进制序列较短,码率较低。
3. 熵编码与码率熵编码在一定程度上可以实现数据压缩,从而降低数据传输或存储成本。
第二篇压缩与编码数字信号的压缩与编码是多媒体的核心技术和重要内容。
第3章中所讲的,音频信号的自适应编码、差分编码和预测编码等,都是典型的压缩编码。
本篇先介绍压缩的基本概念,再讲解可用于静态图像编码的若干常用熵编码压缩算法、基于DCT的JPEG编码、运动图像和伴音的MPEG编码压缩算法、以及当前十分热门的AVC 和AVS编码。
本篇分为如下5章:n 第7章压缩与熵编码n 第8章JPEG编码n 第9章MPEG编码n 第10章H.264/AVC编码n 第11章AVS视频编码多媒体技术基础• 2 •第7章 压缩与熵编码由于多媒体信号的数据量巨大,为了节省存储空间和传输带宽,需进行压缩编码。
多媒体数据的压缩方法,可以分成三大类,其中的熵编码是基础,源编码是重点,而将它们二者相结合的混合编码则是各种编码标准所采用的主要方法。
本章先介绍压缩的基本概念,包括:压缩的需要与可能、算法的特点与分类和一般的编码过程。
然后,在了解熵定义的基础上,讨论若干常用的熵编码算法,包括:Shannon-Fano 编码、Huffman 编码、算术编码、RLE 和可用于GIF 图像编码的LZW 算法。
7.1 压缩概论数据压缩(data compression) ,在电子与通信领域也常被称为信号编码(signal coding),包括压缩和还原(或编码和解码)两个步骤,相关概念的英文单词参见表7-1。
与压缩相关的学科有:信息论、数学、信号处理、数据压缩、编码理论和方法。
7.1.1 压缩的需要与可能由于多媒体信号的数据量巨大,所以需要压缩;同时,由于在多媒体数据中,存在着各种冗余,所以可以压缩。
l 压缩的需要数据量巨大是多媒体信号的特点,例如:n 一幅1024*1024真彩图:1024行 * 1024列 * 3B 彩色 = 3MBn 5分钟的CD 音乐:44100样本 / 秒 * 2B(16b) / 样 * 2声道 * 60秒 * 5分钟 =50.47MBn 90分钟的PAL 视频:625行 * 864列 * 3B 彩色 * 25帧 / 秒 * 60秒 * 90分 = 203.68GB为了节省存储空间(如VCD/DVD 、JPEG/MP3/MP4、多媒体数据库)和传输带宽(HDTV 、因特网、流媒体),以进行实时高质的多媒体通信(如视频/音频点播、网络现场直播、可视电话、视频会议),必须对多媒体数据进行压缩编码。
压缩映射原理压缩映射原理是信息论中的重要概念,用于描述在数据传输中如何通过压缩来减少数据的体积,从而提高传输效率。
压缩映射原理指的是将原始数据通过某种编码方式转换为具有较高压缩比的编码,并在接收端将压缩后的编码进行解码还原为原始数据。
通过压缩映射原理,可以将大量的原始数据进行压缩,从而在数据传输中节省带宽和存储空间。
压缩映射原理是基于信息熵的概念。
信息熵是对信息量的度量,表示一个随机事件所包含的信息量的期望。
在信息论中,通过熵编码的方式可以实现对数据的无损压缩。
熵编码利用随机变量出现的频率来构建编码表,将频率较高的符号用较短的编码表示,频率较低的符号用较长的编码表示,从而实现对数据的高效压缩。
在实际应用中,常用的压缩映射原理有哈夫曼编码和算术编码。
哈夫曼编码是一种基于符号出现频率构建编码表的压缩算法,通过根据频率构建一颗二叉树,并将频率较高的符号编码为树的左子树,频率较低的符号编码为树的右子树,从而实现高效的压缩。
算术编码是一种将符号映射到一个区间的压缩算法,符号出现的频率用来确定符号所对应的区间大小,从而实现高效的压缩。
除了无损压缩,压缩映射原理还可以用于无损压缩。
无损压缩是一种将数据通过某种映射方式进行编码,使得压缩后的数据可以精确无误地还原为原始数据。
无损压缩常用于对文本、图像、音频等数据的压缩。
在无损压缩中,压缩率一般较低,但可以保证数据的完整性和准确性。
在实际应用中,压缩映射原理被广泛应用于网络传输、存储设备和多媒体压缩等领域。
通过使用压缩映射原理,可以大大节省网络传输的带宽,加快数据传输速度;可以节省存储设备的空间,提高数据存储效率;可以有效压缩多媒体数据,提供更高质量的音视频传输。
总之,压缩映射原理是信息论中的重要概念,通过将原始数据通过某种编码方式进行压缩映射,可以实现数据的高效压缩和传输。
压缩映射原理在实际应用中有着广泛的应用,可以改善数据传输的效率,提高存储设备的利用率,同时保证数据的完整性和准确性。
压缩与编码•由于多媒体信号的数据量巨大,为了节省存储空间和传输带宽,需进行压缩编码•多媒体数据的压缩方法,可以分成三大类,其中熵编码是基础,源编码是重点,而将它们二者相结合的混合编码则是各种编码标准所采用的主要方法•本章主要介绍压缩的基本概念和若干常用的熵编码算法•源编码和混合编码将在以后几章中介绍1 压缩概论本节先压缩的基本概念,包括•压缩的需要与可能•算法的特点与分类•一般的编码过程压缩与编码•数据压缩(data compression) 与信号编码(signal coding)往往含义相同–压缩(compress)–解压缩/还原/重构(decompress)–编码(encode/coding)–解码/译码(decode)•相关学科:信息论、数学、信号处理、数据压缩、编码理论和方法1.1 压缩的需要与可能一. 压缩的需要•多媒体信号的数据量巨大,如:–一幅1024*1024真彩图有3MB–5分钟的CD音乐有50.47MB–90分钟的PAL视频数字化后有203.68GB •为了节省存储空间和传输带宽,进行实时高质的多媒体通信,必须对多媒体数据进行压缩编码二. 压缩的可能多媒体数据和人类的感觉存在着各种冗余,如:•空间冗余:图像的相邻像素相关•时间冗余:相邻音频样本/视频帧相关•频率冗余:相邻的频谱值相关,人对高频信号不敏感或分辨率低•听觉冗余:人耳的低音听阈高、强纯音的频率屏蔽、相邻声音的时域屏蔽•视觉冗余:人眼对亮度变化比对色彩的变化更敏感、对高亮区的量化误差不敏感、视网膜分频道1.2 压缩算法的特点与分类一.特点用于多媒体数据的压缩方法众多,可按主要的特点分成不同类型:1. 有/无损–无损压缩:能够无失真地从压缩后的数据重构,准确地还原原始数据。
可用于对数据的准确性要求严格的场合。
如差分编码、RLE、Huffman编码、LZW编码、算术编码–有损压缩:有失真,不能完全准确地恢复原始数据,重构的数据只是原始数据的一个近似。
可用于对数据的准确性要求不高的场合。
如预测编码、音感编码、分形压缩、小波压缩、JPEG/MPEG2. 对称性–若编解码算法的复杂性/所需时间差不多,则为对称的编码方法。
多数压缩算法都是对称的–不对称的一般是编码难而解码容易(如Huffman编码与分形编码)。
但用于密码学的编码方法则相反,是编码容易,而解码则非常非常难3. 帧间/内•在视频编码中会同时用到帧内与帧间的编码方法•帧内编码是指在一帧图像内独立完成的编码方法,同静态图像的编码,如JPEG•而帧间编码则需要参照前后帧才能进行编解码,并在编码过程中考虑对帧之间的时间冗余的压缩,如MPEG4. 实时性•在有些多媒体的应用场合,需要实时处理或传输数据,编解码一般要求延时≤50ms。
这需要简单/快速/高效的算法和高速/复杂的处理芯片5. 分级处理•有些压缩算法可以同时处理不同分辨率、不同传输速率、不同质量水平的多媒体数据,如JPEG2000、MPEG-2/4二.分类1. 熵编码•熵编码(entropy encoding)是一类利用数据的统计信息进行压缩的无语义数据流的无损编码。
如RLE、LZW、Huffman 编码2. 信源编码•(信)源编码(source coding)是一类利用信号原数据在时间域和频率域中的相关性和冗余进行压缩的有语义编码。
种类繁多,可进一步分为–预测编码:利用先前和现在的数据对在时间或空间上相邻的下面或后来的数据进行预测,从而达到压缩的目的。
如DM、ADPCM–变换编码:采用各种数学变换方法,将原时间域或空间域的数据变换到频率域或其他域,利用数据在变换域中的冗余或人类感觉的特征来进行压缩。
如DCT、DWT–分层编码:将原数据在时空域或频率域上分成若干子区域,利用人类感觉的特征进行压缩编码,然后再合并。
如子采样、子带编码–其他编码:如矢量量化、运动补偿、音感编码3. 混合编码混合编码(hybrid coding) = 熵编码+ 源编码大多数压缩标准都采用混合编码的方法进行数据压缩,一般是先利用信源编码进行有损压缩,再利用熵编码做进一步的无损压缩。
如H.261、H.263、JPEG 、MPEG常见编码方法1.3 编码过程一.编码准备•模数转换(A/D):A/D连续模拟信号—à离散数字信号采样/量化•预处理:对得到的初始数字信号进行必要的处理,包括过滤、去噪、增强、修复等,以达到除去数据中的不必要成分、提高信号的信噪比、修复数据的错误等目的二.编解码过程A/D预处理压缩多媒体信号—à数字信号—à处理过的数字信号—à压缩数据(子)采样/量化过滤/去噪/增强/修复源编码/熵编码存储解码D/A—à压缩数据—à重构的数字信号—à显示/播放传输还原/重构(插值)2 熵编码•信息熵为信源的平均信息量(不确定性的度量)•熵编码是一类利用数据的统计信息进行压缩的无语义数据流的无损编码•本节在了解熵定义的基础上,讨论若干常用的熵编码算法,内容有:–7.2.1 熵–7.2.2 Shannon-Fano编码–7.2.3 Huffman编码–7.2.4 算术编码–7.2.5 RLE–7.2.6 LZW算法2.1 熵•熵(entropy)本来是物理的热力学中用来度量热力学系统无序性的(热力学第二定律:孤立系统内的熵恒增):(S 为熵、Q 为热量、T 为绝对温度)对可逆过程,(孤立系统)•信息熵的概念是香农(Shannon 仙农)于1948年在他创建的信息论中引进的,用来度量信息中所含的信息量:其中,H 为信息熵(单位为bit ),S 为信源,p i 为符号s i 在S 中出现的概率∫≥==0 ,TdQ dS T dQ S ∑=ii i p p S H 1log )(2xy 1log 2=xx y 1log 2=•信息熵H 为自信息量I :的均值•例如,一幅用256级灰度表示的图像,如果每一个象素点灰度的概率均为p i =1/256,则即编码每一个象素点都需要8位(I ),平均每一个象素点也需要8位(H )i i p s I 1log )(2=82log 256log 1log 8222==≡=ip I )( 82log 2561256256log 25611log 822550225502bit p p H i i i i =×===∑∑==2.2 Shannon-Fano编码•按照Shannon提出的信息理论,1948年和1949年分别由Shannon和Fano描述和实现了一种被称之为香农-范诺(Shannon-Fano)算法的编码方法,是一种变码长的符号编码•Shannon-Fano算法采用从上到下的方法进行编码:首先按照符号出现的概率排序,然后从上到下使用递归方法将符号组分成两个部分,使每一部分具有近似相同的频数,在两边分别标记0和1,最后每个符号从顶至底的0/1序列就是它的二进制编码例子•有一幅60个象素组成的灰度图像,灰度共有5级,分别用符号A 、B 、C 、D 和E 表示,60个象素中各级灰度出现次数见下•如果直接用二进制编码,则5个等级的灰度值需要3位表示,也就是每个象素用3位表示,编码这幅图像总共需要60 * 3 = 180位。
按照香农理论,这幅图像的熵为H = (20/60)×log2(60/20) + (10/60)×log2 (60/10) +…+ (10/60) ×log2 (60/10) ≈2.189这就是说平均每个符号用2.189位表示就够了,60个象素共需用131.33位,压缩比约为3 / 2.189 ≈1.37 : 1。
按照Shannon-Fano算法,先按照符号出现的频度或概率排序:A、D、B、E、C,然后分成次数相近左右两个部分——AD(35)与BEC(25),并在两边分别标记0和1然后类似地再将AB分成A(20)与B(15)、BEC分成B(10)与EC(15),最后再把EC分成E(10)与C(5):Shannon-Fano算法举例表的压缩比为180/135 = 4/3≈1.33 : 12.3 Huffman编码•Huffman(哈夫曼/赫夫曼/霍夫曼)在1952年提出了另一种从下到上的编码方法,是一种统计最优的变码长符号编码,让最频繁出现的符号具有最短的编码•Huffman编码的过程= 生成一棵二叉树(H 树)–树中的叶节点为被编码符号及其概率–中间节点为两个概率最小符号(串)的并所构成的符号串及其概率所组成的父节点–根节点为所有符号之串及其概率1具体编码步骤•(1) 将符号按概率从小到大顺序从左至右排列叶节点•(2) 连接两个概率最小的顶层节点来组成一个父节点,并在到左右子节点的两条连线上分别标记0和1•(3) 重复步骤2,直到得到根节点,形成一棵二叉树•(4) 从根节点开始到相应于每个符号的叶节点的0/1串,就是该符号的二进制编码•由于符号按概率大小的排列既可以从左至右、又可以从右至左,而且左右分枝哪个标记为0哪个标记为1是无关紧要的,所以最后的编码结果可能不唯一,但这仅仅是分配的代码不同,而代码的长度是相同的Huffman编码例CE(1/4)第1步:0 1C(1/12) E(1/6) B(1/6) D(1/4) A(1/3)CE(1/4) BD(5/12)第2步:0 1 0 1D(1/4) A(1/3)ACE(7/12)0 1第3步:CE(1/4) BD(5/12)0 1 0 1C(1/12) E(1/6) A(1/3) B(1/6) D(1/4)ABCDE(1)0 1ACE(7/12)第4步:0 1CE(1/4) BD(5/12)0 1 0 1C(1/12) E(1/6) A(1/3) B(1/6) D(1/4)符号次数(p i) log2(1/p i) 编码需要的位数A 20 (1/3) 1.585 01 40B 10 (1/6) 2.585 10 20C 5 (1/12) 3.585 000 15D 15 (1/4) 2.000 11 30E 10 (1/6) 2.585 001 30合计60 (1) 12.340 135压缩比也为180/135 = 4/3 ≈1.33 : 1香农-范诺编码与哈夫曼编码•它们都属于不对称、无损、变码长的熵编码。
码长虽然都是可变的,但却都不需要另外附加同步代码(即在译码时分割符号的特殊代码)。
如果事先编写出一本解释各种代码意义的“词典”,即码簿(H表),那么就可以根据码簿一个码一个码地依次进行译码•两个问题值得注意:–没有错误保护功能——在译码时,如果码串中有哪怕仅仅是1位出现错误,则不但这个码本身译错,而且后面的码都会跟着错。