压缩编码算法
LZW压缩算法的基本概念:LZW压缩有三个重要的对象:数据流(CharStream)、编码流(CodeStream)和编译表(String Table)。在编码时,数据流是输入对象(文本文件的据序列),编码流就是输出对象(经过压缩运算的编码数据);在解码时,编码流则是输入对象,数据流是输出对象;而编译表是在编码和解码时都须要用借助的对象。字符(Character):最基础的数据元素,在文本文件中就是一个字节,在光栅数据中就是一个像素的颜色在指定的颜色列表中的索引值;字符串(String):由几个连续的字符组成; 前缀(Prefix):也是一个字符串,不过通常用在另一个字符的前面,而且它的长度可以为0;根(Root):一个长度的字符串;编码(Code):一个数字,按照固定长度(编码长度)从编码流中取出,编译表的映射值;图案:一个字符串,按不定长度从数据流中读出,映射到编译表条目. LZW压缩算法的基本原理:提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.
② 数据无损压缩算法
所谓无损压缩格式,顾名思义,就是毫无损失地将声音信号进行压缩的音频格式。常见的像MP3、WMA等格式都是有损压缩格式,相比于作为源的WAV文件,它们都有相当大程度的信号丢失,这也是它们能达到10%的压缩率的根本原因。而无损压缩格式,就好比用Zip或RAR这样的压缩软件去压缩音频信号,得到的压缩格式还原成WAV文件,和作为源的WAV文件是一模一样的!但是如果用Zip或RAR来压缩WAV文件的话,必须将压缩包解压后才能播放。而无损压缩格式则能直接通过播放软件实现实时播放,使用起来和MP3等有损格式一模一样。总而言之,无损压缩格式就是能在不牺牲任何音频信号的前提下,减少WAV文件体积的格式。
经常使用的无损压缩算法有 Shannon-Fano 编码,Huffman 编码,行程(Run-length)编码,LZW(Lempel-Ziv-Welch)编码和算术编码等。
Huffman 编码
该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码。它是统计独立信源能达到最小平均码长的编码方法。编码效率高 。
基本原理:
依据信源字符出现的概率大小来构造代码,对出现概率较大的信源字符,给予较短码长,而对于出现概率较小的信源字符,给予较长的码长,最后使得编码的平均码字最短。
编码步骤:
(1)初始化,根据符号概率的大小按由大到小顺序对符号进行排序。
(2)把概率最小的两个符号组成一个节点。
(3)重复步骤2。
(4)从根节点开始到相应于每个符号的“树叶”,从上到下标上“0”(上枝)或者“1”(下枝)至于哪个为“1”哪个为“0”则无关紧要,最后的结果仅仅是分配的代码不同,而代码的平均长度是相同的。
(5)从根节点开始顺着树枝到每个叶子分别写出每个符号的代码。
无损压缩算法有哪些
Huffman编码的注意点:
Huffman编码没有错误保护功能,如果码中有错误,则可能引起接下来的一连串译码错误。
Huffman编码是可变长编码,因此很难随意查找或调用中的文件内容。
Huffman依赖于信源的统计特性。 Huffman编码的每个码字都是整数:因此实际上平均码长很难达到信息熵的大小。
Huffman编码解码必须要有码表,如果消息数目很多,那么
③ 压缩算法原理
哈夫曼
哈夫曼编码是无损压缩当中最好的方法。它使用预先二进制描述来替换每个符号,长度由特殊符号出现的频率决定。常见的符号需要很少的位来表示,而不常见的符号需要很多为来表示。
哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。然而,它并不处理符号的顺序和重复或序号的序列。
2.1 原理
我不打算探究哈夫曼编码的所有实际的细节,但基本的原理是为每个符号找到新的二进制表示,从而通常符号使用很少的位,不常见的符号使用较多的位。
简短的说,这个问题的解决方案是为了查找每个符号的通用程度,我们建立一个未压缩数据的柱状图;通过递归拆分这个柱状图为两部分来创建一个二叉树,每个递归的一半应该和另一半具有同样的权(权是 ∑ N K =1 符号数 k , N 是分之中符号的数量,符号数 k 是符号 k出现的次数 )
这棵树有两个目的:
1. 编码器使用这棵树来找到每个符号最优的表示方法
2. 解码器使用这棵树唯一的标识在压缩流中每个编码的开始和结束,其通过在读压缩数据位的时候自顶向底的遍历树,选择基于数据流中的每个独立位的分支,一旦一个到达叶子节点,解码器知道一个完整的编码已经读出来了。
压缩后的数据流是 24 位(三个字节),原来是 80 位( 10 个字节)。当然,我应该存储哈夫曼树,这样解码器就能够解码出对应的压缩流了,这就使得该例子中的真正数据流比输入的流数据量大。这是相对较短的数据上的副作用。对于大数据量来说,上面的哈夫曼树就不占太多比例了。
解码的时候,从上到下遍历树,为压缩的流选择从左 / 右分支,每次碰到一个叶子节点的时候,就可以将对应的字节写到解压输出流中,然后再从根开始遍历。
2.2 实现
哈夫曼编码器可以在基本压缩库中找到,其是非常直接的实现。
这个实现的基本缺陷是:
1. 慢位流实现
2. 相当慢的解码(比编码慢)
3. 最大的树深度是 32 (编码器在任何超过 32 位大小的时候退出)。如果我不是搞错的话,这是不可能的,除非输出的数据大于 2 32字节。
另一方面,这个实现有几个优点:
1. 哈夫曼树以一个紧密的形式每个符号要求 12 位(对于 8 位的符号)的方式存储,这意味着最大的头为 384 。
2. 编码相当容易理解
哈夫曼编码在数据有噪音的情况(不是有规律的,例如 RLE )下非常好,这中情况下大多数基于字典方式的编码器都有问题。
④ JPEG压缩编码算法的主要步骤是什么其中哪些步骤是有损的,那些是无损的
JPEG压缩编码算法的主要计算步骤如下:
1、正向离散余弦变换(FDCT)。
2、量化(quantization)。
3、Z字形编码(zigzag scan)。
4、使用差分脉冲编码调制(differential pulse code molation,DPCM)对直流系数(DC)进行编码。
5、使用行程长度编码(run-length encoding,RLE)对交流系数(AC)进行编码。
6、熵编码(entropy coding)。
⑤ 应用感知编码的主要压缩编码的方法有哪些
在介绍图象的压缩编码之前,先考虑一个问题:为什么要压缩?其实这个问题不用我回答,你也能想得到。因为图象信息的数据量实在是太惊人了。举一个例子就明白:一张A4(210mm×297mm)幅面的照片,若用中等分辨率(300dpi)的扫描仪按真彩色扫描,其数据量为多少?让我们来计算一下:共有(300×210/25.4)×(300×297/25.4)个象素,每个象素占3个字节,其数据量为26M字节,其数据量之大可见一斑了。如今在Internet上,传统基于字符界面的应用逐渐被能够浏览图象信息的WWW(WorldWideWeb)方式所取代。WWW尽管漂亮,但是也带来了一个问题:图象信息的数据量太大了,本来就已经非常紧张的网络带宽变得更加不堪重负,使得WorldWideWeb变成了WorldWideWait。总之,大数据量的图象信息会给存储器的存储容量,通信干线信道的带宽,以及计算机的处理速度增加极大的压力。单纯靠增加存储器容量,提高信道带宽以及计算机的处理速度等方法来解决这个问题是不现实的,这时就要考虑压缩。压缩的理论基础是信息论。从信息论的角度来看,压缩就是去掉信息中的冗余,即保留不确定的信息,去掉确定的信息(可推知的),也就是用一种更接近信息本质的描述来代替原有冗余的描述。这个本质的东西就是信息量(即不确定因素)。压缩可分为两大类:第一类压缩过程是可逆的,也就是说,从压缩后的图象能够完全恢复出原来的图象,信息没有任何丢失,称为无损压缩;第二类压缩过程是不可逆的,无法完全恢复出原图象,信息有一定的丢失,称为有损压缩。选择哪一类压缩,要折衷考虑,尽管我们希望能够无损压缩,但是通常有损压缩的压缩比(即原图象占的字节数与压缩后图象占的字节数之比,压缩比越大,说明压缩效率越高)比无损压缩的高。图象压缩一般通过改变图象的表示方式来达到,因此压缩和编码是分不开的。图象压缩的主要应用是图象信息的传输和存储,可广泛地应用于广播电视、电视会议、计算机通讯、传真、多媒体系统、医学图象、卫星图象等领域。压缩编码的方法有很多,主要分成以下四大类:(1)象素编码;(2)预测编码;(3)变换编码;(4)其它方法。所谓象素编码是指,编码时对每个象素单独处理,不考虑象素之间的相关性。在象素编码中常用的几种方法有:(1)脉冲编码调制(PulseCodeMolation,简称PCM);(2)熵编码(EntropyCoding);(3)行程编码(RunLengthCoding);(4)位平面编码(BitPlaneCoding)。其中我们要介绍的是熵编码中的哈夫曼(Huffman)编码和行程编码(以读取.PCX文件为例)。所谓预测编码是指,去除相邻象素之间的相关性和冗余性,只对新的信息进行编码。举个简单的例子,因为象素的灰度是连续的,所以在一片区域中,相邻象素之间灰度值的差别可能很小。如果我们只记录第一个象素的灰度,其它象素的灰度都用它与前一个象素灰度之差来表示,就能起到压缩的目的。如248,2,1,0,1,3,实际上这6个象素的灰度是248,250,251,251,252,255。表示250需要8个比特,而表示2只需要两个比特,这样就实现了压缩。常用的预测编码有Δ调制(DeltaMolation,简称DM);微分预测编码(DifferentialPulseCodeMolation,DPCM),具体的细节在此就不详述了。所谓变换编码是指,将给定的图象变换到另一个数据域(如频域)上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的。变换编码有很多,如(1)离散傅立叶变换(DiscreteFourierTransform,简称DFT);(2)离散余弦变换(DiscreteCosineTransform,简称DCT);(3)离散哈达玛变换(DiscreteHadamardTransform,简称DHT)。其它的编码方法也有很多,如混合编码(HybirdCoding)、矢量量化(VectorQuantize,VQ)、LZW算法。在这里,我们只介绍LZW算法的大体思想。值得注意的是,近些年来出现了很多新的压缩编码方法,如使用人工神经元网络(ArtificialNeuralNetwork,简称ANN)的压缩编码算法、分形(Fractl)、小波(Wavelet)、基于对象(ObjectBased)的压缩编码算法、基于模型(Model–Based)的压缩编码算法(应用在MPEG4及未来的视频压缩编码标准中)。
⑥ JPEG压缩编码算法的主要计算步骤哪些对图像的质量有损
JPEG压缩编码算法的主要计算步骤如下:
(1)正向离散余弦变换(FDCT)。 (2)量化(Quantization)。 (3)Z字形编码(Zigzag Scan)。 (4)使用差分脉冲编码调制(Differential Pulse Code Molation,DPCM)对直流系数(DC)进行编码。 (5)使用行程长度编码(Run-Length Encoding,RLE)对交流系数(AC)进行编码。 6)熵编码(Entropy Eoding)。
JPEG是有损编码,是在量化过程中取整而产生的。
⑦ 简述JPEG压缩算法
首先你需要了解几个概念,有损压缩,量化,行程编码。
对一副图片来说,bitmap就是原始格式,没经过任何压缩的。
量化就是把所有0-255的像素值进行归类,然后分成尽量少的积累,这要存储量就小很多了,对于JEPG来说量化是有损压缩的起源。
最后就是对所有的已经归类过的点进行行程编码,然后就压缩完了
⑧ 请高手解释一下编码算法与压缩算法的区别
编码一般利用规则(某个符号用另外某些符号代替)
压缩一般利用字典(某些常用的单词用其它较短符号代替)
⑨ 多媒体数据压缩编码方法可分为哪两大类
无损压缩编码
有损压缩编码
通常解码的运算复杂度低于编码.通过比较解码前后数据的是否一致,把数据编码方法分为无损编码和有损编码2类(即无损压缩和有损压缩)前者是解码前后数据完全一致,没有任何失真和偏差.后者有一定程度偏差和失真,但是没多大影响.常见的压缩算法有信息熵编码(主要有行程长度编码,哈夫曼编码和算术编码),通用编码,预测编码,模型法编码等等.无损压缩的算法一般比较复杂,而且一般的算法多为有损算法.考虑文件和图象的重要型,有时可采用无损压缩,但要注意此种压缩压缩比不会很高.