当前位置:文档之家› 零树编码算法小波系数

零树编码算法小波系数

零树编码算法小波系数
零树编码算法小波系数

零树编码算法

一零树编码算法的基本思想

众所周知,小波系数的能量集中程度越高,需要编码的系数越少,编码所需的比特数就越少,所以小波压缩都是利用变换分解后的图象能量分布集中这一特性来编码的。小波系数的能量集中程度对图象编码非常重要,而不同层次上,相同空间滤波方向上的小波系数之间的相关性也非常重要。零树编码的基本思想就是基于这种相关性。

经过小波变换后的图象被分解成若干个子频带,其中子带HH是低频分量,是原始图象的平滑版本,子带HL是水平方向上的高频,垂直方向上的低频分量;子带LH是垂直方向上的高频,水平方向的低频分量;子带HH是高频分量,揭示了原始图象在斜方向的边缘信息。

为了提高对小波系数的压缩性能,Jerome M. Shapiro提出了一种新的数据结构零树(zerotree),如果小波系数x的绝对值小于给定的阈值T,则此系数是可以忽略的。零树的方法是基于这样一个假设:如果在较粗的级别上,一个小波系数是小于阈值,可以忽略的,则所有在相同方向,相同位置的更高的级别上的系数也基本上是可以忽略不记的。经验证明这个假设通常是正确的。更特殊的情况下,在一个多级的子带系统里,除了最高频的子带之外,在每一级别的每个系数都是和该系数在更高的级别相同方位的系数集合相对应的,我们把在较粗的级别上的系数叫做父亲,而在所有在更高的级别上相应位置的系数都叫做后代,同样的,对于任一给定的后代,在更粗的级别上相同方位上对应的系数叫做祖先。

对于一个QMF-金字塔算法的子带分解,如图所示,除了最低频的子带之外,所有的父亲结点都有4个儿子,而最低频的结点是有3个儿子。对系数的扫描顺序的原则是不可以有一个儿子结点是在它的父亲结点之前被扫描。对于一个N 级的变换,扫描是先从最低频的子带开始的,这里记作LLn,然后扫描子带HLn,LHn,和HHn,然后扫描第n-1级的系数,以此类推。在金字塔分解中这种扫描模式的图示见下图,可以看到在一个给定的子带每个系数都是在下一个子带的对应系数之前被扫描的。

x和它的所

有后代都小于阈值,则这个系数x可以看作是零树的一个成员,一个零树的根指的是一个零树中的结点,但是它不是任何一个结点的后代,实践证明对于相同的阈值零树的根的分布并没有可预见性。偶们用一种特殊的记号给一个零树的根编码,则它的所有的后代的结点就都可以被忽略不记了。于是所有的系数都可以被归为3类来编码:1)零树的根,2)孤立的零结点,3)重要的点。当给最高级的系数编码时,由于已经没有后代,所以可以不用零树的记号而直接进行编码。在实践中,偶们通常把系数分成4类:1)零树的根,2)孤立的零结点,3)正的重要系数,4)负的重要系数。这个小改进将有利于嵌入。

注意可能还存在着其它两种系数我们没有考虑,那就是“正的/负的

重要系数,但是后代是零树”,在实践中,这种系数点出现的比率很低,为了减少编码的数据量,通常不与考虑。

我的关于零树编码的算法的实现是用C++语言在VC6.0下实现的,所以在解释算法时,涉及到数据结构和算法的流程时,会一C++语言为例来说明零树编码算法的具体实现方法。

二零树的数据结构

在小波变换之后,得到的是每个原始图象的像素坐标对应的小波系数。

我们要把这些系数都定义成零树的结点,除了最低频的和最高频的结点之外,每个结点都有四个子结点,父结点和子结点之间坐标的对应关系是:

父亲(x,y)儿子(2x,2y), (2x+1,2y), (2x,2y+1), (2x+1,2y+1)

每个结点的内容包括该点的小波系数,该点的位置坐标,还有指向该结点四个儿子的指针。如下图所示

具体用C++语言定义的数据机构如下:

typedef struct node *zerotree_pointer;

typedef struct node {

double coeff;

unsigned long x,y;

zerotree_pointer son[4];

};

