DCT变换

来源:互联网 发布:java final 修饰变量 编辑:程序博客网 时间:2024/05/22 12:04

DCT变换的基本思路是将图像分解为8×8的子块或16×16的子块,并对每一个子块进行单独的DCT变换,然后对变换结果进行量化、编码。随着子块尺寸的增加,算法的复杂度急剧上升,因此,实用中通常采用8×8的子块进行变换,但采用较大的子块可以明显减少图像分块效应。

在图像压缩中,一般把图像分解为8×8的子块,然后对每一个子块进行DCT变换、量化,并对量化后的数据进行Huffman编码。DCT变换可以消除图像的空间冗余,Huffman编码可以消除图像的信息熵冗余。

DCT是无损的,它只将图像从空间域转换到变换域上,使之更能有效地被编码。对一个图像子块而言,将对变换后的6?个系数进行量化,并对Z字顺序扫描系数表进行编码。这种排列方法有助于将低频非0系数置于高频系数之前,直流系数由于包含了所有图像特征中的关键部分而被单独编码。量化后的系数经过熵编码进一步无损压缩,通常采用的是Huffman编码。这种压缩编码方法中,图像质量的降低主要是由于对系数的量化造成,且不可恢复。假设子图像为f(x,y),则DCT变换可以由下面的公式实现:

DCT变换

DCT变换

其中式(1)的f(u, v)表示变换域的高频成分,也称为交流系数;式(2)中F(0, 0)表示变换域中的低频成分,也称为直流系数。对变换结果进行分析,可以看出能量主要集中到左上角。DCT变换具有良好的去相关特性。在图像的压缩编码中,N一般取8。图2:比特分层编码原理框图.

在解码时首先得到各点的DCT系数,然后根据下面的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 CosineTransform)是数码率压缩需要常用的一个变换编码方法。任何连续的实对称函数的付立叶变换中只含余弦项,因此余弦变换与付立叶变换一样有明确的物理意义。DCT是先将整体图像分成N*N像素块,然后对N*N像素块逐一进行DCT变换。由于大多数图像的高频分量较小,相应于图像高频分量的系数经常为零,加上人眼对高频成分的失真不太敏感,所以可用更粗的量化。因此,传送变换系数的数码率要大大小于传送图像像素所用的数码率。到达接收端后通过反离散余弦变换回到样值,虽然会有一定的失真,但人眼是可以接受的。二维正反离散余弦变换的算式:

DCT变换

  
DCT变换

  其中N是像块的水平、垂直像素数,一般取N=8。N大于8时效率增加不多而复杂性大为增加。8*8的二维数据块经DCT后变成8*8个变换系数,这些系数都有明确的物理意义。譬如当U=0,V=0时F(0,0)是原64个样值的平均,相当于直流分量,随着U,V值增加,相应系数分别代表逐步增加的水平空间频率和垂直空间频率分量的大小。当我们先只考虑水平方向上一行数据(8个像素)的情况时,如图1所示:

DCT变换
可见图像信号被分解成为直流成分;以及从低频到高频的各种余弦成分;而DCT系数只是表示了该种成分所占原图像信号的份额大小;显然,恢复图像信息可以表示为这样一个矩阵形式:F(n)=C(n)*E(n)

式中E(n)是一个基底 ,C(n)是DCT系数,F(n)则是图像信号。

如果再考虑垂直方向上的变化,那么,就需要一个二维的基底,即该基底不仅要反映水平方向频率的变化;而且要反映垂直空间频率的变化;对应于8*8的像素块;其空间基底如图2所示:它是由64个像素值所组成的图像,通常也称之为基本图像。把它们称为基本图像是因为在离散余弦变换的反变换式中,任何像块都可以表示成64个系数的不同大小的组合。既然基本图像相当于变换域中的单一的系数,那么任何像元也可以看成由64个不同幅度的基本图像的组合。这与任何信号可以分解成基波和不同幅度的谐波的组合具有相同的物理意义。

图2给出了一个对8*8像块进行DCT变换的具体例子:

     
DCT变换

在如图3所示的实例中,可以看出:经过一次DCT变换计算后,64个样值仍然得到64个系数,本身码率并没有压缩;但是,经DCT变换后,比特数却增加了。原样值是8比特,数据从0~255;得到的F10即直流分量的最大值是原来256的64/8份,即0~2047,交流分量的范围是-1024~1023;但经过第2个步骤,即量化之后(图中△:4),大多数高频分量的系数变为0,一般说来,人眼对低频分量比较敏感,对高频分量则不太敏感;因而量化的结果是去掉了不太重要的高频分量,降低了码率。再通过“之”字型(Zig-Zag)方式读出数据,这样读出也可以减少码率。因为经DCT变换以后,系数大多数集中在左上角,即低频分量区,因此“之”字型读出实际上是按二维频率的高低顺序读出系数的。这样就便于采用游程长度编码(RunLength Encoding),所谓游程长度编码是指一个码可以同时表示码的值和前面有几个零。这样就发挥了“之”字型读出的优点,因为“之”字型读出,出现连零的机会比较多,特别到最后,如果都是零,在读到最后一个数后,只要给出“块结束”(EOB)码,就可以结束输出,因此节省了很多码率。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//////////////////////////////////////////////////////////////////

离散余弦变换(DiscreteCosineTranform,简称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)次加法运算,显然,对于实时的压缩需要来说,这是一个极大的运算量,对硬件要求较高。
原创粉丝点击