基于JPEG2000的Tag-tree编码方法转让专利

申请号 : CN200810151047.2

文献号 : CN101360242B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李云松马娜王柯俨刘凯吴成柯

申请人 : 西安电子科技大学

摘要 :

本发明公开了一种基于JPEG2000的Tag-tree编码方法,它涉及图像处理技术领域。其编码过程是:先对T1编码的码流进行各层的截取,统计每个码块第一次包含的层信息;再将一个小波子带中所有码块的包含信息形成一棵Tag-tree的叶子节点序列,并对叶子节点序列中的包含信息值进行建树,形成其父亲节点;根据父亲节点的数值对一棵Tag-tree叶子节点序列进行编码;最后将Tag-tree叶子节点序列中的节点的编码结果分离到各层的包头中。本发明简化了父子节点对应关系,提高了编码速度,可用于对各种数字设备的图像压缩编码。

权利要求 :

1.一种基于JPEG2000的Tag-tree编码方法,包括如下步骤:(1)对T1编码的码流进行各层的截取,统计每个码块第一次包含的层信息,即包含信息,将一个小波子带中所有码块的包含信息形成一棵Tag-tree的叶子节点序列;

(2)对包含信息进行建树:

2a.将位于当前级的i行j列节点的父亲节点位于父级的i/2行,j/2列;

2b.取当前级坐标为(2*i,2*j)、(2*i+1,2*j)、(2*i,2*j+1)和(2*i+1,2*j+1)的四个节点中的最小值放入其父亲节点的位置,父级坐标为(i,j);

其中:i、2*i和2*i+1表示坐标的行位置,

j、2*j和2*j+1表示坐标的列位置;

2c.更新i和j的数值,直到更新后的2*i的值等于当前级节点的行数,则停止建树,i,j更新规则为:

(3)根据父亲节点的数值对所述的一棵Tag-tree叶子节点序列进行编码:

3a.将JPEG2000码流分为L层,则Tag-tree节点取值为0~L,以L表示此Tag-tree节点对应的码块在JPEG2000码流中不包含;

3b.对Tag-tree的叶子节点序列中,坐标为(i,j)的叶子节点的开始编码级数K进行判断,如果i,j同时被2n整除,则此叶子节点从n+1级开始编码,即K=n+1;如果i,j同时被2n-1整除,则此叶子节点从n级开始编码,即K=n;以此类推,直到判别到20,则此叶子节点从1级开始编码,即K=1;

3c.按照子父节点的地址映射关系,取出此叶子节点在(K+1)级的节点值NK+1,K级节点值NK,直到最后取出此叶子节点本身,即1级节点值N1;

3d.将此叶子节点在(K+1)级的节点值NK+1与JPEG2000码流分层数L比较,如果NK+1与L相等,则不进行编码;否则,先编码(NK-NK+1)个0比特,再将NK与JPEG2000码流分层数L进行比较,如果NK等于JPEG2000码流分层数L,则结束编码过程;否则,先编码一个1比特,再编码(NK-1-NK)个0比特,再将NK-1与JPEG2000码流分层数L进行比较,如果NK-1等于JPEG2000码流分层数L,则结束编码过程,否则,此后以此类推,直到编完1级节点或者某级节点的值等于JPEG2000码流分层数L,结束编码过程;

3e.更新i和j的数值,直到更新后的i值等于1级节点的行数时,停止编码,i,j更新规则为:

(4)将Tag-tree叶子节点序列中的节点的编码结果,按照比特位从左到右进行判断,当比特位数值为0时,则此0比特属于对应层的包头;当比特位数值为1时,判断此比特位右边邻接比特位数值,如果邻接比特位数值为1,则继续判断,如果为0,则按前述方法判断出的1比特和此0比特属于对应层包头,如果此0比特不是编码结果的最后一位,则对剩下的比特位继续按照前述方法判断,直到判断完编码结果的最后一位结束。

说明书 :

技术领域

本发明涉及图像处理技术领域,特别是一种基于JPEG2000的Tag-tree差分编码及分离技术,用于各种数字设备的图像压缩编码。

背景技术