假设图象经过N次分解,最低频分量最后只剩下一个系数,这个系数就被作为零树的根结点。零树的根结点和上面定义的结点稍有不同,零树的根结点的数据结构如下:

具体用C++语言定义的数据机构如下:

struct root_node {

double root_coeff;

zerotree_pointer LH_son,HL_son,HH_son;

};

三.零树的构造

定义完基本的数据结构之后,要进行的是零树的构造。即根据经过小波变换后的系数值构造出一棵零树来,零树的构造的依据是父亲结点和儿子结点之间存在着位置坐标的的对应关系:

对任何点(x,y){0

父亲(x,y)儿子(2x,2y), (2x+1,2y), (2x,2y+1), (2x+1,2y+1)

根据这种对应关系,我们可以用递归的算法来实现零树构造,我们用类C的语言来描述该算法,Creat_Zerotree(x,y)的功能是构造一个以(x,y)为根结点的零树,算法如下:

Creat_Zerotree(x,y)

{

1.if(x>length/2||y>length/2) return;

2.申请四个新的结点;

3.分别将坐标为(2x,2y), (2x+1,2y), (2x,2y+1), (2x+1,2y+1)的

小波系数添入新申请的结点;

4.将(x,y)结点的四个儿子指针指向新建立的四个结点;

5.Creat_Zerotree(2x,2y);

6. Creat_Zerotree(2x+1,2y);

7.Creat_Zerotree(2x,2y+1);

8.Creat_Zerotree(2x+1,2y+1);

9.Return;

}

四.零树的遍历(扫描算法)

在图象编码中,扫描算法是很重要的,直接影响到编码和解码的时间复杂度,根据小波系数的分布特点,低频的部分是能量集中的区域,所以要先给低频的分量编码,扫描顺序也是应该是从低频到高频,这个顺序如图所示,图的扫描顺序对应于零树的遍历顺序,因为整个编码解码过程我们都是在对零树进行操作,如果说要按照先由低频到高频的顺序扫描的话,对应于零树就是遍历的时候,对任何一个结点,在它的父结点被访问之前,它

都不可以被访问,即要按树层次从最顶层到最底层的顺序,一层层的遍历,这在数据结构里叫做平序遍历(level order),所以对图象的扫描过程其实就是对零树的平序遍历过程。

平序遍历的是通过一个队列来实现的,队列的特点是先进先出。这个队列存放的都是指向结点的指针。遍历的时候最先访问的是根结点,然后把根结点的儿子结点都压入队列,下一个要访问的结点就是最先进入队列的那个结点,也就是说,从队列中取出一个元素,作为下一个访问的对象。访问之后,仍然是把该结点的所有儿子结点都压入队列(如果访问到最底层的结点时就没有儿子结点就不需要对队列进行操作),这样一直进行下去,直到

队列为空,就证明所有的结点都被访问过了一遍。使用这个队列的目的是为了使每个父亲都能在儿子被访问之前被访问到。具体的算法如下:

1.Add_queue(HL_son); //将HL_son加入队列;

2.Add_queue(LH_son);//将LH_son加入队列;

3Add_queue(HH_son);//将HH_son加入队列;

for(;;)

{

root_node=delete_queue(); //从队列中取出一个结点;

if(!IsEmpty_queue()) //当队列不为空的时候

{

map_code(root_node); //访问该结点;

for(int i=0;i<4;i++)

{

if(root_node->son[i]) //将该结点的四个儿子结点的指针加入队列中;

Add_queue(root_node->son[i]);

}

}

else

{ map_code(queue[front]); //访问最后一个结点;

break;

}

}

上述算法不仅在对图象进行扫描的时候被用到,而且在图象的解码,还有判断一个结点是否是零树的根的时候都要用到,具体差异会在以后提到。

五.零树的编码算法

在确定了扫描的顺序之后,我们就可以开始真正的编码过程,在零树的遍历过程中,就是每访问到一个结点,就对这个结点进行判断,是否要进行编码。正像在前面提到的那样,我们最后要把有用的结点分成4类:1)正的重要的结点;2)负的重要的结点;3)零树的根;4)孤立的零结点。正的和负的结点就是指大于设定的阈值的点,零树的根是指该点小于阈值,而且它的所有后代也都是小于阈值的,这样我们就可以只对该点进行编码,而忽略所有它的后代,孤立的零结点是指,该结点是小于阈值的,但是它的后代中有大于阈值的重要的结点存在;为了便于操作,我定义了一个双向链表来存放编码后的数据,这个双向链表的数据定义如下:

