运行环境及编译工具
- 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算法主要是利用了函数“值表示”的思想和傅里叶正交的性质,依靠递归的方法可以大大缩减程序量。一维变换的编程基本思路如下图所示,对二维图像来说,先进行每行的变换,再在行变换的基础上进行列变换。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9P2jH7X7-1642676557251)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-20211026225526745.png)]](https://file2.kaopuke.com:8081/files_image/2023061423/7af9e1841ba0426d91390554db314d27.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)]](https://file2.kaopuke.com:8081/files_image/2023061423/f8dd8e39835047ab893a072698223826.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)]](https://file2.kaopuke.com:8081/files_image/2023061423/440b4f2dd9184de2942bb2996efb8b1f.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)]](https://file2.kaopuke.com:8081/files_image/2023061423/6dd837fa17024c81ae7c902ddf798dda.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6U5OuBT-1642676510879)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_house02.png)]](https://file2.kaopuke.com:8081/files_image/2023061423/1d9912bbd9ec407e945b02f342be83cc.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pl4mGZCM-1642676510881)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_lena_gray_512.png)]](https://file2.kaopuke.com:8081/files_image/2023061423/e1342ac1cafa4b16bc501a8216428b0d.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6T7tGhFu-1642676510882)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_lunar_surface.png)]](https://file2.kaopuke.com:8081/files_image/2023061423/1a3d19e253804f87bd35e4088fbf386b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PaTMuLB-1642676510885)(F:研究生课程图像处理作业第二次作业作业02_梁奥Q_5_characters_test_pattern.png)]6510879)]](https://file2.kaopuke.com:8081/files_image/2023061423/7cb01e69479a4b11aa5e3799b0005944.png)
最后
以上就是激昂电灯胆最近收集整理的关于Python实现FFT及IFFT的全部内容,更多相关Python实现FFT及IFFT内容请搜索靠谱客的其他文章。
发表评论 取消回复