傅里叶变换与离散余弦变换技术报告

概述

图像处理的方法主要包括两大类,分别是在空间域的处理方法和频率域的处理方法。第一次大作业实现基于点运算的灰度处理是在空间域的处理,而这次大作业主要实现了图像从空间域频率域的变换。频率域的图像信息对于图像的特征提取、空间频域滤波、图像恢复有着重要的价值,所以这种变换有着重要的意义。

自从傅里叶变换提出之后,其在物理学、电子类学科、信号处理、概率论等领域中得到了广泛的应用。对应于计算机离散的特性,傅里叶变换表现为离散傅里叶变换DFT(Discreate Fourier Transform)。到了1965年由J.W.库利T.W.图基提出基2的快速傅里叶变换FFT(Fast Fourier Transform),这种算法使得计算机计算离散傅里叶变换时复数乘法的次数显著减小,一维傅里叶变换的时间复杂度由降低到,使得图像的实时处理成为可能。

在傅里叶级数展开时如果被展开的函数只有实部,即其傅里叶级数中只包含余弦项,可导出离散余弦变换DCT(Discreate Cosine Transform),近年来由于专用集成电路设计的发展,DCT在图像编码中得到了广泛的应用,同时也成为了JPEGMPEG等国际公认编码中的重要算法,此外在视频压缩中最常用的变换方法亦为DCT

基于以上考虑,这次大作业主要实现二维空间域到频率域的快速傅里叶变换FFT,以及离散余弦变换DCT的算法,同上次作业相同,此次开发语言仍使用C#

目录

傅里叶变换与离散余弦变换技术报告概述目录一、快速傅里叶变换(FFT)1. 数学原理1. 一维傅里叶变换1. 一维连续傅里叶变换2. 一维离散傅里叶变换2.二维离散傅里叶变换(DFT)3. 一维快速傅里叶变换(FFT)1. 一维快速傅里叶变换算法的实现2. 一维快速傅里叶逆变换算法的实现4. 二维FFT及其的逆变换的思想及实现2. C#实现0. 图像的扩展1. fft2. ifft3. fft24. ifft25. fftshift3. 效果展示二、离散余弦变换(DCT)1. 数学原理1. 离散余弦变换VS.傅里叶变换2. 一维离散余弦变换3. 二维离散余弦变换4. 离散余弦变换的快速实现1. 一维DCT及其逆变换算法的快速实现2. 二维DCT及其逆变换算法的快速实现2. C#实现0. 图像的扩展1. dct2. idct3. dct24. idct23. 效果展示参考资料附录确定蝶式流程图对偶顶点的算法

一、快速傅里叶变换(FFT)

1. 数学原理

1. 一维傅里叶变换

1. 一维连续傅里叶变换

是一个连续的信号,或者仅有有限个间断点、极值点,满足Dirichlet条件,且满足

傅里叶变换存在,定义为:

傅里叶反变换为:

由欧拉公式有:

其中表示空间域为实函数,而表示频率域为复函数,且由实部虚部组成。满足:

称为信号的概率密度函数,在信号处理中常常习惯把 称为幅度谱或者频谱,而把称为相位谱或简称相谱,其中两种谱的导出公式为:

2. 一维离散傅里叶变换

对于计算机上处理的离散信号来说,采用离散傅里叶变换,其中次离散采样序列可以表示为 ,令为离散实域变量,令为离散频域变量,则一维离散傅里叶变换(DFT)可以表示为:

且离散傅里叶反变换可以表示为:

2.二维离散傅里叶变换(DFT)

对于二维的图像信号,其离散傅里叶变换可以表示为:

且离散傅里叶反变换可以表示为:

与一维情况类似,频谱和相谱的导出公式为:

二维离散傅里叶变换的基本性质有:

3. 一维快速傅里叶变换(FFT)

根据傅里叶变换的性质,进一步推导快速傅里叶变换(FFT),令,根据式(1.4)和式(1.5),对于点序列的一维傅里叶变换对为:

离散傅里叶变换有大量的重复运算,令矩阵:

,则一维离散傅里叶正变换可写为矩阵形式,即:

由于具有周期性,的因子取值有如下特点:

对于DFT可以写成如下矩阵形式:

经过一系列的初等变换可得:

可以画出蝶式流程图

fft蝶式流程图

其中是级,表示当前算法是第几趟执行,对于具有个采样点的蝶式流程图具有级,其中。例如:上图有个采样点,共级,从左到右依次为级、级、级。

此外因子具有如下分布规律:

由于故由上面可以看出规律为:

对于上图级因子分布规律为:

1. 一维快速傅里叶变换算法的实现

从面的分析可以得出以下几个结论,用于指导我们实现FFT算法。

2. 一维快速傅里叶逆变换算法的实现