#define POS 1

#define NEG 2

#define IZ 3

#define ZTR 4

typedef struct table_node *table_pointer;

typedef struct table_node {

double Coeff_value; //结点的小波系数;

short unsigned Symbol; //结点的分类标记;

table_pointer llink; //链表的左指针;

table_pointer rlink; //链表的右指针;

}

Symbol是该结点属于上述四类需要编码的结点中的哪一类的标记。有了这个双向链表,我们就可以开始给零树进行扫描编码,每访问一点,如果是要编码的结点,我们就把它加到双向链表中去。下面是编码的流程图如下:

从上面的流程可以看出,编码的过程是先对一个结点进行访问,判断它是否大于阈值,如果大于阈值的话,它就是重要的结点,需要被编码,根据它的正负特性来决定Symbol就可以了,如果它是小于阈值的话,情况要复杂一些,我们要先来判断它的后代是否有大于阈值的点,这个过程是用一个叫做search_descend(zerotree_pointer root_node)的函数来实现的,它的原理也是遍历以root_node为根结点的零树,如果遇到大于阈值的点就返回ture,如果没有的话

就返回false。通过判断我们可以直到该结点是零树的根,还是孤立的零结点。然后做好标记存到双向链表中。

值得注意的是,在对零树进行编码的过程,其实也是对零树进行修剪的过程,如果一个结点是零树的根的话,那么它的所有后代都可以忽略不记,我们就可以在这里把该结点的所有儿子指针置空,零树就被剪掉了一枝,这样不断的修剪整棵树。需要遍历的结点会不断减少。可以大大提高算法的复杂程度。

读到双向链表中的数据最后是要串行化到磁盘文件中去的,这个过程不是我们讨论的重点,值得注意的是,双向链表中只有coeff和symbol是需要串行化的

数据,而且必须按照链表原来的顺序存放,这样才可以正确的解压缩,因为我们并没有保存每个结点的位置信息,所以只能靠扫描编码的顺序来解压缩。这样做的好处是可以减少存放每个点位置的信息,使压缩比更高。

六.零树的解码算法

解码的过程是编码的逆过程,我们要把存在磁盘文件中的数据按照原来的顺序再从新读到双向链表map_table中去,然后根据这个双向链表来重建零树。再由零树来恢复出原来的小波变换后的图象,再通过小波变换的逆变换来恢复原

图。

在解码过程中,零树的重建过程是关键所在,因为只要能把零树重建起来,我们就可以把结点一个个添回到原图像中去,而零树的重建的关键是要找出各个结点的位置坐标,因为要把现有的双向链表中的数据填充回去,最难的就是不知道每个结点的位置,不直到该把哪个点添到哪里去,所以就必须按找链表存放的顺序来重建零树,来恢复原图。

在图象的编码中,我们是用平序来遍历整棵树的,所以在零树的重建中,我们也要按平序来重建这棵树,也就是说,要从最高层到最低层,一层层的恢复原来的零树,并且在恢复的同时,根据零树的父亲和儿子的位置坐标的对应关系来把每个结点的位置信息也填充进去。这个过程同样要用到一个队列,来调度结点的生成顺序。

因为要恢复的零树只能是修剪过的零树,原来完整的零树已经在压缩时被修剪了,不可能全部恢复出来,所以这棵树并不规则,因为凡是遇到零树的根结点(ZTR),该结点的儿子就要置空。

具体的过程是这样的:从链表头开始读数据,第一个结点就是零树的根结点,它的坐标显然是(0,0),然后第二个是HL_son,坐标是(1,0),然后是LH_son(0,1)

和HH_son(1,1)这三个儿子结点的数据填充到零树中去之后,再把指向他们的指针压入队列,然后又开始了和解码过程相反的过程,从队列中取出一个结点,假设该结点的位置坐标是(x,y),判断链表当前指针(current)指向的结点的symbol,如果是ZTR的话,就把从队列中取出的结点的四个儿子指针都置空,如果不是ZTR的话,就申请四个新的结点作为该结点的四个儿子,把它们的位置分别置为(2x,2y),(2x+1,2y),(2x,2y+1),(2x+1,2y+1)。然后再把它们都插入队列中去。然后再从队列中取下一个点,重复该过程,直到把整个链表访问了一遍为止。这个算法的流程图如下:

