概述
运行环境及编译工具
- Windows
- VS Code
编程语言及库版本
库 | 版本 |
---|---|
Python | 3.7.0 |
copy | 无 |
numpy | 1.19.2 |
opencv | 3.4.2 |
PIL | 8.1.0 |
matplotlib | 3.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算法主要是利用了函数“值表示”的思想和傅里叶正交的性质,依靠递归的方法可以大大缩减程序量。一维变换的编程基本思路如下图所示,对二维图像来说,先进行每行的变换,再在行变换的基础上进行列变换。
如何运行
问题一包含两个函数,均在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()
运行结果
问题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()
运行结果
选做题 测试更多图像的二维快速傅里叶变换 (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")
运行结果
最后
以上就是激昂电灯胆为你收集整理的Python实现FFT及IFFT的全部内容,希望文章能够帮你解决Python实现FFT及IFFT所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复