随着多媒体和网络技术的发展和应用,已有的静止图像压缩标准JPEG已不能满足当前市场和实际应用的要求,为此国际标准组织于2000年11月制定了静止图像压缩的新标准JPEG2000。该新标准采用了澳大利亚学者David Taubman在High Performance Scalable Image Compression with EBCOT(IEEE Trans.ImageProcessing,vol.9,no.7,pp.1158-1170,July 2000)一文中提出的小波变换和率失真优化截取内嵌码块编码算法(EBCOT),该算法分为T1和T2两部分。T1由内嵌比特平面编码和MQ算术编码器组成,完成上下文形成和算术编码;T2部分完成率控制和码流组织。进行率失真优化截取内嵌码块编码算法EBCOT编码时,各小波子带划分为更小的码块,如64×64,以码块为单位独立作T1编码。不同的码块产生的比特流长度是不相同的,它们对恢复图像质量的贡献也是不同的。因此对于所有码块产生的比特流,T2采用了率失真优化技术进行后压缩处理,完成码流的率控制和组织。
以下对静止图像压缩的新标准JPEG2000中的T2部分进行描述:
在T1中对码块进行独立的嵌入式编码,将得到的所有码块的嵌入式位流,按照率失真最优原则分层组织,形成不同质量的层。对每一层,按照一定的码流格式打包,输出压缩码流。
一个包由包头和包体组成,包含信息的Tag-tree编码结果及其他的截取信息编码结果组成包头。
Tag-tree是用等级方式来表示的一个非负整形二维数组的方法,它对二维数组连续处理,产生逐级递减的分辨率,形成一棵树。也就是说每个节点的值是下级对应4个节点的最小值;对于下边界和右边界不足4个节点的,同样取其最小值,形成父亲节点值,直到最后一个根节点。
Tag-tree编码过程是对Tag-tree节点进行了一系列的判决,编码从最高级父亲节点开始,然后是次级父亲节点,最后一直到叶子节点。每个节点除了本身的值nodei(m,n)以外,还有一个与之相关的当前值ti(m,n),ti(m,n)取其父节点的值,如果nodei(m,n)是根节点,则ti(m,n)初始化为0。将ti(m,n)与nodei(m,n)比较,如果ti(m,n)<nodei(m,n),输出一个0比特,ti(m,n)=ti(m,n)+1,再次比较;如果ti(m,n)等于nodei(m,n),输出一个1比特,当前节点编码结束,搜索其子节点,对子节点进行编码。其中,nodei(m,n)表示第i级,坐标为(m,n)Tag-tree点值,ti(m,n)表示第i级,坐标为(m,n)的Tag-tree节点的当前值。
虽然澳大利亚学者David Taubman在High Performance Scalable ImageCompression with EBCOT(IEEE Trans.Image Processing,vol.9,no.7,pp.1158-1170,July 2000)一文中给出了T2中包含信息和0比特平面的Tag-tree编码原理,但并没有给出编码的软件及硬件实现方法。从现有的文献来看,谈论JPEG2000小波变换,上下文编码和算术编码结构的文章相对比较多,但是对于JPEG2000的Tag-tree编码及其VLSI实现的文献却很少,且已实现JPEG2000芯片的公司也没有公开Tag-tree编码器硬件实现体系结构和实现方法,即使在JPEG2000标准中,对Tag-tree的论述也相当少。中国学者Quanping Huang在2004年IEEE Transactions onConsumer Electronics期刊发表文章Low Memory and Low Complexity VLSIImplementationof JPEG200 0Codec(Vol.50,No.2,MAY 2004 pp638-646)详细介绍了T2的VLSI结构,但是,因为他提出JPEG2000图像压缩结构用量化来控制码率,分层数为1,分片大小为128×128,码块大小为32×32,采用3级小波变换,这样,Tag-tree最大规模为2×2,Tag-tree级数最大为2级,这时,父子节点的值只有3种情况,00,01,11,因此,可以使用简单的查找表,当Tag-tree规模扩大或层数增加时,此方法就不适用了。中国学者Leibo Liu在2004年IEEEJOURNAL OF SOLID-STATE CIRCUITS期刊上发表文章A VLSI Architecture ofJPEG2000 Encoder(VOL.39,NO.11,NOVEMBER 2004 pp2032-2040)和其博士论文JPEG2000静止图像压缩关键技术研究及VLSI实现,清华大学,2004年4月中也给出了T2的VLSI结构,但是,该结构提出了并行截断采用率失真门限预测的方法,只做1层的截取,另外码流封装对编码块进行独立码流封装,这样,在单个编码块独立编码的情况下,Tag-tree编码变得非常简单,因为这时Tag-tree只有一个节点,即根节点。而中国学者吴宗泽在小型微型计算机系统期刊发表文章《基于JPEG2000的TAGTREE编码算法分析及其FPGA实现》(第26卷第3期2005年3月),对Tag-tree的编码规则进行了详细的分析。该文章采用固定存储器地址映射关系来实现子父节点对应关系,虽然简化了地址发生逻辑,但占用了硬件资源。在建树过程中,采用写入叶节点的方式刷新父节点,这种逐级比较的方式会花费更大的时钟资源,并且,编码采用标记节点是否编过,用逐级比较的方式产生编码码流,这些都会造成时钟的浪费。