零树构造出来以后,就可以根据它来填充原来的小波系数矩阵,这个也要遍历整棵树,这个遍历过程可以用任何一种遍历方法,不一定要用前面的平序,用最简单的后序遍历就可以了。每访问一个结点,就把它的系数按照它的位置坐标填充回系数矩阵。这样解码过程就完成了。

七.Zerotree类简介

嵌入式小波零树(EZW)算法

首先根据实际需要确定扫描次数D=codeDim,然后进行D次主扫描和辅扫描。 1、初始化 首先获取扫描次序表scanlist,表中每行的数字依次是该元素的(1)扫描序号、(2)对应于数据矩阵中位置的行号r、(3)对应于数据矩阵中位置的列号c、(4)值Mat(r,c),即 scanlist (i) = [ i, r, c, Mat(r,c) ]编码扫描的对象就是次序表scanlist,而非数据矩阵Mat。然后构建初始符号矩阵flagMat,其中每个元素均为字符“Z”。 2、主扫描 在第d次(1<= d <=codeDim)扫描中,输入阈值为T(d),首先依次对次序表的每一行scanlist(i)按照如下步骤扫描: (1)如果上一次扫描得到的flagMat中,处于位置(r,c)的符号为“O”,则表示相应的Mat(r,c)是重要的,不需要通过本次扫描再次编码,故作跳过处理。 (2)将scanlist(i,4)(即Mat(r,c))的绝对值与阈值T(d) 比较,如果是重要的系数,则令flagMat(r,c)的值为P或N,并存入主扫描表scancode中,并将Mat(r,c)的值以及相应的行、列数(r,c)存入重要数列表imptvalue中,将符号P或N存入重要数符号列表imptflag中。(3)如果是不重要的系数,则首先检查flagMat(r,c),若是符号“X”,则表示这个点是不重要的,作跳过处理不再扫描。

(4)如果点(r,c)处于第一分解级,即r>row/2或c>col/2,没有子孙系数,且其系数是不重要的,则该点flagMat的符号为Z,存入主扫描表scancode中。 (5)如果点(r,c)满足r=threshold if scanlist(i,4)>=0 flaglist(scanlist(i,2),scanlist(i,3))='P'; scancode=[scancode 'P']; imptvalue=[imptvalue;abs(scanlist(i,4)),scanlist(i,2),scanlist(i,3)]; imptflag=[imptflag 'P'];

零树编码算法小波系数

零树编码算法 一零树编码算法的基本思想 众所周知,小波系数的能量集中程度越高,需要编码的系数越少,编码所需的比特数就越少,所以小波压缩都是利用变换分解后的图象能量分布集中这一特性来编码的。小波系数的能量集中程度对图象编码非常重要,而不同层次上,相同空间滤波方向上的小波系数之间的相关性也非常重要。零树编码的基本思想就是基于这种相关性。 经过小波变换后的图象被分解成若干个子频带,其中子带HH是低频分量,是原始图象的平滑版本,子带HL是水平方向上的高频,垂直方向上的低频分量;子带LH是垂直方向上的高频,水平方向的低频分量;子带HH是高频分量,揭示了原始图象在斜方向的边缘信息。 为了提高对小波系数的压缩性能,Jerome M. Shapiro提出了一种新的数据结构零树(zerotree),如果小波系数x的绝对值小于给定的阈值T,则此系数是可以忽略的。零树的方法是基于这样一个假设:如果在较粗的级别上,一个小波系数是小于阈值,可以忽略的,则所有在相同方向,相同位置的更高的级别上的系数也基本上是可以忽略不记的。经验证明这个假设通常是正确的。更特殊的情况下,在一个多级的子带系统里,除了最高频的子带之外,在每一级别的每个系数都是和该系数在更高的级别相同方位的系数集合相对应的,我们把在较粗的级别上的系数叫做父亲,而在所有在更高的级别上相应位置的系数都叫做后代,同样的,对于任一给定的后代,在更粗的级别上相同方位上对应的系数叫做祖先。 对于一个QMF-金字塔算法的子带分解,如图所示,除了最低频的子带之外,所有的父亲结点都有4个儿子,而最低频的结点是有3个儿子。对系数的扫描顺序的原则是不可以有一个儿子结点是在它的父亲结点之前被扫描。对于一个N 级的变换,扫描是先从最低频的子带开始的,这里记作LLn,然后扫描子带HLn,LHn,和HHn,然后扫描第n-1级的系数,以此类推。在金字塔分解中这种扫描模式的图示见下图,可以看到在一个给定的子带每个系数都是在下一个子带的对应系数之前被扫描的。 x和它的所