由公式(1.7)和(1.8)我们发现,求FFT逆变换的算法步骤如下:

4. 二维FFT及其的逆变换的思想及实现

2. C#实现

二维的快速傅里叶变换实现了如下的个函数(为了与MATLAB保持一致,采用相应的名称),分别为一维的快速傅里叶变换及其逆变换,二维的快速傅里叶变换和其逆变换,最后一个函数实现了把低频的频谱从四个角移到中心:

同时实现了个图像绘制的相关函数,其中第一个函数把相继执行FFT2IFFT2的图显示出来,进而与原图对比,后两个函数分别画出FFT2变换后的频率谱和相位谱:

0. 图像的扩展

根据前面的描述可知,我们实现的FFT算法是基的快速算法,而图像的长宽并不一定是基的所以要对图像进行扩展使得算法能够得以执行。

if (currentBitmap != null)
{
  int i = 1;
  //宽度扩展
  while (i < currentBitmap.Width)
    i *= 2;
  imageWidth = i;
  //高度扩展
  i = 1;
  while (i < currentBitmap.Height)
    i *= 2;
  imageHeight = i;
}

1. fft

在第一步描述的fft算法流程具体实现步骤如下:

2. ifft

3. fft2

4. ifft2

5. fftshift

3. 效果展示

由于对图像进行了扩展,所以幅度谱和相位谱的大小跟原来的图略有差别,在执行完ifft2之后得到的图像虚部都非常的小,取原图像大小的实部进行图像绘制,结果如下: FFT

二、离散余弦变换(DCT)

1. 数学原理

1. 离散余弦变换VS.傅里叶变换

在图像压缩领域中,傅里叶变换的一个不足之处在于,它的参数都是复数,在数据的描述上相当于实数的两倍,而且不易计算,因此,人们希望有一种计算的数据量不太大而且压缩效果又很好的变换,在此思想的推动下,出现了离散余弦变换。离散余弦变换与傅里叶变换相比仅采用实部而没有虚部。

2. 一维离散余弦变换

实域函数的一维离散余弦变换定义为:

一维离散余弦变换的反变换定义为:

其中,为归一化加权系数,由下式定义:

3. 二维离散余弦变换

将一维离散余弦变换扩展到二维离散余弦变换,其定义为:

二维离散余弦变换的反变换定义为:

二维离散余弦变换是可分离的,因此二维的离散余弦变换及其逆变换可以逐次应用一维DCT算法加以计算。

4. 离散余弦变换的快速实现

1. 一维DCT及其逆变换算法的快速实现

DCT算法可以通过FFT来实现,下面通过对一维离散余弦变换公式的推导得出其与傅里叶变换之间的关系。

由公式(2.1)可得:

对实域数据作如下延拓:

的离散余弦变换可以写为:

对比式(1.7)和(2.8)发现点的离散傅里叶变换。

故一维离散余弦变换的算法可以梳理如下:

同理对于离散余弦变换IDCT 先在频率空间将做如下延拓:

则离散余弦反变换可以写为:

对比式(1.8)和(2.10)发现为函数点上的离散傅里叶逆变换。

故一维离散余弦逆变换的算法可以梳理如下:

2. 二维DCT及其逆变换算法的快速实现

2. C#实现

二维的离散余弦变换实现了如下的个函数(为了与MATLAB保持一致,采用相应的名称),分别为一维的快速傅里叶变换及其逆变换(与上述fft略有区别,这一fft在函数中对于数据进行了延拓,ifft类似进行了延拓,具体实现之后会提到),一维的离散余弦变换及其逆变换,以及二维的离散余弦变换及其逆变换:

同时实现了个图像绘制的相关函数,其中前一个函数把相继执行了DCT2IDCT2的图显示出来,进而与原图对比,后一个函数画出DCT2变换后的频率谱:

0. 图像的扩展

根据前面的描述可知,我们实现的DCT算法是基的算法,而图像的长宽并不一定是基的所以要对图像进行扩展使得算法能够得以执行。

//判断图像是否需要扩展
if (needExpand())
{
  isExpanded = true;
  int i = 1;
  //宽度扩展
  while (i < currentBitmap.Width)
    i *= 2;
  imageWidth = i;
  //高度扩展
  i = 1;
  while (i < currentBitmap.Height)
    i *= 2;
  imageHeight = i;
}
else
{
  isExpanded = false;
  imageWidth = currentBitmap.Width;
  imageHeight = currentBitmap.Height;
}

1. dct

2. idct

3. dct2

4. idct2

3. 效果展示

由于对图像进行了扩展,所以幅度谱的大小跟原来的图略有差别,结果如下:

DCT

参考资料

附录

确定蝶式流程图对偶顶点的算法