傅里叶变换:从空域到频域的图像分析【计算机视觉】
- [傅里叶变换 (Fourier transform,FS)](#傅里叶变换 (Fourier transform,FS))
-
- Ⅰ、引言
-
- [一、空域 vs 频域](#一、空域 vs 频域)
- 二、核心总结
- Ⅱ、数学原理
-
- 一、一维连续傅里叶变换
- 二、二维连续傅里叶变换(图像适配)
- 三、二维离散傅里叶变换(DFT,工程实现)
- 四、核心性质(图像分析常用)
- 五、快速傅里叶变换(FFT):DFT的工程化高效实现
-
- (1)FFT的核心思想(以一维为例)
- [(2)基-2 FFT(最常用的FFT实现)](#(2)基-2 FFT(最常用的FFT实现))
- (3)二维FFT(图像处理)
- Ⅲ、代码实现一维/二维傅里叶变换
- Ⅳ、总结
傅里叶变换 (Fourier transform,FS)
傅里叶变换可将图像从空域转为频域,把图像分解为低频(轮廓、背景)与高频(边缘、细节、噪声)分量,是计算机视觉中去噪、压缩、边缘检测、纹理分析的核心基础工具。
注意:本文所有代码均可导入Jupyter Notebook
完整代码仓库地址:🔗 GitHub:https://github.com/KnifeWen007/CV---StudyNotebook
Ⅰ、引言
在计算机视觉领域,我们对图像的直观认知往往停留在空域------ 即像素坐标下的明暗、色彩与形状。但面对去噪、压缩、纹理分析等实际问题时,仅从空域处理往往效率低、效果受限。
傅里叶变换作为连接空域与频域的核心工具,为图像分析提供了全新视角:它将图像拆解为低频(主导整体轮廓)和高频(决定细节 / 噪声)两类分量,让原本复杂的空域操作(如边缘检测、噪声抑制)在频域中变得简单可控。
一、空域 vs 频域
| 对比维度 | 空域(以五大滤波为核心) | 频域(傅里叶变换+频域滤波) |
|---|---|---|
| 操作空间 | 像素空间 (x, y),直接面向像素点 | 频率空间 (u, v),面向图像的频率成分 |
| 核心操作 | 小卷积核(3x3/5x5)滑动卷积、局部加权求和 | 与图像等大的频域掩码逐点相乘、全局频率调控 |
| 直观性 | 高,可直接看到卷积核权重、理解局部像素影响 | 低,抽象的频率成分拆解,需理解频谱物理意义 |
| 计算效率 | 小核卷积速度快,适合实时处理 | 小核无优势,超大核(≥100x100)效率碾压空域 |
| 核心应用场景 | 日常去噪、平滑、保边、模糊(如美颜、照片修复) | 去周期性噪声(摩尔纹/扫描线)、超大核滤波、图像压缩 |
| 数学本质 | 局部像素的线性/非线性运算 | 基于卷积定理,等价于空域卷积的全局运算 |
| 工程使用频率 | 绝对主流,OpenCV/深度学习框架高度优化 | 补充手段,仅用于空域无法解决的特殊场景 |
二、核心总结
- 空域是「日常操作」:用小卷积核直接处理像素,直观、高效,覆盖90%的日常图像预处理需求(如均值/高斯/中值等五大滤波);
- 频域是「特殊工具」:用傅里叶变换拆解频率,精准解决空域搞不定的问题(如周期性噪声),是空域的补充而非替代;
- 数学等价但实现独立:空域卷积 ≈ 频域相乘(卷积定理),但两者无前置依赖,可独立学习、独立使用。
Ⅱ、数学原理
傅里叶变换的核心思想是:任何周期函数都可以分解为无数个不同频率、不同振幅的正弦/余弦函数的叠加;非周期函数(如单张图像)可视为周期趋近于无穷的特殊情况。
对图像而言,我们处理的是二维离散信号,因此先从一维连续傅里叶变换入手(理解核心),再扩展到二维,最后适配图像的离散化场景。
一、一维连续傅里叶变换
对于定义域为全体实数的连续函数 f ( x ) f(x) f(x)(空域信号),其傅里叶变换 F ( ω ) F(\omega) F(ω)(频域信号)定义为:
F ( ω ) = ∫ − ∞ + ∞ f ( x ) e − j ω x d x F(\omega) = \int_{-\infty}^{+\infty} f(x) e^{-j\omega x} dx F(ω)=∫−∞+∞f(x)e−jωxdx
对应的逆变换(从频域转回空域)为:
f ( x ) = 1 2 π ∫ − ∞ + ∞ F ( ω ) e j ω x d ω f(x) = \frac{1}{2\pi} \int_{-\infty}^{+\infty} F(\omega) e^{j\omega x} d\omega f(x)=2π1∫−∞+∞F(ω)ejωxdω
- x x x:空域变量(如一维信号的位置); ω \omega ω:频率变量(单位:弧度/单位长度),表示信号的振荡快慢;
- j j j:虚数单位(工程中常用 j j j,数学中常用 i i i,满足 j 2 = − 1 j^2=-1 j2=−1);
- e − j ω x e^{-j\omega x} e−jωx:欧拉公式展开为 cos ( ω x ) − j sin ( ω x ) \cos(\omega x) - j\sin(\omega x) cos(ωx)−jsin(ωx),本质是「旋转的复向量」,用于提取信号中频率为 ω \omega ω的分量;
- 直观理解: F ( ω ) F(\omega) F(ω) 表示空域信号 f ( x ) f(x) f(x) 中「频率为 ω \omega ω的正弦/余弦分量」的振幅+相位(复数形式)。
二、二维连续傅里叶变换(图像适配)
图像是二维空域信号 f ( x , y ) f(x,y) f(x,y)( x , y x,y x,y 为像素坐标),其二维傅里叶变换将信号拆解为「水平+垂直」两个方向的频率分量:
正变换(空域→频域):
F ( u , v ) = ∫ − ∞ + ∞ ∫ − ∞ + ∞ f ( x , y ) e − j 2 π ( u x + v y ) d x d y F(u,v) = \int_{-\infty}^{+\infty} \int_{-\infty}^{+\infty} f(x,y) e^{-j2\pi(ux + vy)} dxdy F(u,v)=∫−∞+∞∫−∞+∞f(x,y)e−j2π(ux+vy)dxdy
逆变换(频域→空域):
f ( x , y ) = ∫ − ∞ + ∞ ∫ − ∞ + ∞ F ( u , v ) e j 2 π ( u x + v y ) d u d v f(x,y) = \int_{-\infty}^{+\infty} \int_{-\infty}^{+\infty} F(u,v) e^{j2\pi(ux + vy)} dudv f(x,y)=∫−∞+∞∫−∞+∞F(u,v)ej2π(ux+vy)dudv
- u u u:水平方向频率(表示图像在x轴方向的明暗变化快慢);
- v v v:垂直方向频率(表示图像在y轴方向的明暗变化快慢);
- F ( u , v ) F(u,v) F(u,v):频域系数,复数形式,其模长 |F(u,v)| 称为「幅度谱」(表示该频率分量的强度),相位 arg ( F ( u , v ) ) \arg(F(u,v)) arg(F(u,v)) 称为「相位谱」(表示该频率分量的位置信息);
- 物理意义:
- 低频分量( u , v u,v u,v 趋近于0):对应图像的整体轮廓、背景(变化慢的区域);
- 高频分量( u , v u,v u,v 绝对值大):对应图像的边缘、细节、噪声(变化快的区域)。
三、二维离散傅里叶变换(DFT,工程实现)
实际处理的图像是离散像素矩阵 (如 M × N M \times N M×N 分辨率),无法直接用积分计算,因此需要将连续傅里叶变换离散化,得到「二维离散傅里叶变换(2D-DFT)」:
设图像像素矩阵为 f ( x , y ) f(x,y) f(x,y),其中 x = 0 , 1 , . . . , M − 1 x=0,1,...,M-1 x=0,1,...,M−1, y = 0 , 1 , . . . , N − 1 y=0,1,...,N-1 y=0,1,...,N−1,其2D-DFT为:
F ( u , v ) = 1 M N ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x M + v y N ) F(u,v) = \frac{1}{\sqrt{MN}} \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x,y) e^{-j2\pi(\frac{ux}{M} + \frac{vy}{N})} F(u,v)=MN 1x=0∑M−1y=0∑N−1f(x,y)e−j2π(Mux+Nvy)
逆离散傅里叶变换(IDFT):
f ( x , y ) = 1 M N ∑ u = 0 M − 1 ∑ v = 0 N − 1 F ( u , v ) e j 2 π ( u x M + v y N ) f(x,y) = \frac{1}{\sqrt{MN}} \sum_{u=0}^{M-1} \sum_{v=0}^{N-1} F(u,v) e^{j2\pi(\frac{ux}{M} + \frac{vy}{N})} f(x,y)=MN 1u=0∑M−1v=0∑N−1F(u,v)ej2π(Mux+Nvy)
工程简化与关键说明
-
归一化系数 : 1 M N \frac{1}{\sqrt{MN}} MN 1 是归一化项,不同库(如OpenCV、NumPy)的实现可能将其拆分到正/逆变换中(如NumPy的
fft.2d无归一化,fft.ifft2会自动归一化),不影响频率分析核心; -
快速傅里叶变换(FFT) :直接计算2D-DFT的时间复杂度为 O ( M 2 N 2 ) O(M^2N^2) O(M2N2),工程中使用快速傅里叶变换(FFT) 优化,时间复杂度降至 O ( M N log ( M N ) ) O(MN\log(MN)) O(MNlog(MN)),是实际开发的必用方法;
-
频谱中心化:DFT的结果中,低频分量集中在频谱的四个角落,工程中会通过「平移操作」将低频移到中心(便于观察和滤波),公式为:
F s h i f t ( u , v ) = F ( ( u − M / 2 ) % M , ( v − N / 2 ) % N ) F_{shift}(u,v) = F((u-M/2)\%M, (v-N/2)\%N) Fshift(u,v)=F((u−M/2)%M,(v−N/2)%N)
( % \% % 为取模运算,实现循环平移);
-
幅度谱可视化 :幅度谱的数值范围极大(低频幅度远大于高频),直接显示会丢失细节,通常取对数缩放:
∣ F s h i f t ( u , v ) ∣ l o g = log ( 1 + ∣ F s h i f t ( u , v ) ∣ ) |F_{shift}(u,v)|{log} = \log(1 + |F{shift}(u,v)|) ∣Fshift(u,v)∣log=log(1+∣Fshift(u,v)∣)
四、核心性质(图像分析常用)
傅里叶变换的性质是频域处理的核心依据,以下是计算机视觉中最常用的3个:
| 性质 | 数学表达(空域→频域) | 图像场景解读 |
|---|---|---|
| 卷积定理 | f ( x , y ) ∗ g ( x , y ) ⇔ F ( u , v ) ⋅ G ( u , v ) f(x,y) * g(x,y) \Leftrightarrow F(u,v) \cdot G(u,v) f(x,y)∗g(x,y)⇔F(u,v)⋅G(u,v) | 空域卷积(如滤波)= 频域逐点相乘,超大核滤波时频域更高效 |
| 平移不变性 | f ( x − x 0 , y − y 0 ) ⇔ F ( u , v ) e − j 2 π ( u x 0 M + v y 0 N ) f(x-x_0,y-y_0) \Leftrightarrow F(u,v) e^{-j2\pi(\frac{ux_0}{M}+\frac{vy_0}{N})} f(x−x0,y−y0)⇔F(u,v)e−j2π(Mux0+Nvy0) | 图像平移仅改变相位谱,幅度谱不变 |
| 对称性 | 若 f ( x , y ) f(x,y) f(x,y)为实数(图像像素),则 F ( u , v ) = F ∗ ( − u , − v ) F(u,v) = F^*(-u,-v) F(u,v)=F∗(−u,−v) | 幅度谱关于中心对称,可减少计算量 |
注: ∗ * ∗ 表示卷积运算, ⋅ \cdot ⋅ 表示逐点相乘, F ∗ F^* F∗ 表示复数共轭。
五、快速傅里叶变换(FFT):DFT的工程化高效实现
快速傅里叶变换(Fast Fourier Transform, FFT)并非新的数学变换,而是DFT的快速计算算法,核心是通过「分治思想」将高复杂度的DFT计算拆解为低复杂度的子问题,是数字信号处理(包括图像频域分析)中不可或缺的工程技术。
(1)FFT的核心思想(以一维为例)
DFT的时间复杂度为 O ( N 2 ) O(N^2) O(N2)( N N N 为信号长度),当 N N N 较大时(如图像边长1000),直接计算几乎不可行。FFT的优化思路是:
- 分治拆分 :将长度为 N N N(满足 N = 2 k N=2^k N=2k,即2的整数次幂)的离散信号,按奇偶下标拆分为两个长度为 N / 2 N/2 N/2 的子信号;
- 递归计算:对两个子信号分别计算DFT(子问题);
- 蝶形合并 :利用复指数函数的周期性( e − j 2 π n / N = e − j 2 π ( n + N ) / N e^{-j2\pi n/N} = e^{-j2\pi (n+N)/N} e−j2πn/N=e−j2π(n+N)/N)和对称性,将子问题的结果合并为原信号的DFT结果,合并过程仅需 O ( N ) O(N) O(N) 操作。
通过上述拆分-递归-合并,FFT的时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降至 O ( N log 2 N ) O(N\log_2 N) O(Nlog2N),以 N = 1024 N=1024 N=1024 为例:
- DFT计算量: 1024 2 = 1 , 048 , 576 1024^2 = 1,048,576 10242=1,048,576 次运算
- FFT计算量: 1024 × 10 = 10 , 240 1024 \times 10 = 10,240 1024×10=10,240 次运算(仅为DFT的1%)
(2)基-2 FFT(最常用的FFT实现)
工程中最常用的是「基-2 FFT」,要求信号长度 N = 2 k N=2^k N=2k(若不满足,可通过补零填充至最近的2的幂次),其核心递推公式为:
设离散信号 x [ 0 , 1 , . . . , N − 1 ] x[0,1,...,N-1] x[0,1,...,N−1],其DFT为 X [ 0 , 1 , . . . , N − 1 ] X[0,1,...,N-1] X[0,1,...,N−1],拆分后:
- 偶下标子信号: x e [ m ] = x [ 2 m ] , m = 0 , 1 , . . . , N / 2 − 1 x_e[m] = x[2m],\ m=0,1,...,N/2-1 xe[m]=x[2m], m=0,1,...,N/2−1,DFT为 X e [ k ] X_e[k] Xe[k]
- 奇下标子信号: x o [ m ] = x [ 2 m + 1 ] , m = 0 , 1 , . . . , N / 2 − 1 x_o[m] = x[2m+1],\ m=0,1,...,N/2-1 xo[m]=x[2m+1], m=0,1,...,N/2−1,DFT为 X o [ k ] X_o[k] Xo[k]
则原信号的DFT可通过子信号DFT合并得到(蝶形运算):
X [ k ] = X e [ k ] + W N k ⋅ X o [ k ] , k = 0 , 1 , . . . , N / 2 − 1 X[k] = X_e[k] + W_N^k \cdot X_o[k],\ k=0,1,...,N/2-1 X[k]=Xe[k]+WNk⋅Xo[k], k=0,1,...,N/2−1
X [ k + N / 2 ] = X e [ k ] − W N k ⋅ X o [ k ] , k = 0 , 1 , . . . , N / 2 − 1 X[k+N/2] = X_e[k] - W_N^k \cdot X_o[k],\ k=0,1,...,N/2-1 X[k+N/2]=Xe[k]−WNk⋅Xo[k], k=0,1,...,N/2−1
其中 W N k = e − j 2 π k / N W_N^k = e^{-j2\pi k/N} WNk=e−j2πk/N 称为「旋转因子」,是FFT简化计算的核心。
(3)二维FFT(图像处理)
图像是二维离散信号,二维FFT的实现基于「分离性」:
- 对图像的每一行分别做一维FFT;
- 对第一步结果的每一列 分别做一维FFT;
最终得到二维频域矩阵。
二维FFT的时间复杂度为 O ( M N ( log 2 M + log 2 N ) ) O(MN(\log_2 M + \log_2 N)) O(MN(log2M+log2N))( M × N M \times N M×N 为图像尺寸),远低于直接计算二维DFT的 O ( M 2 N 2 ) O(M^2N^2) O(M2N2)。
Ⅲ、代码实现一维/二维傅里叶变换
一、一维傅里叶变换部分
- 信号生成 :
手动构造了由「50Hz低频正弦波(振幅2)+ 200Hz高频正弦波(振幅1)+ 少量随机噪声」组成的一维时域信号。该信号模拟了现实中常见的"多频率混合线性信号"(如音频、传感器数据),其中噪声的加入更贴近真实场景,而非理想的纯周期信号。 - 核心操作 :
np.fft.fft():调用NumPy优化后的快速傅里叶变换(FFT)算法,将时域信号转换为复数形式的频域信号(复数的模表示频率分量的强度,相位表示位置信息);np.fft.fftfreq():根据采样点数和采样频率,自动生成与频域结果一一对应的频率轴(单位:Hz),解决"频域结果不知道对应多少频率"的可视化问题;np.fft.ifft():执行逆傅里叶变换,将频域信号转回时域,验证傅里叶变换的可逆性(工程上误差可忽略)。
- 可视化逻辑 :
- 时域可视化:仅展示前200个采样点,避免1024个点全部绘制导致波形重叠、无法看清细节;
- 频域可视化:仅展示正频率部分(负频率是正频率的共轭对称分量,无实际物理意义,可省略),并限定0-300Hz显示范围,聚焦我们构造的50Hz/200Hz核心频率峰值,过滤无关频率干扰。
python
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
# 1. 生成一维混合信号(低频+高频+噪声)
N = 1024 # 采样点数量
Fs = 1000 # 采样频率(Hz)
t = np.linspace(0, 1, N, endpoint=False) # 时间轴:0~1秒
# 构造信号:50Hz低频 + 200Hz高频 + 少量噪声
signal_low = 2 * np.sin(2 * np.pi * 50 * t) # 低频分量(振幅2)
signal_high = 1 * np.sin(2 * np.pi * 200 * t) # 高频分量(振幅1)
signal = signal_low + signal_high + 0.5 * np.random.randn(N)
# 2. 执行一维FFT
fft_result = np.fft.fft(signal)
freq = np.fft.fftfreq(N, 1/Fs)
amplitude = np.abs(fft_result)
# 3. 可视化空域+频域结果
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(t[:200], signal[:200], color='#2E86AB')
plt.title('1D Signal (Spatial Domain)')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.grid(True, alpha=0.3)
plt.subplot(1, 2, 2)
positive_idx = freq >= 0
plt.plot(freq[positive_idx], amplitude[positive_idx], color='#A23B72')
plt.xlim(0, 300)
plt.title('1D FFT (Frequency Domain)')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 4. 逆FFT验证(还原信号)
ifft_result = np.fft.ifft(fft_result)
error = np.mean((np.real(ifft_result) - signal)**2)
print(f"逆变换与原信号均方误差:{error:.8f}")

二、二维傅里叶变换(baboon.bmp)部分
python
import numpy as np
import matplotlib.pyplot as plt
import cv2
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
img_path = "baboon.bmp"
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
if img is None:
raise ValueError("""
图片读取失败!请检查:
1. baboon.bmp 是否在当前Notebook同一文件夹下;
2. 文件名是否拼写正确(区分大小写,如Baboon.bmp≠baboon.bmp);
3. 图片是否损坏(可尝试重新下载baboon.bmp测试图)。
""")
# 归一化到0-1范围(消除像素值255的量级影响)
img = img / 255.0
python
# 2. 执行二维FFT + 频谱中心化(核心步骤)
fft2_result = np.fft.fft2(img)
fft2_shift = np.fft.fftshift(fft2_result)
# 3. 频域幅度谱处理(对数缩放,可视化关键)
amplitude = np.abs(fft2_shift)
amplitude_log = np.log(1 + amplitude)
fft2:把「看得见的图像(空域)」转成「看不见的频率数据(频域)」
fftshift:默认低频在四角,移到中心后更易观察
np.abs:取复数矩阵的模长,得到能可视化的幅度谱对数缩放:原始幅度谱低频极亮、高频全黑,缩放后能看清高频细节
python
# 4. 逆FFT还原图像(验证可逆性)
ifft2_shift = np.fft.ifftshift(fft2_shift)
ifft2_result = np.fft.ifft2(ifft2_shift)
img_recon = np.real(ifft2_result)
先逆中心化:把移到中心的频谱还原回原始位置
逆傅里叶变换:把频域数据转回图像形式
取实部:浮点运算会产生微小虚部(无物理意义),只保留实部就是还原的图像
python
# 5. 可视化结果(原图+频域+还原图)
plt.figure(figsize=(18, 6))
plt.subplot(1, 3, 1)
plt.imshow(img, cmap='gray')
plt.title('原始 baboon.bmp 图像(空域)', fontsize=12)
plt.axis('off')
plt.subplot(1, 3, 2)
plt.imshow(amplitude_log, cmap='gray')
plt.title('二维傅里叶变换(对数缩放幅度谱)', fontsize=12)
plt.axis('off')
plt.subplot(1, 3, 3)
plt.imshow(img_recon, cmap='gray')
plt.title('逆变换还原图像(IFFT)', fontsize=12)
plt.axis('off')
plt.tight_layout()
plt.show()
# 输出还原误差(数值越小越精准)
error = np.mean((img_recon - img)**2)
print(f"逆变换与baboon.bmp原图的均方误差:{error:.10f}")

三、频域滤波
核心思想:在频率空间筛选图像的高低频分量,实现模糊/边缘提取等效果
图像读取与预处理
| 操作步骤 | 代码逻辑 | 核心目的 |
|---|---|---|
| 读取图像 | cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) |
强制转为单通道灰度图,规避彩色通道干扰 |
| 异常判断 | if img is None: raise ValueError(...) |
排查路径错误、文件名错误、图片损坏等新手常见问题 |
| 归一化 | img = img / 255.0 |
将像素值从0-255缩至0-1,消除数值量级对计算的影响 |
傅里叶变换(空域→频域)
- 二维FFT :
np.fft.fft2(img)
→ 把「看得见的空域图像」转为「复数形式的频域矩阵」,每个元素对应一组频率分量 - 频谱中心化 :
np.fft.fftshift(fft2_result)
→ 把默认分布在四角的低频分量移至中心,方便后续滤波操作
滤波掩码构建(核心操作)
| 滤波器类型 | 构建逻辑 | 作用原理 |
|---|---|---|
| 低通滤波器 | 全0矩阵 + 中心50×50区域设为1 | 保留低频(图像轮廓),过滤高频(细节/边缘)→ 图像模糊 |
| 高通滤波器 | 全1矩阵 + 中心50×50区域设为0 | 过滤低频(轮廓),保留高频(边缘/纹理)→ 提取边缘 |
5. 频域滤波 + 逆变换(频域→空域)
- 频域相乘 :
fft2_shift * 掩码
→ 逐元素相乘,筛选出掩码为1的频率分量(核心滤波动作) - 逆中心化 :
np.fft.ifftshift(...)
→ 把中心化的频域矩阵还原为FFT原始格式 - 逆FFT :
np.fft.ifft2(...)
→ 将滤波后的频域数据转回空域 - 取实部 :
np.real(...)
→ 忽略浮点运算产生的微小虚部误差,得到最终滤波图像
python
import numpy as np
import matplotlib.pyplot as plt
import cv2
# 中文显示配置
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 读取并预处理图像
img_path = "baboon.bmp"
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
if img is None:
raise ValueError("图片读取失败,请检查路径/文件!")
img = img / 255.0 # 归一化到0-1
# 2. 二维FFT + 频谱中心化
fft2_result = np.fft.fft2(img) # 二维快速傅里叶变换
fft2_shift = np.fft.fftshift(fft2_result) # 频谱中心化
# 3. 构建频域滤波器
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2 # 频域中心
# 3.1 低通滤波器(保留低频,模糊图像)
low_pass_mask = np.zeros((rows, cols), np.float32)
low_pass_mask[crow-25:crow+25, ccol-25:ccol+25] = 1 # 中心50x50区域保留
# 3.2 高通滤波器(保留高频,提取边缘)
high_pass_mask = np.ones((rows, cols), np.float32)
high_pass_mask[crow-25:crow+25, ccol-25:ccol+25] = 0 # 中心50x50区域屏蔽
# 4. 频域滤波 + 逆变换
# 低通滤波
fft2_low = fft2_shift * low_pass_mask
ifft2_low = np.fft.ifft2(np.fft.ifftshift(fft2_low))
img_low = np.real(ifft2_low)
# 高通滤波
fft2_high = fft2_shift * high_pass_mask
ifft2_high = np.fft.ifft2(np.fft.ifftshift(fft2_high))
img_high = np.real(ifft2_high)
# 5. 可视化对比
plt.figure(figsize=(20, 8))
# 原始图像
plt.subplot(2, 3, 1)
plt.imshow(img, cmap='gray')
plt.title('1. 原始图像', fontsize=12)
plt.axis('off')
# 频域幅度谱
plt.subplot(2, 3, 2)
amplitude_log = np.log(1 + np.abs(fft2_shift))
plt.imshow(amplitude_log, cmap='gray')
plt.title('2. 频域幅度谱', fontsize=12)
plt.axis('off')
# 低通滤波掩码
plt.subplot(2, 3, 3)
plt.imshow(low_pass_mask, cmap='gray')
plt.title('3. 低通滤波掩码', fontsize=12)
plt.axis('off')
# 低通滤波结果
plt.subplot(2, 3, 4)
plt.imshow(img_low, cmap='gray')
plt.title('4. 低通滤波后(模糊)', fontsize=12)
plt.axis('off')
# 高通滤波掩码
plt.subplot(2, 3, 5)
plt.imshow(high_pass_mask, cmap='gray')
plt.title('5. 高通滤波掩码', fontsize=12)
plt.axis('off')
# 高通滤波结果
plt.subplot(2, 3, 6)
plt.imshow(img_high, cmap='gray')
plt.title('6. 高通滤波后(边缘)', fontsize=12)
plt.axis('off')
plt.tight_layout()
plt.show()