嵌入式小波零树编码压缩

嵌入式小波零树(EZW)算法的过程详解和Matlab代码(3)解码过程收藏 1、初始化 (1)全局初始化:包括获取扫描次序列表scanorder,初始化符号矩阵flagMat,创建以下几个空表:重要系数重构列表recvalue,量化器编号列表rIlist,上一次解码用到的辅扫描表qu antiflagOld。 (2)每级扫描的初始化:获取本级解码需要的主扫描表scancode和辅扫描表quantiflag。创建解码矩阵DecodeMat,量化符号列表编号qrNum,主扫描表扫描编号scNum。 2、构造逆量化器 (1)逆量化器包括两个部分,一是量化值部分,与编码程序中的量化器函数代码相同;二是量化器编号列表rIlist的构造,这个是难点和重点,把它构造出来,才能解码出重要系数的数值。(2)以下是编码过程中经过4次扫描产生的辅扫描表quantiflag和量化器编号列表rIlist: Q:0 1 1 R:1 1 1 Q:1 1 1 1 0 0 0 1 1 0 R:2 3 3 1 1 1 1 1 1 1 Q:1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 1 0 R:5 7 7 3 2 2 2 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Q:0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1 1 1 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 0 1…… R:11 14 15 7 4 5 4 6 7 4 2 3 3 2 2 3 3 2 2 2 3 2 3 2 3 2 2 3 2 3 2 3 3 2 2 2 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1…… 仔细观察可以发现两者之间存在一种函数关系: 以第一级扫描产生的三个量化符号(0,1,1)为例,其编号列表为(1,1,1),在随后的第

嵌入式零树小波EZW编码及其算法改进

嵌入式零树小波EZW编码及其算法改进 在基于小波变换的1. 嵌入式零树小波编码算法EZW 1. 1 算法原理: 内嵌编码[1](embedded coding)就是编码器将待编码的比特流按重要性的不同进行排序,根据目标码率或失真度大小要求随时结束编码;同样,对于给定 码流解码器也能够随时结束解码,并可以得到相应码流截断处的目标码率的恢 复由一副EZW 算法利用小波系数的特点较好地实现了1) 零树预测 一副经过小波变换的定义一个零树的数据结构:一个小波系数x,对于 一个给定的门限T,如果|x| 2) 用零树结构编码重要重要3) 逐次逼近量化(Successive-Approximation Quantization,SAQ) 内嵌编码的核心在于采用了逐次逼近的量化方法(SAQ)。SAQ 按顺序使 用了一系列阈值T0、T1,┄,TN-1 来判决重要性,其中Ti=Ti-1/2,初始阈值 T0 按如下条件选择,OXjO2T0,其中Xj 表示所有变换系数。 在编(译)码过程中,始终保持着两个分离的列表:主表和辅表。主表对 应于编码中的不重要的集合或系数,其输出信息起到了恢复各重要值的空间位 置结构的作用,而辅表是编码的有效信息,输出为各重要系数的二进制值。编 码分为主、辅两个过程:在主过程中,设定阈值为Ti,按上述原理对主表进行扫 描编码,若是重要系数,则将其幅值加入辅表中,然后将该系数在数组中置为零,这样当阈值减小时,该系数不会影响新零树的出现;在辅过程中,对辅表中 的重要系数进行细化,细化过程类似于比特平面编码。对阈值Ti 来说,重要系 数的所在区间为[Ti,2Ti],若辅表中的重要系数位于[Ti,3Ti/2],则用符号0 表示,否则用符号1 表示。编码在两个过程中交替进行,在每个主过程前将阈值减半。

零树小波图像压缩

