运行环境及编译工具
- 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:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211026225526745.png)]](https://i-blog.csdnimg.cn/blog_migrate/c2e571acff51a622376cc39d61056f68.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×NM\times NM×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://i-blog.csdnimg.cn/blog_migrate/4d08fba1f9e796dc79af7690990700f0.png)
问题4 计算图像的中心化二维快速傅里叶变换与谱图像 (12 分)
我们的目标是复现下图中的结果。首先合成矩形物体图像,建议图像尺寸为 512×512,矩形位于图像中心,建议尺寸为 60 像素长,10 像素宽,灰度假设已归一化设为 1. 对于输入图像 f 计算其中心化二维傅里叶变换 F。然后计算对应的谱图像 S=log(1+abs(F)). 显示该谱图像。
基本思路
- 创建空白图像f,像素值均为0
- 将空白图像中心10×6010\times 6010×60区域的像素值置为1
- 中心化f,得到f_shift:f_shift(x,y)=(−1)x+yf(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://i-blog.csdnimg.cn/blog_migrate/39d2240b593b7f97f1a56cf532789704.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://i-blog.csdnimg.cn/blog_migrate/ba8828f85c669d5617db1c92201341fe.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6U5OuBT-1642676510879)(F:\研究生课程\图像处理\作业\第二次作业\作业02_梁奥\Q_5_house02.png)]](https://i-blog.csdnimg.cn/blog_migrate/beeaf5aeaa8ce782c7a556a044a4fb9e.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pl4mGZCM-1642676510881)(F:\研究生课程\图像处理\作业\第二次作业\作业02_梁奥\Q_5_lena_gray_512.png)]](https://i-blog.csdnimg.cn/blog_migrate/fad69502a93706baab974130c8946209.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6T7tGhFu-1642676510882)(F:\研究生课程\图像处理\作业\第二次作业\作业02_梁奥\Q_5_lunar_surface.png)]](https://i-blog.csdnimg.cn/blog_migrate/5248f541aaf8f0740dc7aff6d951aafe.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PaTMuLB-1642676510885)(F:\研究生课程\图像处理\作业\第二次作业\作业02_梁奥\Q_5_characters_test_pattern.png)]6510879)]](https://i-blog.csdnimg.cn/blog_migrate/4dbe5f57cf8f487c12d39269d61b82f8.png)

本文介绍了一种使用Python实现图像的二维快速傅里叶变换(FFT)及其逆变换(IFT)的方法。包括从一维FFT出发,逐步构建起完整的图像变换流程,并通过实际图像验证变换的正确性。
1233