Ⅳ、总结
本次实践完整覆盖一维/二维傅里叶变换 与频域滤波全流程,从基础变换原理到实际滤波应用,核心知识点与操作逻辑梳理如下:
傅里叶变换(一维/二维)
傅里叶变换的本质是将信号/图像从「时域/空域」转换为「频域」,不同维度的变换适配不同数据类型,核心特征统一:
| 维度 | 适用场景 | 核心操作 | 核心价值 |
|---|---|---|---|
| 一维傅里叶变换 | 一维信号(如波形、序列) | np.fft.fft()+np.fft.fftshift() |
拆解信号的频率成分(如基波、谐波) |
| 二维傅里叶变换 | 二维图像(如灰度图) | np.fft.fft2()+np.fft.fftshift() |
拆分图像的低频(轮廓)/高频(边缘) |
| 通用特征 | - | 逆变换(ifft/ifft2)可还原原始数据 |
频域分析+处理后,能无损失转回原域 |
频域滤波核心应用(基于二维变换)
频域滤波是傅里叶变换的核心落地场景,通过「掩码筛选频率分量」实现图像的差异化处理:
| 滤波类型 | 频率筛选规则 | 空域效果 | 典型应用 |
|---|---|---|---|
| 低通滤波 | 保留频域中心低频,屏蔽高频 | 图像模糊,仅保留整体轮廓 | 图像去噪、平滑处理 |
| 高通滤波 | 屏蔽频域中心低频,保留高频 | 提取边缘/纹理,丢失整体轮廓 | 边缘检测、特征提取 |
- 预处理统一要求 :
- 一维信号:数值归一化,消除量级影响;
- 二维图像:灰度化(单通道)+ 归一化,简化多通道计算、稳定变换结果。
- 频谱中心化 :
一维/二维均需通过fftshift将低频分量移至中心,解决默认低频分散在两端/四角、难以观察和处理的问题。 - 可逆性验证 :
一维/二维逆变换(ifftshift+ifft/ifft2)后,取实部可还原原始数据,均方误差量级达10⁻⁸~10⁻¹²,证明变换无信息丢失。
傅里叶变换是信号处理、图像处理的核心底层算法,一维适配序列/波形分析,二维适配图像分析;
频域滤波是低通/高通、去噪/边缘检测等任务的基础,可扩展为高斯、巴特沃斯等更复杂的滤波器;
掌握「变换→滤波→逆变换」的闭环逻辑,是理解图像压缩、特征提取等高级算法的关键。
上一章
下一章
小波变换:多分辨率分析与图像小波去噪 / 增强 / 融合【计算机视觉】https://blog.csdn.net/R_Feynman_/article/details/158892445