Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2225619
  • 博文数量: 668
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 8588
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 19:22
文章分类

全部博文(668)

文章存档

2011年(1)

2010年(2)

2009年(273)

2008年(392)

分类:

2009-07-15 08:24:01

2)二维DCT

    MPEG采用了Ahmed N.等人于1974年提出的离散余弦变换(DCT-Discrete Cosine Transform)压缩算法,降低视频信号的空间冗余度(Spatial Redundancy)。因为静态图像和预测误差信号两者具有非常高的空间冗余度,为降低空间冗余度最广泛地采用的频率域分解技术就是DCT。DCT将运动补偿误差或原画面信息块转换成代表不同频率分量的系数集。这有两个优点:其一,信号常将其能量的大部分集中于频率域的1个小范围内,这样一来,描述不重要的分量只需要很少的比特数;其二,频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。视频信号的频谱线在0-6MHz范围内,而且1幅视频图像内包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的视频信号中才含有高频的谱线。因此,在视频信号数字处理时,可根据频谱因素分配比特数:对包含信息量大的低频谱区域分配较多的比特数,对包含信息量低的高频谱区域分配较少的比特数,而图像质量并没有可察觉的损伤,达到码率压缩的目的。然而,这一切要在低熵(Entropy)值的情况下,才能达到有效的编码。能否对一串数据进行有效的编码,取决于每个数据出现的概率。每个数据出现的概率差别大,就表明熵值低,可以对该串数据进行高效编码。反之,出现的概率差别小,熵值高,则不能进行高效编码。视频信号的数字化是在规定的取样频率下由A/D转换器对视频电平转换而来的,以256层或1024层表示输入视频信号的幅度,每个像素的视频信号幅度随着每层的时间而周期性地变化。每个像素的平均信息量的总和为总平均信息量,即熵值。由于每个视频电平发生几乎具有相等的概率,所以视频信号的熵值很高,如图21所示。 熵值是一个定义码率压缩率的参数,视频图像的压缩率依赖于视频信号的熵值,在多数情况下视频信号为高熵值,要进行高效编码,就要将高熵值变为低熵值。怎样变成低熵值呢?这就需要分析视频频谱的特点。由图22视频频谱分析可见:大多数情况下,视频频谱的幅度随着频率的升高而降低。其中低频频谱在几乎相等的概率下获得0到最高的电平。与此相对照,高频频谱通常得到的是低电平及稀少的高电平。显然,低频频谱具有较高的熵值,高频频谱具有较低的熵值。据此,可对视频的低频分量和高频分量分别处理,获得高频的压缩值。


    由上述可见,码率压缩基于如图23所示的变换编码和熵值编码两种算法。前者用于降低熵值,后者将数据变为可降低比特数的有效编码方式。在MPEG标准中,变换编码采用的是DCT,变换过程本身虽然并不产生码率压缩作用,但是变换后的频率系数却非常有利于码率压缩。实际上压缩数字视频信号的整个过程分为块取样、DCT、量化、编码4个主要过程进行,如图24所示。首先在时间域将原始图像分成N(水平)×N(垂直)取样块,根据需要可选择4×4、4×8、8×8、8×16、16×16等块,考虑到消除数据相关性及计算复杂度的恰当的折衷,图中选择了8×8像素块。这些8×8取样的像素块代表了原图像各像素的灰度值,其范围在139-163之间,并依序送入DCT编码器,以便将取样块由时间域转换为频率域的DCT系数块。DCT系统的转换分别在每个取样块中进行,这些块中每个取样是数字化后的值,表示一场中对应像素的视频信号幅度值。式(2)和(3)分别为2维DCT正变换及反变换公式:

    例如,当u,v = 0 时,离散余弦正变换(DCT)后的系数若为F(0,0)=1,则离散余弦反变换(IDCT)后的重现函数f(x,y)=1/8,是个常数值,所以将F(0,0)称为直流(DC)系数;当 u,v≠0时,正变换后的系数为F(u,v)=0,则反变换后的重现函数f(x,y)不是常数,此时正变换后的系数F(u,v)为交流(AC)系数。

    由DCT正变换公式(2)及反变换公式(3)可见,计算有一定的复杂性。但是,实际上这个函数是用代码来实现的,即两个余弦项只在程序开始时进行1次计算,将计算的结果储存起来,而后通过查表就可以了,其它各项都可以通过查表解决,其程序采用了双层嵌套循环。图25是两个余弦项所构成的核函数Gu,v (x,y)计算的示意图,其中设N = 8, u = 2,v = 3;x = 4, y = 5,可求得G2,3(4,5) = G2,3(4)G2,3(5) = (-0.924) ×(+0.979)= - 0.905,以此类推可得到各个点的值,储存起来备查。通过查表,查出各个项的值,用代码来实现图24中DCT编码器输出的DCT系数。根据式(2)和(3)  进行查表后,利用C语言程序对N×N个矩阵元素的代码采用双层嵌套循环计算如下:
for  (u = 0 , u < N, u ++)
     for (v = 0,v < N, v++) {
        temp = 0,0;
        for (x = 0, x < N, x++)
           for (y = 0,y < N, y++) {
              temp + = Cosines[x][u]*Cosines [y] [v] * pixel [x] [y];
           }
       temp* = sqrt(2 * N ) * Coefficients[u][v];
       DCT[u] [v] = INT_ROUND(temp):
}

    代码中用pixel[x][y]表示式中的f(x,y),用DCT[u][v]表示式中的F(u,v)。 
当前,除了上述直接用双层嵌套循环定义DCT外,还有采用余弦变换矩阵来定义DCT的矩阵计算法,二者机理相同。

    由图24及上述变换原理可察觉两点:其一,DCT后的64个DCT频率系数与DCT前的64个像素块相对应,DCT前后都是64个点,它只是1个本身没有压缩作用的无损变换过程。其二,单独1场图像的全部DCT系数块的频谱几乎都集中在最左上角的系数块中,仅从该块的频谱中就可以形成1幅压缩图像;DCT输出的频率系数矩阵最左上角的直流(DC)系数幅度最大,图24中为315,由于代表了x轴和y轴上的DC分量,所以它表示了输入矩阵全部幅度的平均值;以DC系数为出发点向下、向右的其它DCT系数,离DC分量越远,频率越高,幅度值越小,图24中最右下角为-0.11,即图像信息的大部分集中于直流系数及其附近的低频频谱上,离DC系数越来越远的高频频谱几乎不含图像信息,甚至于只含杂波。显然,DCT本身虽然没有压缩作用,却为以后压缩时的“取”、“舍” 奠定了必不可少的基础。

阅读(545) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~