上学期修了数字图像处理这门课程,想着正好趁这个机会写(shui)几篇文章,告诉自己没有白学。傅里叶变换,是图像处理中的一个重要内容,频率域处理的操作都要建立在傅里叶变换的基础上,所以作为这个专栏的开篇,不如就简单介绍和实现一下离散傅里叶变换(DFT)。


一、傅里叶级数和变换

法国数学家傅里叶提出,任何周期函数都可表示为不同频率的正弦函数和/或余弦函数之和,其中每个正弦函数和/或余弦函数都要乘以不同的系数,这个和就称为傅里叶级数。按照这个思想,周期为的连续变量的周期函数,可表示为乘以适当系数的正弦函数和余弦函数之和,即

,系数为

另外根据欧拉公式有,所以上述式子便可展开为正弦函数和余弦函数之和(其中涉及到复数的知识请读者自行了解,这里不作过多说明)。

而一些(曲线下方面积有限的)非周期函数也能用正弦函数和/或余弦函数乘以加权函数的积分来表示。这种情况下的公式就是傅里叶变换,其在许多理论和应用科学中起到非常大的作用。连续单变量函数的傅里叶变换和反变换表示为

上述两个式子共同构成傅里叶变换对,可以表示为

同样,令是两个连续变量的连续函数,则其二维连续傅里叶变换对为

二、离散傅里叶变换(DFT)

有了上一节中所讲的数学基础,我们这里直接给出离散傅里叶的变换对

将式子与连续形式的傅里叶变换进行对比,应该是容易理解的。有时,我们也会发现有的公式把放在了第一个式子中,这并不会影响两个公式形成一个傅里叶变换对。此外在实现的时候,为了方便我们通常将DFT公式写成下面这种形式

若用矩阵计算的形式表达上面这个过程,就是

综上,给出一维DFT的实现过程如下。

#一维离散傅里叶变换
def dft(f):#得到长度M = f.shape[0]#计算变换矩阵x, y = np.mgrid[0:M, 0:M]w = x * ybase = np.exp(-1j*2*np.pi/M)W = base**w#矩阵相乘计算结果F = np.dot(W, f)return F

三、二维DFT及其可分离性

类似于一维DFT,我们也可得到如下的二维离散傅里叶变换对

接下来我们对正变换进行化简,可得

上述过程可以看到,的二维DFT可通过计算的每一行的一维变换,然后沿计算结果的每一列计算一维变换来得到。也就是说二维DFT通过多次一维DFT计算即可得到,参考下面实现过程。

#二维离散傅里叶变换
def dft_2d(f):#得到输入的行数和列数M, N = f.shape[0], f.shape[1]#初始化两个复数类型数组,用于保存结果F, F_x = np.zeros(shape=(M,N), dtype=np.complex128), np.zeros(shape=(M,N), dtype=np.complex128)#逐行逐列进行两次一维傅里叶变换for i in range(M):F_x[i,:] = dft(f[i,:])for i in range(N):F[:,i] = dft(F_x[:,i])return F

四、使用DFT算法计算IDFT

我们将二维离散傅里叶反变换过程两边取复共轭,并将得到的结果乘以

然后,我们可以发现上式的右侧是的DFT。这告诉我们,若把代入计算二维傅里叶正变换的算法中,则结果将是。所以将这个结果取复共轭并乘以就可以得到,就是我们想要的反变换,实现过程如下。

#二维离散傅里叶反变换
def idft_2d(F):#得到行数和列数M, N = F.shape[0], F.shape[1]#先对F的共轭进行正向离散傅里叶变换,除以常数后再取共轭f = np.conjugate(dft_2d(np.conjugate(F)))/M/Nreturn f

五、傅里叶变换中心化

可以证明,一维正离散变换和反离散变换都是无限周期的,周期为,即

如一维情况那样,二维傅里叶变换及其反变换在方向和方向是无限周期的,即

周期性在实现基于DFT的算法中很重要。区间上的变换数据由在点处相遇的两个半周期组成,但该周期的较低部分出现在较高的频率处。针对显示和滤波的目的,在该区间内有一个数据连续并且正确排序的完整变换周期更为方便。也就说我们需要先将变换到,方便我们进一步操作,下图显示了一维和二维情况下的这个过程。

图1 冈萨雷斯原书中关于一维和二维傅里叶变换中心化的说明

下面用代码实现了中心化和逆中心化的过程。

#中心化
def fshift(F):#两个轴平移半个周期M, N = F.shape[0], F.shape[1]F = np.roll(F, int(N/2), axis=0)F = np.roll(F, int(M/2), axis=1)return F#去中心化
def ifshift(F):#两个轴平移半个周期M, N = F.shape[0], F.shape[1]F = np.roll(F, -int(N/2), axis=0)F = np.roll(F, -int(M/2), axis=1)return F

六、效果展示

首先,我们使用DFT得到图片的频率域,然后展示其频谱图。方法是先得到变换后结果的模长,然后使用log函数将其映射到图片可表示的范围。

#图像频谱
def fimage(img):return np.log(np.abs(img))

图2 (a)原图;(b)使用自己完成的DFT函数变换得到频谱图;
(c)使用自己完成的DFT函数和中心化函数变换得到的频谱图;
(d)使用numpy包中FFT函数和中心化函数变换得到的频谱图。

接下来是将自己完成的函数和numpy包中函数混用的情况,从结果上看基本没有差别,可以认为实现效果还不错。

图3 (a)原图;
(b)使用自己实现的函数进行正变换后使用numpy包中的函数进行反变换;
(c)使用numpy包中的函数进行正变换后使用自己实现的函数进行反变换。

七、多说两句