发明内容

本发明的目的在于克服上述已有技术的不足,提供一种基于JPEG2000的Tag-tree编码方法,以简化父子节点对应关系及编码过程,实现在任意层数下的Tag-tree编码。
为实现上述目的,本发明的编码方法包括如下步骤:
(1)对T1编码的码流进行各层的截取,统计每个码块第一次包含的层信息,即包含信息,将一个小波子带中所有码块的包含信息形成一棵Tag-tree的叶子节点序列;
(2)对包含信息进行建树,即先建立父子节点的地址对应关系,再将子节点中2×2个节点的最小值放入对应地址的父节点空间,确定父亲节点的数值;
(3)根据父亲节点的数值对所述的一棵Tag-tree叶子节点序列进行编码,即先将编码父子节点差值个0比特,再根据子节点值是否等于JPEG2000压缩标准中设定的分层数,决定是否编码1比特,如果子节点值不等于分层数,则编码1比特;否则,不进行编码;
(4)将Tag-tree的叶子节点序列中的节点的编码结果分离到各层的包头中。
上述编码方法,其中步骤(2)所述的对包含信息进行建树,按如下步骤进行:
2a.将位于当前级的i行j列节点的父亲节点位于父级的i/2行,j/2列;
2b.取当前级坐标为(2*i,2*j)、(2*i+1,2*j)、(2*i,2*j+1)和(2*i+1,2*j+1)的四个节点中的最小值放入其父亲节点的位置,父级坐标为(i,j);
其中:i、2*i和2*i+1表示坐标的行位置,
j、2*j和2*j+1表示坐标的列位置;
2c.更新i和j的数值,直到更新后的2*i的值等于当前级节点的行数,则停止建树,i,j更新规则为:

上述编码方法,其中步骤(3)所述的对一棵Tag-tree叶子节点序列编码,按如下过程进行:
3a.将JPEG2000码流分为L层,则Tag-tree节点取值为0~L,以L表示此Tag-tree节点对应的码块在JPEG2000码流中不包含;
3b.对Tag-tree的叶子节点序列中,坐标为(i,j)的叶子节点的开始编码级数K进行判断,如果i,j同时被2n整除,则此叶子节点从n+1级开始编码,即K=n+1;如果i,j同时被2n-1整除,则此叶子节点从n级开始编码,即K=n;以此类推,直到判别到20,则此叶子节点从1级开始编码,即K=1;
3c.按照子父节点的地址映射关系,取出此叶子节点在(K+1)级的节点值NK+1,K级节点值NK,直到最后取出此叶子节点本身,即1级节点值N1;
3d.将此叶子节点在(K+1)级的节点值NK+1与JPEG2000码流分层数L比较,如果NK+1与L相等,则不进行编码;否则,按如下规则进行编码:
首先,编码(NK-NK+1)个0比特,再将NK与JPEG2000码流分层数L进行比较,如果NK等于JPEG2000码流分层数L,则结束编码过程;否则,先编码一个1比特,再编码(NK-1-NK)个0比特,再将NK-1与JPEG2000码流分层数L进行比较,如果NK-1等于JPEG2000码流分层数L,则结束编码过程,否则,此后以此类推,直到编完1级节点或者某级节点的值等于JPEG2000码流分层数L,结束编码过程;
3e.更新i和j的数值,直到更新后的i值等于1级节点的行数时,停止编码。i,j更新规则为:

上述编码方法,其中步骤(4)所述的将Tag-tree的叶子节点序列中的节点的编码结果分离到各层的包头中,是对1级节点,即叶子节点中,i行j列节点的编码结果按照比特位从左到右进行判断,当比特位数值为0时,则此0比特属于对应层的包头;当比特位数值为1时,判断此比特位右边邻接比特位数值,如果邻接比特位数值为1,则继续判断,如果为0,则前述判断出的1比特和此0比特属于对应层包头,如果此0比特不是编码结果的最后一位,则对剩下的比特位继续按照前述方法判断,直到判断完编码结果的最后一位,结束分离过程。
本发明与现有技术相比较,具有如下优点:
(1)由于使用子节点地址推算父亲节点地址,避免了对父亲节点地址的存储,节约了存储资源;
(2)由于采用叶子节点序列中节点的坐标位置(i,j)计算其开始编码的级数K,从而取出和此节点编码相关的节点值,即此节点从第(K+1)级到第1级的所有节点数据,避免了(K+1)级以上各级无用节点的读取;
(3)由于采用对与叶子节点编码相关的第(K+1)级到第1级的节点数据进行编码,即编码父子节点差值个0比特,避免了传统方法中对节点值的逐次判断以产生编码码流的过程;
(4)由于对JPEG2000压缩标准中设定的分层数L没有限制,可以实现任意层数下的Tag-tree编码。

