📘 数字图像处理中的二变量离散傅里叶变换(2D DFT)超级无敌具体详细讲解
🧠 一、直觉出发:DFT 是干什么的?
傅里叶变换的目的:
把图像从空间域(像素值)转换到频率域(频率成分)。
为什么要这样做?
- 在空间域里,图像是像素点构成的。
- 在频率域里,图像变成了由一堆“波”的频率、振幅和相位组成。
- 频率越高,图像变化越剧烈(例如边缘);频率越低,图像越平滑(例如大致结构)。
📐 二、公式讲解(二变量离散傅里叶变换)
1️⃣ 变换公式(2D DFT):
给定一个大小为 M×NM \times NM×N 的图像 f(x,y)f(x, y)f(x,y),二维离散傅里叶变换的公式是:
F(u,v)=∑x=0M−1∑y=0N−1f(x,y)⋅e−j2π(uxM+vyN) F(u, v) = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) \cdot e^{-j2\pi \left( \frac{ux}{M} + \frac{vy}{N} \right)} F(u,v)=x=0∑M−1y=0∑N−1f(x,y)⋅e−j2π(Mux+Nvy)
其中:
- f(x,y)f(x, y)f(x,y) 是空间域中的像素值;
- F(u,v)F(u, v)F(u,v) 是频率域中的傅里叶系数;
- u,vu, vu,v 是频率坐标;
- jjj 是虚数单位;
- e−jθ=cos(θ)−jsin(θ)e^{-j\theta} = \cos(\theta) - j\sin(\theta)e−jθ=cos(θ)−jsin(θ)
2️⃣ 逆变换(Inverse DFT):
f(x,y)=1MN∑u=0M−1∑v=0N−1F(u,v)⋅ej2π(uxM+vyN) f(x, y) = \frac{1}{MN} \sum_{u=0}^{M-1} \sum_{v=0}^{N-1} F(u, v) \cdot e^{j2\pi \left( \frac{ux}{M} + \frac{vy}{N} \right)} f(x,y)=MN1u=0∑M−1v=0∑N−1F(u,v)⋅ej2π(Mux+Nvy)
这表示可以完美还原图像,不丢信息!
🔍 三、物理/几何意义
空间域 vs 频率域
空间域 | 频率域 |
---|---|
像素强度 f(x,y)f(x, y)f(x,y) | 不同频率的振幅 + 相位 F(u,v)F(u, v)F(u,v) |
图像本身 | 图像的“构造波” |
怎么理解频率?
- (u,v)=(0,0)(u, v) = (0, 0)(u,v)=(0,0):直流分量,图像平均亮度;
- u,vu, vu,v 越大:频率越高,图像变化越快;
- 高频:细节、边缘;
- 低频:轮廓、平滑区域;
频域可以用来:压缩图像、滤除噪声、检测边缘、增强细节等。
🧰 四、Python + Numpy 实现(代码版)
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
# 加载图像(灰度)
img = Image.open('your_image.png').convert('L')
f = np.array(img)
# 2D DFT
F = np.fft.fft2(f)
# 频谱图像(取对数幅值)
magnitude = np.abs(F)
magnitude_log = np.log(1 + magnitude)
# 中心化(把低频移到中心)
F_shifted = np.fft.fftshift(F)
magnitude_shifted = np.log(1 + np.abs(F_shifted))
# 显示频谱
plt.imshow(magnitude_shifted, cmap='gray')
plt.title('2D DFT Spectrum (Log Scale)')
plt.axis('off')
plt.show()
🔄 五、常见操作与应用
🎯 频率滤波器(滤除特定频率)
- 低通滤波器:保留低频(去噪、模糊);
- 高通滤波器:保留高频(锐化、边缘检测);
- 带通滤波器:保留中等频率(特定细节增强);
操作方法:
- 做 DFT;
- 在频率域上乘以滤波器 mask;
- 做反变换得到滤波后的图像。
📊 六、图像频谱怎么看?
在频域图像(频谱)中:
- 中间是低频(靠中心);
- 边缘是高频(快速变化);
- 白色亮点代表该频率分量强(重要);
- 越亮的频率分量越“参与”图像构造。
🤯 七、深入理解:为何是指数 e−j2π(ux/M+vy/N)e^{-j2\pi(ux/M + vy/N)}e−j2π(ux/M+vy/N)?
复指数 e−jθe^{-j\theta}e−jθ 本质上就是一个旋转的复数(单位圆上绕原点旋转):
- 在数学上,它用来表示“波”的振动;
- 在图像中,它表示图像中某种频率的“构造波”;
- 傅里叶变换就是用一堆正弦波去拟合图像!
可以理解为:
每个 F(u,v)F(u,v)F(u,v) 是整个图像在频率 (u,v)(u,v)(u,v) 下的“响应”或“贡献”。
📎 总结一张图:
f(x,y)(空间域图像)
↓ 2D DFT
F(u,v)(频率域图像)
↓ 操作滤波器
F'(u,v)
↓ IDFT
f'(x,y)(处理后的图像)