零树小波图像压缩专题(1) 默认分类 2008-06-14 20:05:49 阅读51 评论0字号:大中小订阅 前几天我们讨论了几种简单的小波图像压缩方案,不过这些技术都比较粗糙,效率低。现在我们从小波编码起步,探讨几种高效的小波压缩方案。 信号的传输和处理少不了编码技术的支持,信号编码可以极大地压缩信息量,增强抗干扰能力等。同样地,小波变换作为一种信号处理技术,也有其独特的编码结构。在《基于小波变换的图像压缩技术初探》一文中,我们提到,二维小波变换具有塔式结构,如图1 图1 那么这种塔式结构里,小波系数和相应的位置信息的组织关系是怎样的呢?仔细观察图1,我们可以发现,各个子图像(或称子频带)之间组成了一个从低频带指向高频带的树状结构,如图2所示: 图2

图2中,以HH3单个元素为根形成的子孙树,从它们的方向和空间位置可以看出,这种小波树中,各级分解子带的系数之间存在很大的相似性!基于这一性质,Lewis和Knowles在1992年提出了小波零树编码算法。这种算法的一大特点,也是一大缺点,即量化后系数为0的系数的子孙系数也置0。这种一刀切的处理很容易把重要的子孙系数忽略掉,故L-K零树编码算法存在一定的不足。 零树小波图像压缩专题(2)——EZW算法的原理步骤 默认分类 2008-06-14 20:08:33 阅读99 评论0字号:大中小订阅 如果一个小波系数被量化为0,而它存在一个子孙量化后不为0,则这个点称为孤立零点。适应孤立零点的情况而改进的零树编码算法就称为嵌入式零树小波编码算法,简称EZW 算法,是Shapiro在1993年提出的。 对于一个阈值T,若小波系数x满足|x| >= T ,则称x关于T是重要的系数,反之称x关于T是不重要的系数;若x是不重要的系数,并且其所有子孙都是不重要的,则称x是关于T的零树根;若x本身是不重要的系数,但它存在重要的子孙,则称x是关于T的孤立零点。 对于给定的阈值,EZW算法下图所示的Z型顺序扫描、处理小波系数(扫描顺序有两种:raster、Morton)。

小波用于编码―――零树编码方案-Read

小波用于编码 ――― 零树编码方案 1 小波变换应用于图像压缩编码 用小波变换的方法进行图像数据的压缩编码是变换编码的一种,将时域信号变换到小波域后会得到一个多分辨率、能量集中的系数空间。能量越集中,系数被压缩的程度就越大。 早在小波分析出现之前,人们就试图用多分辨率分析的思想对信号进行处理,以突破傅立叶变换的局限性,最著名的是Burt 和Adelson 的Laplace 金字塔编码;后来,Mallat[11]提出了小波多分辨率分析算法;Daubechies 用基于离散滤波器迭代的方法构造了紧支集的规范正交小波基,使小波分解可以用信号和离散滤波器的卷积运算来实现,从而使小波分解被广泛应用于图像分解。 正交小波对应一个正交镜像滤波器,就是说低通滤波器h 和高通滤波器g 正交。双正交小波有两个小波,即小波Ψ和它的对偶小波ψ~ ,它们对应的滤波器分别为{h,g }和{g h ~,~}。其中,h 与g ~正交,g 与h ~正交,即满足: 1n n n h )1(g ~+--=;1n n n h ~)1(g +--=;)5.3(h ~h 0 ,k n k 2n n δ=∑+ 进行图像的压缩编码时,用一个小波分解,用另一个重构。母波选择的合适与否直接影响着图像编码的结果,正交小波的变换明显的不如双正交小波。本文采用的均是附录二中介绍的双正交小波。 小波变换是变换编码的一种,也要经过变换、量化和压缩三个步骤。将原始图像进行离散小波变换(DWT )后,如果立即进行相应的逆变换,会得到精确的原始图像,当然这要忽略在计算时带来的误差。 对于一幅图像所得到的小波系数的能量要比在时域时集中的多,这样就很有利于将其量化为字符流。现代的量化方法有很多:如:标量量化、向量量化和零树编码量化等都是非常有效的。最后要对得到的字符流进行无损压缩,这要用到一些经典的方法,如:Huffman 、ADPCM 、RLE 等。 下面将讨论一种零树编码量化的方法。

相关主题
文本预览
相关文档 最新文档