我是靠谱客的博主 激昂电灯胆,最近开发中收集的这篇文章主要介绍Python实现FFT及IFFT,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

运行环境及编译工具

  • Windows
  • VS Code

编程语言及库版本

版本
Python3.7.0
copy
numpy1.19.2
opencv3.4.2
PIL8.1.0
matplotlib3.4.3

可执行文件

  • HW_2.py
  • HW_2.ipynb
  • 在HW_2.ipynb中执行,详细程序信息在HW_2.py中

问题 1 通过计算一维傅里叶变换实现图像二维快速傅里叶变换(10 分)

实现一个函数 F=dft2D(f), 其中 f 是一个灰度源图像,F 是其对应的二维快速傅里叶变换 (FFT)图像. 具体实现要求按照课上的介绍通过两轮一维傅里叶变换实现。也就是首先计算 源图像每一行的一维傅里叶变换,然后对于得到的结果计算其每一列的一维傅里叶变换。 如果实现采用 MATLAB, 可以直接调用函数 fft 计算一维傅里叶变换。如果采用其他语言, 请选择并直接调用相应的一维傅里叶变换函数。

基本思路

FFT与IFFT算法主要是利用了函数“值表示”的思想和傅里叶正交的性质,依靠递归的方法可以大大缩减程序量。一维变换的编程基本思路如下图所示,对二维图像来说,先进行每行的变换,再在行变换的基础上进行列变换。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P2jH7X7-1642676557251)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20211026225526745.png)]

如何运行

问题一包含两个函数,均在HW_2.py文件中,在HW_2.ipynb中调试执行

from HW_2 import *
# 递归实现一维fft算法
oned_fft(arr):
# 对图像的fft
dft2D(f):

问题2 图像二维快速傅里叶逆变换 (10 分)

实现一个函数 f=idft2D(F), 其中 F 是一个灰度图像的傅里叶变换,f 是其对应的二维快速傅 里叶逆变换 (IFFT)图像,也就是灰度源图像. 具体实现要求按照课上的介绍通过类似正向变 换的方式实现。

基本思路

基本思路与上相同,需要注意的是最后得到的结果需除去图像尺寸 M × N Mtimes N M×N

如何运行

from HW_2 import *
# 递归实现一维fft算法
oned_ifft(arr):
# 对图像的fft
idft2D(f):

问题3 测试图像二维快速傅里叶变换与逆变换 (8 分)

对于给定的输入图像 rose512.tif, 首先将其灰度范围通过归一化调整到[0,1]. 将此归一化的 图像记为 f. 首先调用问题 1 下实现的函数 dft2D 计算其傅里叶变换,记为 F。然后调用问题 2 下的函数 idft2D 计算 F 的傅里叶逆变换,记为 g. 计算并显示误差图像 d = f-g.

基本思路

基本思路为:读图f - 归一化f - FFT变换F - IFFT变换g - 误差图像d

如何运行

from HW_2 import *
Q_3()

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhtUx82f-1642676510871)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_4.png)]

问题4 计算图像的中心化二维快速傅里叶变换与谱图像 (12 分)

我们的目标是复现下图中的结果。首先合成矩形物体图像,建议图像尺寸为 512×512,矩形位于图像中心,建议尺寸为 60 像素长,10 像素宽,灰度假设已归一化设为 1. 对于输入图像 f 计算其中心化二维傅里叶变换 F。然后计算对应的谱图像 S=log(1+abs(F)). 显示该谱图像。

基本思路

  • 创建空白图像f,像素值均为0
  • 将空白图像中心 10 × 60 10times 60 10×60区域的像素值置为1
  • 中心化f,得到f_shift: f _ s h i f t ( x , y ) = ( − 1 ) x + y f ( x , y ) f_shift(x,y)=(-1)^{x+y}f(x,y) f_shift(x,y)=(1)x+yf(x,y)
  • 分别对f,和f_shift进行fft变换得到F,和F_shift
  • 对F_shift计算谱图像

如何运行

from HW_2 import *
Q_4()

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qhtUx82f-1642676510871)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_4.png)]

选做题 测试更多图像的二维快速傅里叶变换 (10 分)

计算其他 5 幅图像的二维快速傅里叶变换: house.tif, house02.tif, lena_gray_512.tif, lunar_surface.tif, characters_test_pattern.tif。注意,有些图像的尺寸不是 2 的整数次幂,需要 进行相应的像素填补处理。如果图像有多个通道可以选择其中的一个通道进行计算。

基本思路

  • 判断图像尺寸是否为二次幂,并返回最近的二次幂值
  • 以上述返回的二次幂值为尺寸创建zero图像,并原图大小的范围内用原图像素填充
  • 对每张图像进行Q3的操作

如何运行

from HW_2 import *
Q_5("./house.tif")
Q_5("./house02.tif")
Q_5("./lena_gray_512.tif")
Q_5("./lunar_surface.tif")
Q_5("./characters_test_pattern.tif")

运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-raLAVlsb-1642676510878)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_house.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6U5OuBT-1642676510879)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_house02.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pl4mGZCM-1642676510881)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_lena_gray_512.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6T7tGhFu-1642676510882)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_lunar_surface.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PaTMuLB-1642676510885)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_characters_test_pattern.png)]6510879)]

最后

以上就是激昂电灯胆为你收集整理的Python实现FFT及IFFT的全部内容,希望文章能够帮你解决Python实现FFT及IFFT所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部