这篇文章参考《冈萨雷斯 数字图像处理(第四版)》,只是对书中核心内容进行了总结并加以实现,未涉及到的细节可见原著。

图像处理之离散傅里叶变换(DFT)相关推荐

  1. 傅里叶变换、离散傅里叶变换(DFT)、快速傅里叶变换(FFT)详解

    前置知识 以下内容参考<复变函数与积分变换>,如果对积分变换有所了解,完全可以跳过忽略 复数的三角表达式如下 Z=r(cosθ+isinθ)Z=r(cos\theta+isin\theta ...

  2. 【matlab 图像处理】离散傅里叶变换离散余弦变换K-L变换小波变换

    [matlab 图像处理]离散傅里叶变换&离散余弦变换&K-L变换&小波变换 正交变换是信号处理的一种有效工具.图像信号不仅可以在空间域表示,也可以在频域表示,后者将有利于许多 ...

  3. Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析

    文章目录 1. 定义 2. 变换和处理 3. 函数 4. 实例演示 例1:单频正弦信号(整数周期采样) 例2:单频正弦信号(非整数周期采样) 例3:含有直流分量的单频正弦信号 例4:正弦复合信号 例5 ...

  4. 傅里叶级数FS,连续时间傅里叶变换CTFT,离散时间傅里叶变换DTFT,离散傅里叶变换DFT,推导与联系(一)

    本文主要从傅里叶级数 FS,连续时间傅里叶变换 CTFT,离散时间傅里叶变换 DTFT,以及离散傅里叶变换 DFT 之间的区别与联系进行了比较详细的讨论,主要注重于公式形式上的推导,略去了相关的图像示 ...

  5. 离散傅里叶变换 (DFT)、快速傅里叶变换 (FFT)

    目录 离散傅里叶变换 (DFT) 离散傅里叶变换的基 离散傅里叶变换 快速傅里叶变换 (FFT) 卷积 线性时不变系统 傅里叶级数 参考文献 离散傅里叶变换 (DFT) 离散傅里叶变换的基 对于周期为 ...

  6. 【算法】离散傅里叶变换(DFT)

    真实的系统是会离散的,时变的.理想者将瞬时态看成时线性的系统,将时变系统分成了不同阶段.离散在围观层面是连续的,但从表层感受时,变化是迅猛的,可以忽略不计变化的过程,因而成为了离散. 一.离散系统 离 ...

  7. 傅里叶级数FS,连续时间傅里叶变换CTFT,离散时间傅里叶变换DTFT,离散傅里叶变换DFT,推导与联系(二)

    由于本文公式所占用的字符比较多,无法在一篇博客中完整发布,所以将其分为两篇博客.本篇主要介绍了离散傅里叶变换 DFT 的内容,以及相关的总结.对于前置内容,包括傅里叶级数 FS,连续时间傅里叶变换 C ...

  8. 离散傅里叶变换DFT

    离散傅里叶变换DFT 离散傅里叶变换的定义 实部和虚部的计算 振幅的计算 说明与注意 三角函数公式 特殊角的三角函数值 举例说明 全图汇总 离散傅里叶变换的定义 设x(n)是一个长度为M的有限长序列, ...

  9. 第4章 Python 数字图像处理(DIP) - 频率域滤波4 - 单变量的离散傅里叶变换DFT

    目录标题 单变量的离散傅里叶变换 由取样后的函数的连续变换得到DFT 取样和频率间隔的关系 单变量的离散傅里叶变换 由取样后的函数的连续变换得到DFT 对原函数的变换取样后的业的发展的变换F~(μ)\ ...

最新文章

  1. php 数组 随机选择_php中通过数组进行高效随机抽取指定条记录的算法
  2. 【MySql】在Linux下安装MySql数据库
  3. 2020游戏直播行业数据报告
  4. 性能测试分析与调优原理
  5. 体验Visual Studio 2015 Windows Forms应用程序开发与维护
  6. 插入排序(Insert Sort)
  7. 破解安装IAR编辑器
  8. csdn ruby语言入门_Ruby编程语言入门指南
  9. matlab gui 分辨率,MATLAB GUI控件大小和字体适应界面和电脑分辨率
  10. 计算机出现函数不正确的是,小编教你快速修复无法访问函数不正确的方法
  11. 全国2016年实施不动产登记 潘石屹预言房价下跌
  12. [置顶] 关于Android图形系统的一些事实真相
  13. Java的全局异常处理(统一异常处理)+登陆拦截鉴权+注解实现记录日志
  14. 仪表框架 3500/05-01-01-00/HONEYWELL51403776-100
  15. android 高德静态地图api,静态地图-API文档-开发指南-Web服务 API | 高德地图API
  16. 《第十三届服创大赛A23项目-基于区块链的艺术品数字资产确权流通系统》的未完成版
  17. 书论83 梁巘《承晋斋积闻录》
  18. 自动解题批改与自适应学习 AI在教育行业的应用实践
  19. Qt编写安防视频监控系统18-云台控制
  20. Win10更新、重装后 触摸板无法关闭

热门文章

  1. 【Python】set与frozenset的区别
  2. linux下文件访问时间、修改时间、更改时间
  3. 数据结构之什么是二叉树(满二叉树和完全二叉树)以及和树的区别
  4. C语言typedef的用法详解
  5. 微信扫一扫二维码跳转到浏览器打开下载链接怎么做的
  6. 蓝牙控制小车教程:STC89C52RC + HC-06蓝牙模块
  7. Exactly Once,究竟是对什么Exactly Once?
  8. 为什么台湾人士出的技术书籍比大陆好?
  9. 【Tableau 设计提示7.0】趋势线的应用
  10. 《51单片机》用Keil uVision4编辑程序的步骤