DCT变换的基本思路是将图像分解为8×8的子块或16×16的子块,并对每一个子块进行单独的DCT变换,然后对变换结果进行量化、编码。随着子块尺寸的增加,算法的复杂度急剧上升,因此,实用中通常采用8×8的子块进行变换,但采用较大的子块可以明显减少图像分块效应。
在图像压缩中,一般把图像分解为8×8的子块,然后对每一个子块进行DCT变换、量化,并对量化后的数据进行Huffman编码。DCT变换可以消除图像的空间冗余,Huffman编码可以消除图像的信息熵冗余。
DCT 是无损的,它只将图像从空间域转换到变换域上,使之更能有效地被编码。对一个图像子块而言,将对变换后的6?个系数进行量化,并对Z字顺序扫描系数表进行 编码。这种排列方法有助于将低频非0系数置于高频系数之前,直流系数由于包含了所有图像特征中的关键部分而被单独编码。量化后的系数经过熵编码进一步无损 压缩,通常采用的是Huffman编码。这种压缩编码方法中,图像质量的降低主要是由于对系数的量化造成,且不可恢复。假设子图像为f(x, y),则DCT变换可以由下面的公式实现:
其中式(1)的f(u, v)表示变换域的高频成分,也称为交流系数;式(2)中F(0, 0)表示变换域中的低频成分,也称为直流系数。对变换结果进行分析,可以看出能量主要集中到左上角。DCT变换具有良好的去相关特性。在图像的压缩编码中,N一般取8。
在解码时首先得到各点的DCT系数,然后根据下面的DCT反变换即可恢复出原图像。DCT的反变换公式为:
利用公式(3)可以无损地恢复原图像。在实际的应用中,使用DCT变换的矩阵描述形式更容易理解。
基于系数重要性的分层编码
按照上面的方法对图像变换之后的系数进行编码,产生的码流不具有分层的特性,因而不具有分级传输的能力。为了实现分层压缩,我们对变换后的系数进行重新排列(见图1),再进行支持分级传输特性的编码。
由上面图中的方法可知,变换后能量集中到变换域的左上角。因此基于DCT变换的 图像压缩方法是对系数采用“Z”字型扫描的方式处理。为了实现分层编码,我们将这些系数重新排列,然后进行分层次的编码:左上角的4个系数作为基本层的数 据;左上角16个系数作为第一增强层的数据,这16个系数是除基本层中的四个系数以外的其余系数;从16-47的数据作为第二增强层的数据;其余的16个 系数作为第三增强层数据。
经过重排并进行分层压缩之后,在各个层次上进行测试可以发现,在只传输基本层时可提供峰值信噪比为23.23dB以上的图像;增加一个增强层,图像的峰值信噪比强达到28.9dB以上;如果加入第二个增强层,恢复图像的峰值信噪比可以达到37.35dB。
采用这种方法,通过对DCT变换后 的系数按照其重要性进行取舍,可以非常方便地实现图像序列的分层压缩和分级传输,大大提高压缩算法对不同传输通道的适应能力,并兼顾到帧内图像质量与帧速 率。在一般的应用场合下,只传输第一增强层的数据即可达到较好的视觉效果,此时需要熵编码的数据量已经减少为原数据量的1/4,通过熵编码的方法,可以获 得很高的压缩比。
、
http://www.ed-china.com/ART_8800012576_400002_500004_TS_8425a4e3.HTM
离散余弦变换(DCT)
离散余弦变换DCT (Discrete Cosine Transform)是数码率压缩需要常用的一个变换编码方法。任何连续的实对称函数的付立叶变换中只含余弦项,因此余弦变换与付立叶变换一样有明确的物 理意义。DCT是先将整体图像分成N*N像素块,然后对N*N像素块逐一进行DCT变换。由于大多数图像的高频分量较小,相应于图像高频分量的系数经常为 零,加上人眼对高频成分的失真不太敏感,所以可用更粗的量化。因此,传送变换系数的数码率要大大小于传送图像像素所用的数码率。到达接收端后通过反离散余 弦变换回到样值,虽然会有一定的失真,但人眼是可以接受的。二维正反离散余弦变换的算式:
其中N是像块的水平、垂直像素数,一般取N=8。N大于8时效率增加不多而复杂性大为增加。8*8的二维数据块经DCT后变成8*8个变换系数,这些系 数都有明确的物理意义。譬如当U=0,V=0时F(0,0)是原64个样值的平均,相当于直流分量,随着U,V值增加,相应系数分别代表逐步增加的水平空 间频率和垂直空间频率分量的大小。当我们先只考虑水平方向上一行数据(8个像素)的情况时,如图1所示:
可见图像信号被分解成为直流成分;以及从低频到高频的各种余弦成分;而DCT系数只是表示了该种成分所占原图像信号的份额大小;显然,恢复图像信息可以表示为这样一个矩阵形式:F(n)=C(n)*E(n)
式中E(n)是一个基底 ,C(n)是DCT系数,F(n)则是图像信号。
如果再考虑垂直方向上的变化,那么,就需要一个二维的基底,即该基底不仅要反映水平方向频率的变化;而且要反映垂直空间频率的变化;对应于8*8的像素 块;其空间基底如图2所示:它是由64个像素值所组成的图像,通常也称之为基本图像。把它们称为基本图像是因为在离散余弦变换的反变换式中,任何像块都可 以表示成64个系数的不同大小的组合。既然基本图像相当于变换域中的单一的系数,那么任何像元也可以看成由64个不同幅度的基本图像的组合。这与任何信号 可以分解成基波和不同幅度的谐波的组合具有相同的物理意义。
图2给出了一个对8*8像块进行DCT变换的具体例子:
在如图3所示的实例中,可以看出:经过一次DCT变换计算后,64个样值仍然得到64个系数,本身码率并没有压缩;但是,经DCT变换后,比特数却增加 了。原样值是8比特,数据从0~255;得到的F10即直流分量的最大值是原来256的64/8份,即0~2047,交流分量的范围是- 1024~1023;但经过第2个步骤,即量化之后(图中△:4),大多数高频分量的系数变为0,一般说来,人眼对低频分量比较敏感,对高频分量则不太敏 感;因而量化的结果是去掉了不太重要的高频分量,降低了码率。再通过“之”字型(Zig-Zag)方式读出数据,这样读出也可以减少码率。因为经DCT变 换以后,系数大多数集中在左上角,即低频分量区,因此“之”字型读出实际上是按二维频率的高低顺序读出系数的。这样就便于采用游程长度编码(Run Length Encoding),所谓游程长度编码是指一个码可以同时表示码的值和前面有几个零。这样就发挥了“之”字型读出的优点,因为“之”字型读出,出现连零的 机会比较多,特别到最后,如果都是零,在读到最后一个数后,只要给出“块结束”(EOB)码,就可以结束输出,因此节省了很多码率。
//
离散余弦变换(Discrete Cosine Tranform,简称DCT)是一种与傅立叶变换紧密相关的数学运算。在傅立叶级数展开式中,如果被展开的函数式是偶函数,那么其傅立叶级数中只包含余弦项,再将其离散化可导出余弦变换,因此称之为离散余弦变换。时间域中信号需要许多数据点表示;在x轴表示时间,在y轴表示幅度。信号一旦用傅立叶变换转换到频率域,就只需要几点就可以表示这个相同的信号。如我们已经看到的那样,原因就是信号只含有少量的频率成分。这允许在频率域中只用几个数据点就可以表示信号,而在时间域中表示则需要大量数据点。
这一技术可以应用到彩色图像上。彩色图像有像素组成,这些像素具有RGB彩色值。每个像素都带有x,y坐标,对每种原色使用8x8或者16x16矩阵。在灰度图像中像素具有灰度值,它的x,y坐标由灰色的幅度组成。为了在JPEG中压缩灰度图像,每个像素被翻译为亮度或灰度值。为了压缩RGB彩色图像,这项工作必须进行三遍,因为JPEG分别得处理每个颜色成分,R成分第一个被压缩,然后是G成分,最后是B成分。而一个8x8矩阵的64个值,每个值都带有各自的x,y坐标,这样我们就有了一个像素的三维表示法,称作控件表达式或空间域。通过DCT变换,空间表达式就转化为频谱表达式或频率域。从而到达了数据压缩的目的。
DCT式目前最佳的图像变换,它有很多优点。DCT是正交变换,它可以将8x8图像空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT 产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,如采用快速傅立叶变换可以进行高效的运算,因此它在硬件和软件中都容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。
为什么采用8x8的图像块,其原因是由于计算量和像素之间关系的数量,许多研究表明,在15或20个像素之后,像素间的相关性开始下降。就是说,一列相似的像素通常会持续15到20个像素那么长,在此之后,像素就会改变幅度水平(或反向)。
模拟图像经采样后成为离散化的亮度值然后分成一个个宏块,而一个宏块有分成8x8大小的块,可以用一个矩阵来表示这个块。
在这里,N=8,矩阵中元素f(i,j)表示块中第i行、第j列像素的亮度值。把该矩阵看作一个空间域,显然,块中这些亮度值的大小有一定的随机性,无序性,或者说亮度值的分布没有什么特征;DCT变换就是来解决这个问题的,把这些随机的数据变的有序,便于对数据进行编码压缩。
一维DCT正交变换的公式为:
二维DCT逆变换公式:
其中
对于一维DCT变换,需要N2次乘法,和N(N-1)次加法;像一个8x8阶矩阵运算,如果使用普通的全矩阵乘法运算,需要84次乘法,N2(N2-1)次加法运算,显然,对于实时的压缩需要来说,这是一个极大的运算量,对硬件要求较高。