附图说明

图1是本发明使用的包头结构示意图;
图2是本发明使用的单个码块在包头信息中的结构示意图;
图3是本发明的主流程图;
图4是本发明对包含信息进行建树的子流程图;
图5是本发明对一棵Tag-tree叶子节点序列进行编码的子流程图;
图6是本发明多包含信息编码结果进行分离子流程图;
图7本发明子父节点在存储中的地址映射关系图。

具体实施方式

本发明的结构是采用XILINX ISE 9.1集成开发软件和Verilog HDL语言,在XILINX公司的Virtex-IV XC4Vfx140-11ff1 517可编程芯片上实现。
包含信息的Tag-tree编码是在打包过程中,以打包所处的当前层作为门限值,控制包含信息Tag-tree码流的输出,即一个码块包含信息的Tag-tree编码的码流是分布在不同层的包头中输出的。对于JPEG2000的硬件系统,如果在打包过程中,实时的调用包含信息编码模块来产生编码码流,会对打包模块的控制造成很大压力,而且包含信息编码模块会占用打包模块的输出时间,降低打包模块的吞吐率。本文提出用两个存储单元A和B来存放结果,存储单元A用来存放包含信息编码结果,存储单元B用来存放编码结果对相应层贡献的比特位数,打包模块只要按照存储单元B的指示,取出存储单元A中对应的数据放入对应包头中即可。包头的结构如图1所示,该包头的形成是对一个小波分辨率级下的所有码块的截取信息进行编码,Hb,n表示子带b,码块n的截取信息编码结果。Hb,n结构如图2所示,包括4种信息,第一是包含信息的编码结果I,第二是0比特平面的编码结果N,第三是截取通道个数的编码结果P,第四是截取的码流长度的编码结果L。
参照图3,本发明的编码步骤如下:
步骤1,统计每个码块的包含信息。
对T1编码的码流进行各层的截取,统计每个码块第一次包含的层信息,即包含信息。
步骤2,形成一棵Tag-tree的叶子节点序列。
由一个小波子带下所有码块的包含信息,形成一棵Tag-tree叶子节点序列,Tag-tree叶子节点序列中坐标为(i,j)节点值即为小波子带中坐标为(i,j)的码块的包含信息值。
步骤3,对包含信息进行建树。
本发明对包含信息的建树,如图4所示,具体过程如下:
3.1将位于当前级的i行j列节点的父亲节点位于父级的i/2行,j/2列;
3.2.取当前级坐标为(2*i,2*j)、(2*i+1,2*j)、(2*i,2*j+1)和(2*i+1,2*j+1)的四个节点中的最小值放入其父亲节点的位置,父级坐标为(i,j),如图7所示,箭头表示子父节点对应关系,括号内的数据表示节点位置坐标,
其中:i、2*i和2*i+1表示坐标的行位置,
j、2*j和2*j+1表示坐标的列位置;
3.3更新i和j的数值,直到更新后的2*i的值等于当前级节点的行数,则停止当前级建树,i,j更新规则为:

3.4当前级节点建树完成后,如果其父亲节点个数不为1,则继续对当前级节点的父亲节点进行建树,即将父亲节点中2×2个节点的最小值放入父亲节点的下一级父节点空间,直到最后一级节点个数为1时,结束建树过程。
步骤4,对一棵Tag-tree叶子节点序列进行编码。
参照图5,本发明对一棵Tag-tree叶子节点序列进行编码,按如下过程进行:
4.1将JPEG2000码流分为L层,则Tag-tree节点取值为0~L,以L表示此Tag-tree节点对应的码块在JPEG2000码流中为不包含的信息;
4.2对在Tag-tree的叶子节点序列中,坐标为(i,j)叶子节点的开始编码级数K进行判断,如果i,j同时被2n整除,则此叶子节点从n+1级开始编码,即K=n+1;如果i,j同时被2n-1整除,则此叶子节点从n级开始编码,即K=n;以此类推,直到判别到20,则此叶子节点从1级开始编码,即K=1;
4.3按照子父节点的地址映射关系,取出此叶子节点在(K+1)级的节点值NK+1,此叶子节点在(K+1)级的节点坐标为(i/2K,j/2K),如果K是Tag-tree的最高级,则置NK+1的值为0,K级节点值NK,此叶子节点在K级的节点坐标为(i/2K-1,j/2K-1),直到最后取出此叶子节点本身,即1级节点值N1,其坐标为(i,j);
4.4将此叶子节点在(K+1)级的节点值NK+1与JPEG2000码流分层数L比较,如果NK+1与L相等,则不进行编码;否则,按如下规则进行编码:
首先,编码(NK-NK+1)个0比特,再将NK与JPEG2000码流分层数L进行比较,如果NK等于JPEG2000码流分层数L,则结束编码过程;否则,先编码一个1比特,再编码(NK-1-NK)个0比特,再将NK-1与JPEG2000码流分层数L进行比较,如果NK-1等于JPEG2000码流分层数L,则结束编码过程,否则,此后以此类推,直到编完1级节点或者某级节点的值等于JPEG2000码流分层数L,结束编码过程;
4.5更新i和j的数值,直到更新后的i值等于1级节点的行数时,停止编码。i,j更新规则为:

步骤5,将编码结果分离到各层的包头中。
由JPEG2000压缩标准可知,包含信息的Tag-tree编码结果是分布在各层的包头中输出的,而由前述得到的编码结果是整体的,这样,就需要对一个包含信息的Tag-tree编码结果进行分离,以确定此包含信息的Tag-tree编码结果如何输出到不同层的包中去。
参照图6,本发明将编码结果分离到各层的包头中的过程如下;
对1级节点,即叶子节点中,i行j列节点的编码结果按照比特位从左到右进行判断,当比特位数值为0时,则此0比特属于对应层的包头,此层比特位数计数为1;当比特位数值为1时,判断此比特位右边邻接比特位数值,如果邻接比特位数值为1,则继续判断,直到判断到编码结果最后一位,则将前述判断出的若干1比特属于对应层包头,并计数前述判断出的若干1比特个数,或直到判断到一个0比特,则将前述判断出的若干1比特和一个0比特属于对应层包头,并计数前述判断出的若干1比特和一个0比特的总比特个数,并对此0比特右边的剩余比特位继续按照前述方法判断,直到判断到编码结果的最后一位。
如存放包含信息编码结果的存储单元A中存放编码比特流为011100011,就可以被分解为0,1110,0,0,11,分别输出到5个包头中,则用来存放编码结果对相应层贡献的比特位数的存储单元B存放计数结果为
  1   4   1   1   2
本发明的效果可以通过硬件综合实现进一步说明。在Xilinx ISE 9.1集成开发软件环境中,对规模为4×4的Tag-tree采用Verilog HDL语言实现,综合结果和仿真结果如表1所示,对规模为16×16的Tag-tree采用Verilog HDL语言实现,综合结果和仿真结果如表2所示:
表1本发明与现有技术的综合比较
 本发明(层数为7)   现有技术   综合工具  Xilinx Synthesis Tool   目标器件  Xilinx Virtex-IV XC4Vfx140-11ff1517   Altera Stratix  EP1S25B672C7   Tag-tree规模  4×4   4×4   占用逻辑资源数  336   628
 本发明(层数为7)   现有技术   最高时钟  188.288MHz   106MHz   建树时钟数  35   183   编码时钟数  331   512
表1中的占用逻辑资源数和最高时钟是综合结果,建树时钟数和编码时钟数是仿真结果。从表1可以看出,本发明与现有技术相比,建树时间和编码时间都缩短了,提高了Tag-tree的处理速度,并且因为用子节点地址推算父亲节点地址,避免了对父亲节点地址的存储,降低了逻辑资源的使用。
表2本发明在分层数为7和为1时的数据比较

表2中的占用逻辑资源数和最高时钟是综合结果,建树时钟数和编码时钟数是仿真结果。从表2可以看出,本发明在处理JPEG2000分层数为7和分层数为1的Tag-tree时,编码时间在同一个数量级上。
对于本领域的专业人员来说,在了解了本发明内容和方法后,能够在不背离本发明的原理和范围的情况下,根据本发明的方法进行形式和细节上的各种修正和改变,但是这些基于本发明的修正和改变仍在本发明的权利要求保护范围之内。