嵌入的离散余弦变换式静止图像编码算法 本发明涉及静止图像的编码算法和用来执行这种算法的设备。该算法特别适合用来产生一种嵌入的比特流,并且用不同于其余图像的质量对一部分图像进行编码。
在许多实际的图像/电视压缩系统中已经广泛地使用了变换编码。采用变换方式的基本目的是,在变换之后的图像压缩工作比空间域中的直接编码更容易。诸如JPEG,H261/H.263和MPEG等等大多数编码标准已经采用了离散余弦变换(DCT)地变换方法。
近年来,大多数研究工作已经从DCT转向了小波变换,特别是在Shapiro发表了他对嵌入的零树小波(EZW)图像编码的研究报告之后,参见J.M.Shapiro“Embedded Image Coding using zerotrees ofwavelet coefficients”,IEEE Trans.on Signal Processing,Vol.41,No.12,pp.3445-3462,Dec.1993。
W.B.Pennebaker,J.L.Mitchell的论文JPEG Still Image DataCompression Standard,Van Nostrand Reinhold,New York,1993描述了DCT式编码的现有技术状态。
在许多应用中都需要获得一种嵌入的比特流。由于嵌入的比特流中包含在比特流开头嵌入的所有低速率,比特是按照从最重要到不太重要的顺序排列的。使用嵌入的编码,在达到比特计数的目标参数时就停止这种编码。按照类似的方式,对于嵌入的比特流来说,解码器可以在任何一点上停止解码,并且可以产生对应着所有低速率编码的再现。
为了优化嵌入的比特流而需要首先发送对图像的视觉识别最重要的那些比特。这就相当于在低比特率下让比特流具有良好的压缩/质量比。
DCT是正交的,这就意味着它会保存能量。换句话说,相对于均方根误差(RMSE)(或是峰值信-噪比-PSNR)来说,一定幅值的变换图像中的误差会在相同幅值的原始图像中产生一个误差。
这就意味着应该首先发送具有最大幅值的系数,因为这其中具有最多的信息。同时还意味着可以用二进制表达方式来排列这种信息,并且应该首先发送最高有效位。
在DCT变换之后,图像的大多数能量集中在低频系数中,而其余的系数具有很低的值。这就意味着在这些系数的最高有效位面(MSB)上有许多零。一直到找到某一系数的第一有效位(FSB)时为止,零的概率很高。因此,编码的任务也就变成了以一种有效的方式对这些零进行编码的任务。
在Z.Xiong,O.Guleryuz,M.T.Orchard,″A DCT-based embeddedimage coder,IEEE Signal Processing Letters,Vol.3,No.11,pp.289-290,Nov.1996,N.K.Laurance,D.M.Monro,Embedded DCTcoding with significance masking″Proc.IEEE ICASSP 97,Vol.IV,pp.2717-2720,1997和J.Li,J.Li,C.-C.Jay Kuo,LayeredDCT still image compression,IEEE Tran.On Circuits and Systemsfor Video Technology,Vol.7,No.2,April 1997,pp.440-442的论文中,尽管也使用了DCT变换,系数的编码并不是按照JPEG编码的方式完成的,而是可以产生一种嵌入的比特流。
本发明的目的是提供一种算法和执行这种算法的装置,用来输出一种嵌入的DCT式(EDCT)图像,由此所获得的解码图像比上述论文中所公开的从JPEG和DCT式编码器获得的图像具有更好的PSNR。
本发明的另一个目的是提供一种方法,它可以用一种不同于其余图像的质量为图像中的Regions of Interest(ROI)(重要区域)进行编码,同时仍然保持算法的嵌入性质。
这些目的是通过采用以下基本步骤的方法来实现的:
-将图像划分成方块。
-单独用DCT变换每一块。变换产生一个块的系数,在左上角是DC系数,在对应着块的轴线方向上具有较高的水平和垂直频率系数。传统块使用8×8的尺寸,但是此处可以使用任何二的乘方的块尺寸。将尺寸限制为二的乘方是为了能快速地计算DCT。
-以渐进的方式量化和发送DCT系数,以便首先发送最重要的信息。
然而,为了在各种传输速率下实现有效的压缩,以便能在任何时间切断比特流并且在这一压缩比上仍然提供具有优异质量的图像,需要采用一种有效的扫描次序。
按照本发明,每一个系数从最高有效位到最低有效位的第一个非零位被称为First有效位(FSB)。一个系数在第一有效位前面的位被称为Zero位(ZB)。用Sign位(SB)代表符号信息,而第一有效位后面的其余位被称为Raw位(RB)。编码是在逐个位面上进行的。在每个位面中从最低频率系数到最高频率系数进行编码。
对于发送的每一个零位,将解码器得到的系数的不确定的间隔长度一分为二。如下文所述,在遇到第一有效位时,为了维持嵌入的代码,需要发送系数的符号。
在符号位之后必须发送RB。这其中包含很少的冗余,并且用良好的预测尝试对这些冗余进行编码所带来的增益很小。
接收机可以反过来执行这些步骤。产生的比特流被嵌入,并且解码器可以在任何点上切断比特流,并且所产生的图像与直接用这一比特率压缩时具有相同的质量。
只要在这样的编码方案中使用这样的扫描次序,在所有压缩比下都可以获得很好的视觉质量。
以下要参照附图详细地解释本发明,在附图中:
图1表示DCT系数是如何安排的;
图2表示一个象素中的比特次序;
图3表示嵌入的编码算法的扫描次序;
图4表示一个符号位的发送;
图5表示AC系数零位的前后关系;
图6表示DC系数零位的前后关系;
图7表示cut_off信号的前后关系;
图8是这种编码程序的一个流程图。
在图1中表示了一种8×8 DCT块的DCT系数的配置。因此,在左上角是低频系数,而在右下角是高频系数。
每个系数用多个位来表示,例如在图2中是8位。图2中的前三位是零,称作零位(ZB),第四位不是零,被称为第一有效位(FSB),其它低位被称为原始位(RB)。
在一个最佳实施例中,数字DCT变换图像的编码算法如下:
(1)找出所有DC系数的平均值(DC_平均)。从每个DC系数中减去这个值。
(2)选择一个量值,它的大小是图像中最大数值系数的一半。发送这一量值。
(3)传送/编码那些新系数比当前的量值更有效的信息以及这些系数的符号。一个系数比一个量值更有效的意思是说它的幅值比当前量值的绝对值大。
(4)从这一位面中发现的有效系数幅值中减去当前的量值。用减去了当前量值的幅值代替这一有效系数的幅值。其差值相当于仅仅保留原始位。
(5)针对在前一个位面中所有有效的系数,传送/编码关于该系数比该量值的幅值大或是小的信息。从大或是小的幅值中减去这一量值,并且用所得的值代替这些系数。这相当于发送一个原始位。
(6)将当前的量值一分为二。这相当于进入这些系数的最低有效位。
(7)从步骤(3)开始重复,直至耗尽位的堆积,或者是达到某种理想的质量。
上述的步骤1是可以选择的。如果使用了这一步,就必须存储/发送DC系数的平均值。
重组是按照以下步骤完成的:
-将所有系数设定为零。
-接收第一个量值。
-接收关于新的有效系数的信息。
-按照(1.5*当前量值*系数符号)重组这些信息。这是因为在这一阶段已经知道系数的幅值处在当前量值和(2*当前量值)之间。这样就将(1.5*当前量值)放在一定的间隔中间。在步5中执行的加或是减会得到新的系数,并且让它们总是处在一定的间隔中间。
-核查前面的所有有效系数,查出这些系数中幅值大于当前量值的系数。在幅值大于当前量值的系数上加上当前量值/2,而从幅值不大于当前量值的系数中减去当前量值/2。
-将当前量值一分为二。
-重复步骤3,接收新的有效系数,直至达到理想的质量或者是没有更多的信息时为止。
如果步骤(1)是在编码器上执行的,解码器就必须接收DC系数的平均值,并且将该值加到重组的DC系数上。
另外,为了更新每一个位面中的系数而需要限定扫描次序。在一个最佳实施例中,在进到下一个系数之前在所有块中更新一个系数。
在一个块的内部按照对角线次序逐个位面地更新DCT系数。在每个扫描的对角线之后传送一个标志,表示在剩下的块中是否存在任何有效的系数。该标志用块cut_off表示。之所以使用块cut_off是因为在第一位面中有许多零,在实践中,按照准确的预测采用一个明显的符号要比尝试着对所有的零进行编码更好。这种块切断符号仅仅涉及到新的有效系数。
也可以用运行长度编码方法来代替对每个对角线采用cut_off标志的方法。例如,如果一个系数是有效的,就可以用一个数字来代表这一块中下一个有效系数的位置。
如上所述,已经为前一个系数传送了一个符号位。这样就能使尚未有效的系数的一定间隔加倍,并且将其作为下一次扫描的起点。这样就能在每个位面期间对第一个有效的标志进行编码,然后再进行精确的量化(编码程序的第3到5步)。
在图4中说明了在遇到第一有效位时传送一个符号位的理由。这样,在传送了符号位之后,系数的符号也就确定了,所得的系数不再含糊。
在每个位面期间对系数的扫描是按照以下方法进行的:按照从图像的一个DCT块的左上角到右下角的对角线次序,首先是所有DC系数,然后是具有相同索引的所有AC系数,也就是DC,AC1,AC2等等。
也可以采用在JPEG中使用的Z字形扫描,不会影响嵌入式编码算法的准确性。
编码器按照这种方式产生一个嵌入式比特流。解码器可以在任何点上切断比特流,并且用较低的比特率重组一个图像。在速率较低时,重组图像的质量与直接用这一速率进行编码时是相同的。有可能重组出接近无损和无损的图像。
在图8中表示了扫描次序。首先在框801中开始扫描。接着在框803中执行DCT变换。在框805中提取DCT系数的第一位面。然后在框807中复位。
接着在框809中提取第一对角线,并且在框811中提取第一系数。然后在框813中提取第一块。在框815中核查这一块是否已经被切断了。如果是,程序就进到框817其余则到框819。
在框819中核查在移动中是否需要切断这一块。如果是,程序就进到框821,在这一块中发送块切断符号,然后,程序再进到框823。
在框823中核查系数原来是不是有效的,也就是核查它是不是第一有效位(FSB)。如果该系数原来就是有效的,程序就进到框817,其余则到框825。
在框825核查系数现在是否是有效的。如果是,程序就进到框827,其余则到框829。
在框829中传送包含系数不是有效的那些信息的数据,并且程序从框829进到框817。
在框827中传送包含系数有效的那些信息的数据,并且程序从框829经过用来传送符号的框831进到框817。
在框817中核查它是不是DCT图像中的最后一块。如果是,程序就进到框833,否则就使程序返回框815重复对下一块的处理。
在框833中核查当前的系数是不是对角线中的最后一个系数。如果是,程序就进到框835,否则就使程序返回框813处理下一个系数。
在框835中核查这一对角线是不是最后一个对角线。如果是,程序就进到框837,否则就返回框811处理下一个对角线。
在框837中开始精调。首先在框837中提取第一对角线。然后在框839中提取第一对角线中的第一系数。接着在框841中处理第一块。此时需要在框843中核查当前的系数原来是不是有效的。如果不是,程序就进到框847,否则就使程序通过用来传送原始位的框845进到框847。
在框847中核查当前的块是不是最后一块。如果是,程序就进到框849,否则就使程序返回框843处理下一块。
在框849中核查当前的系数是不是当前对角线中的最后一个系数。如果是,程序就进到框851,否则就使程序返回框841处理下一个系数。
在框851中核查当前的对角线是不是最后一个对角线。如果是,程序就进到框853,否则就使程序返回框839处理下一个对角线。
在框853中核查当前的位面是不是最后一个位面。如果是,程序就进到框855结束程序,否则就使程序返回框807处理下一个位面。
为了进一步理解扫描次序和这种算法,以下给出了编码器采用的伪码:
在选定了正确的扫描次序之后,还需要有一种有效的方式对扫描进行编码。主要的问题是如何为新的有效系数的表征码编码。可供使用的方法很多,例如有Zero树编码,运行长度编码和地址切换等等。
在一个最佳实施例中采用了基于上下文的算术编码。在此时可以采用按照Witten等人提供的指导并且发表在I.H.Witten,R.M.Neal,and J.G.Cleary,“Arithmetic coding for data compression”,Communications of the ACM,Vol.30,No.6,pp.520-540,June 1987上的一种算术编码器。
自适应概率估算可以扩展,并且按下述的惯例用于位面。
在使用这种方法时,对每一个符号来说,需要估算的无非是该符号为零的概率,因为符号使用的字母是二进制。为此可以采用上下文编码方法。
上下文编码已经被用于诸如JBIG等标准的双电平图像的编码,同样被用于如K.Nguyen-Phi and H.Weinrichter,DWT imagecompression using Contextual bitplane coding of waveletcoefficients,Proc.ICASSP 97,pp.2969-2971,1997中所述的小波编码器。
没有上下文,或者是仅有一个上下文,零的概率就被会估算成到目前为止得到的零的数量除以编码符号的总数。使用上下文,周围或是前面的符号的数量被用来从多个上下文中选择一个。在选择上下文时,在同一个上下文中编码的符号被认为是具有相似的统计量。在这种情况下,每个上下文保持零的数量,并且可以从上下文中看出符号的数量。
然后将零的概率估算成零的数量除以符号的总数。在对符号进行编码之后更新上下文。
可以采用多种途径为符号选择上下文。同样可以用不同的方法来更新上下文。在一个最佳实施例中,从每个新的位面重新开始上下文。这是因为不同的位面具有不同的统计量,并且在一个位面之内的统计量是完全不变的。
用来估算需要编码的一个符号的许多位被放在一起并且被认为是一个整数。这个数被用做上下文的索引。当被用于估算的这些位具有这种准确的构造时,索引的上下文被保持在原先得到的统计量。
在下文中,关于一个系数是否有效的信息被认为是其自身的位面,称作有效平面。如果在当前位面或是前面的任何位面中发现了有关的系数,这一位面就是“1”。
对于所有系数的原始位只能使用一个上下文。这样做仅仅比传送没有熵编码的原始位稍微好一点。对于AC系数符号位和同样仅仅使用一个上下文编码的系数也是这种情况。值得注意的是可以将它们当作原始位来传送,并且对它们不采用算术编码。这样可能会降低性能,但是能提高算法的执行速度。
通过将有效的位面中标记的那些相邻的DC数量加在一起在一个选定的上下文中对DC符号位编码,并且具有图6所示的正符号。可以根据块中的6个相邻系数和三个相邻块中相同的系数对AC系数零位(和有效位)进行编码,如图5所示。这些系数在有效平面内的信息被用作上下文。
对于DC系数零位来说,利用所有相邻块中的DC系数来选择上下文。在这种情况下仅仅需要考虑有效的平面。
在4个相邻的块中,块cut_off是在cut_off符号的上下文种编码的,如图7所示。同时要考虑到对角线数量。这是用有关的被切断的符号的四个位和对角线来完成的,它是一个4位的数,并且用来构成上下文索引的8个完整的位。
适当地采用某一种上述的算法就能使结果得到改善。
上述这种算法在计算上的复杂性和需要的存储器主要是由于DCT计算和使用了算术编码。
由于这种算法是以块为基础的,它可以并行地执行。具体地说就是可以并行地完成变换阶段。假设可以使用P个处理器来处理一个被划分成8×8块的N×M的图像,每个处理器就能在图像的(N/P)×M部分的块中完成DCT变换。另外也可以单独或是并行地处理位面。这是因为上下文在每个位面中是重新开始的,并且不执行对系数的编组。在具体的一个位面中唯一需要知道的就是在这一位面之前哪些系数是有效的。在传输之后马上就可以从DCT系数中获得(也可以是并行地)这种信息。符号位需要采用一种简单的编码方式。
这种算法特别适合用于逐行图象传输。在逐行图象传输的过程中需要在传输的末级提供无损的压缩。对DCT的精度不需要任何限制就可以实现接近无损的重组。用一种有损加无损残余编码方法就可以实现无损的重组,在这种情况下提出的算法被用来完成压缩的有损部分。值得注意的是,这种方案需要有一种整数反DCT来保证软件和硬件的可移植性。
在某些应用中,一个图象的特定区域需要用比其他部分质量更高的方式来编码。这种算法可以用不同于其余图象的质量对重要的区域(ROI)进行编码。例如,如ROI的编码是每象素1位(bpp),而其余图象是0.5bpp,在逐步图象传输的过程中,发送的图象可以达到0.5bpp,然后再发送用来重组ROI的另外0.5bpp的信息(这仅仅是一种可能的情况)。ROI也可以按照前一段中所述的方法进行无损编码。值得注意的是,ROI的大小是随意的。在这种情况下可以采用MPEG 4中使用的方法(块填充或是形状自适应DCT)。然而,为了使这种算法适应任意的ROI,还需要对算法进行一些修改。以下说明了采用ROI的各种逐步编码方案。在此处为了简明而假设ROI的形状是一个规则的正方形对正方形的尺寸进行DCT编码(即在采用JPEG的大多数应用中是8×8象素)。
假设背景的位面是x位/象素(bpp),而ROI是y bpp(y>x)。对于背景按照x bpp进行编码,而ROI(或是多个ROI)是y bpp(不同ROI的位面可以是不同的)的图象可以采用不同的方案来实现逐行传输。
下面概况了用来获得这种不同的位面的三种不同的方案。
第一种方案是,对背景(BG)和重要区域(ROI)单独进行编码。这种方案可能给逐行传输带来某些问题,因为BG和ROI是分别编码的,必须有一种途径能够将两种不同的比特流捆扎成一个比特流才能完成整个图象的逐步传输。另一种方式是在不只传输中首先传输BG或是ROI,而最后再传输另一个(ROI或是BG)。这就意外着接收机在传输的早期阶段不能确定整个图象是什么。
另外,在BG和ROI中没有使用相邻块之间的关系,因为它们是单独编码的。这样会降低压缩性能。然而,这种方法对并行处理是有好处的。
第二种方案是将ROI系数移动或是倍增某一个数。采用这种方法可以在传输的早期阶段发现有效的ROI系数以便在BG前面首先对它进行编码。ROI系数移动得越多,发现有效ROI系数的时间就越早。这样就有可能控制ROI的重组速度。解码器需要知道ROI的形状和位置以及这些ROI系数所采用的移动系数。这些信息被存储在比特流的字头信息中,解码器在接收比特流时可以找到这种信息。值得注意的是,ROI的数量可以是任意的,而对于不同ROI的ROI系数的移动(倍增)系数也可以是不同的。在这种情况下就可能控制ROI的速度和重要性。
如果系数被移动了很多,使最小的ROI系数都大于最大的BG系数,就能做到首先对所有的ROI系数进行编码。这样就能首先重组出完整的ROI(如下文所述甚至可以达到无损)。在这种情况下同样不需要发送ROI的形状。需要发送的是移动系数和给接收机的一个信号,通知接收机它已经接收到的系数是ROI系数(或者是在字头的开头增加与ROI系数相对应的字节数,让接收机知道何时停止ROI系数的解码)。这种方式不需要发送ROI的形状,因为解码器可以找到ROI的形状。如果形状信息在位数中占据明显的数量(在任意形状区域的情况下),这一点可能是很重要的。保留的位可以用来改善ROI或是背景的编码。在达到ROI比特率时,解码器就能知道需要接收的背景。
值得注意的是,上述方案不仅可以用于DCT式的编码器。小波编码器也可以采用类似的方案来避免发送ROI的形状信息。这种方案还可以用于Nister D.,Christopoulos C.A.,“Progressive lossy tolossless coding with a Region of Interest using the Two-Teninteger wavelet”,ISO/IEC JTC1/SC29/WG1 N744,Geneva,Switzerland,23-27 March 1988。
同样还需要注意到,按照降低重要性的次序的这种发送ROI形状的方式可以在发送位面的任何传输方案中被采用。仅仅需要按照一个足够大的系数来移动ROI系数,在任何背景系数之前发送这种ROI系数。该方法可以用于DCT或是小波变换的变换图象,并且可以用于普通位面编码的图象。为了让接收机知道ROI系数信息的时间,必须将发送最后一个ROI系数的时间发送给接收机。可以按照多种方式来执行,例如是可以发送一个信号,仅仅由零值系数构成的一个位面,或者是在开始传输时发送一个字头,指示出被用于ROI系数的位数。
因此,在传输的早期阶段仅仅重组ROI。这样会造成接收机难以知道其余的图象是什么。因此,这种方法对于ROI的快速重组有很好的作用。然而,它在早期阶段回避了BG和ROI的相邻块之间的使用关系。
按照第三种方案,对所有图象进行编码,直至获得背景位面(或是必要的质量),然后仅仅对ROI进行连续的编码。这种方案的复杂性与本文所述的这种系统是相似的。因而不会导致动态范围的增大,相邻块之间的关系是可以使用的(至少在达到BG速率之前)。另外还可以在切换速率(从BG速率到改善的ROI)之后维持ROI中的DCT系数的位还是原始位。这就意味着使用这些位之间的关系只有很小的增益,并且即使是在没有熵编码器的情况下也可以完成编码。
另外,在使用这种方案时,在达到BG速率时需要向接收机发送一个信号,在此时仅仅需要改善ROI。解码器还需要知道ROI的形状。与第二种方案相比,这种方法会降低ROI的重组速度,但是接收机在所有情况下都能够知道整个图象的全貌。
接收机在发送阶段中可以改变ROI的位置。在接收机按照逐步传输方法获得了一个图象时,它可以指定需要马上看到的一个特定的ROI,并且/或是使其比其余图象具有更好的质量。ROI的位置和形状被传送给发射机。如果发射机对图象采用压缩的形式,它就需要执行可变长度解码(在本发明的方案中就是算术解码),以便找出与ROI相对应的系数。然后,发射机就可以采用上述的一种方案。发射机需要对信息再次执行算术编码,但是不使用可能已经被发送给接收机的位面。另外,发射机不需要重组完整的图象(不需要反DCT)。如果发射机上有原始图象,还可以按照接收机的请求用上述的方案(首先执行DCT)对没有发送的位面进行编码。
上述的方案还可以加以组合,在早期阶段同时实现高速的ROI重组和良好的背景质量。
最后还应该注意到本文所述的算法是用来独立地压缩各个分量的。采用适当的交错方式就可以为彩色图象产生嵌入的比特流。
这种算法是基于DCT的,它已经被用于所有的静止图象和电视编码标准。通过采用适当的量化和基于上下文的算术编码,就可以获得一种嵌入的DCT式(EDCT)静止图象编码算法。该算法特别适用于WWW应用和数据库的快速浏览。
由于这种算法是基于DCT的,还需要对现行的JPEG体系进行一些微小的修改。选择的精调,倾斜,分层编码和现行JPEG的所有操作方式都可以得到支持,不需要采取新的措施。
其他算法也可以用来代替DCT作为Fourier变换的Hadamard变换。另外还可以采用整数执行的DCT。在这种情况下可以获得无损编码的机会,并且因而可以用这种建议的方案完成从有损到无损的逐步传输。例如,如果采用Ohta Mutsumi,“Lossless transform codingsystem for digital signals”,US patent 5703799,Dec.30,1997,或者是如果采用W.K.Cham and Y.T.Chan,“An Order-16 IntegerCosine Transform”,Signal Processing,Vol.39,No.5,May 1991,pages 1205-1208的算法,就可以用本发明的上述方法实现有损和无损的编码。另外,通过维持算法的嵌入性质还能够以一种完全的逐步方式来获得无损的ROI和有损的BG。
上述的方法可以被用于3D编码或是电视编码。在3D编码中可以实现完全的嵌入式3D编码器,让某些ROI的编码质量高于其余图象。这一点特别适用于医学和远程监测用途。在电视编码中可以设计成嵌入的电视编码器。EDCT可以用于对内部和外部宏块的编码(例如在H.261,H.263和MPEG电视编码标准中)。EDCT还可以用于对运动矢量的编码。