2026/4/6 9:33:10
网站建设
项目流程
专业的制作网站开发公司,成立公司代理,建设网站的相关费用,汕头网站推广排名前言频域滤波是数字图像处理的核心技术之一#xff0c;其核心思想是将图像从空间域转换到频率域#xff0c;通过修改频率分量实现图像增强、去噪、锐化等操作。本文将按照《数字图像处理》第 4 章的完整目录#xff0c;用通俗易懂的语言讲解频域滤波的全知识点#xff0c;并…前言频域滤波是数字图像处理的核心技术之一其核心思想是将图像从空间域转换到频率域通过修改频率分量实现图像增强、去噪、锐化等操作。本文将按照《数字图像处理》第 4 章的完整目录用通俗易懂的语言讲解频域滤波的全知识点并配套可直接运行的 Python 代码、效果对比图帮你彻底吃透频域滤波4.1 背景知识4.1.1 傅里叶级数与傅里叶变换的发展简史傅里叶变换的核心是“任何周期函数都可以分解为正弦 / 余弦函数的叠加”其发展脉络可总结为1807 年傅里叶提出 “任何周期函数都可展开为三角函数级数”傅里叶级数1822 年《热的解析理论》正式发表奠定傅里叶分析基础后续经柯西、狄利克雷等数学家完善形成现代傅里叶变换体系数字时代离散傅里叶变换DFT和快速傅里叶变换FFT让傅里叶分析落地到计算机图像处理。4.1.2 本章示例说明本章所有示例基于 Python 实现依赖库包括numpy数值计算、cv2图像读取 / 处理、matplotlib可视化、scipy信号处理。环境准备pip install numpy opencv-python matplotlib scipy4.2 预备知识4.2.1 复数代码示例复数基本运算import numpy as np # 定义复数三种正确方式任选其一即可 # 方式1直接用Python原生复数推荐最简单 z1 3 4j # 34j z2 1 2j # 12j # 方式2np.complex_ 传入字符串兼容旧版本NumPy # z1 np.complex_(34j) # z2 np.complex_(12j) # 方式3np.array 构造复数数组适合批量定义 # z1 np.array([3, 4], dtypenp.complex128) # z2 np.array([1, 2], dtypenp.complex128) # 基本运算 z_add z1 z2 # 加法 z_mul z1 * z2 # 乘法 z_abs np.abs(z1) # 模长 z_angle np.angle(z1)# 辐角弧度 # 输出结果 print(fz1 {z1}, z2 {z2}) print(fz1 z2 {z_add}) print(fz1 * z2 {z_mul}) print(f|z1| {z_abs}, 辐角 {z_angle:.2f} rad)输出z1 (34j), z2 (12j) z1 z2 (46j) z1 * z2 (-510j) |z1| 5.0, 辐角 0.93 rad4.2.2 傅里叶级数代码示例方波的傅里叶级数逼近import numpy as np import matplotlib.pyplot as plt # 设置中文字体解决matplotlib中文显示问题 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 定义方波函数 def square_wave(t, T2*np.pi): return np.where(np.mod(t, T) T/2, 1, -1) # 傅里叶级数逼近 def fourier_series(t, n_max, T2*np.pi): omega0 2*np.pi / T result 0 for n in range(1, n_max1, 2): # 只保留奇次谐波 an 0 bn 4/(n*np.pi) result an*np.cos(n*omega0*t) bn*np.sin(n*omega0*t) return result # 生成数据 t np.linspace(-2*np.pi, 2*np.pi, 1000) y_original square_wave(t) # 不同项数的逼近 y_1 fourier_series(t, 1) y_5 fourier_series(t, 5) y_20 fourier_series(t, 20) # 可视化对比 plt.figure(figsize(12, 8)) plt.subplot(2, 2, 1) plt.plot(t, y_original, label原始方波) plt.title(原始方波) plt.grid(True) plt.subplot(2, 2, 2) plt.plot(t, y_1, label1项逼近, colororange) plt.title(1项傅里叶级数逼近) plt.grid(True) plt.subplot(2, 2, 3) plt.plot(t, y_5, label5项逼近, colorred) plt.title(5项傅里叶级数逼近) plt.grid(True) plt.subplot(2, 2, 4) plt.plot(t, y_20, label20项逼近, colorgreen) plt.title(20项傅里叶级数逼近) plt.grid(True) plt.tight_layout() plt.show()效果对比图1 项逼近仅一条正弦曲线与方波差距大5 项逼近开始接近方波轮廓20 项逼近几乎与原始方波重合验证了 “傅里叶级数可逼近周期函数”。4.2.3 冲激函数及其筛分性质代码示例冲激函数可视化与筛分性质验证import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 模拟冲激函数离散近似 def delta_func(t, t00, eps0.01): return np.where(np.abs(t - t0) eps, 1/eps, 0) # 定义测试函数 def f(t): return np.sin(t) 0.5*t # 生成数据 t np.linspace(-5, 5, 1000) delta delta_func(t, t01) # t01处的冲激 f_t f(t) # 验证筛分性质积分f(t)*delta(t-1) ≈ f(1) integral np.trapz(f_t * delta, t) f_1 f(1) # 可视化 plt.figure(figsize(10, 6)) plt.plot(t, f_t, labelf(t) sin(t) 0.5t, colorblue) plt.plot(t, delta, labelδ(t-1), colorred, alpha0.7) plt.scatter(1, f_1, colorgreen, s100, labelff(1) {f_1:.2f}) plt.title(f冲激函数的筛分性质积分结果 {integral:.2f} ≈ f(1)) plt.xlabel(t) plt.ylabel(幅值) plt.legend() plt.grid(True) plt.show()4.2.4 单变量连续函数的傅里叶变换4.2.5 卷积代码示例卷积可视化import numpy as np import matplotlib.pyplot as plt from scipy.signal import convolve plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 定义两个函数 t np.linspace(-5, 5, 1000) f np.exp(-t**2) # 高斯函数 g np.where((t -1) (t 1), 1, 0) # 矩形窗 # 计算卷积 conv convolve(f, g, modesame) / len(t) # 归一化 # 可视化 plt.figure(figsize(12, 4)) plt.subplot(1, 3, 1) plt.plot(t, f, labelf(t) e^(-t²)) plt.title(函数f(t)) plt.grid(True) plt.subplot(1, 3, 2) plt.plot(t, g, labelg(t) 矩形窗) plt.title(函数g(t)) plt.grid(True) plt.subplot(1, 3, 3) plt.plot(t, conv, labelf*g, colorred) plt.title(卷积结果 (f*g)(t)) plt.grid(True) plt.tight_layout() plt.show()4.3 采样与采样函数的傅里叶变换4.3.1 采样原理4.3.2 采样函数的傅里叶变换4.3.3 采样定理4.3.4 混叠现象当采样频率不满足奈奎斯特定理时高频分量会 “折叠” 到低频区域导致信号失真称为混叠。代码示例采样与混叠对比import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 定义原始信号10Hz 20Hz 正弦波 def signal(t): return np.sin(2*np.pi*10*t) 0.5*np.sin(2*np.pi*20*t) # 生成连续信号 t_continuous np.linspace(0, 1, 1000) y_continuous signal(t_continuous) # 采样1满足奈奎斯特采样频率50Hz 2*20Hz fs1 50 t1 np.linspace(0, 1, fs1) y1 signal(t1) # 采样2不满足奈奎斯特采样频率30Hz 2*20Hz fs2 30 t2 np.linspace(0, 1, fs2) y2 signal(t2) # 可视化 plt.figure(figsize(12, 8)) plt.subplot(2, 1, 1) plt.plot(t_continuous, y_continuous, label原始连续信号, colorblue) plt.scatter(t1, y1, colorred, labelf采样频率{fs1}Hz无混叠) plt.title(满足奈奎斯特定理无混叠) plt.xlabel(时间 (s)) plt.ylabel(幅值) plt.legend() plt.grid(True) plt.subplot(2, 1, 2) plt.plot(t_continuous, y_continuous, label原始连续信号, colorblue) plt.scatter(t2, y2, colororange, labelf采样频率{fs2}Hz混叠) plt.title(不满足奈奎斯特定理混叠失真) plt.xlabel(时间 (s)) plt.ylabel(幅值) plt.legend() plt.grid(True) plt.tight_layout() plt.show()效果对比50Hz 采样离散点能准确还原原始信号30Hz 采样离散点明显偏离原始信号出现混叠失真。4.3.5 基于采样数据的函数重建恢复4.4 单变量离散傅里叶变换DFT4.4.1 由采样函数的连续傅里叶变换推导离散傅里叶变换4.4.2 采样间隔与频率间隔的关系代码示例单变量 DFT 计算import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 生成离散信号5Hz正弦波采样频率50Hz长度100 fs 50 N 100 t np.arange(N) / fs f_n np.sin(2*np.pi*5*t) # 计算DFT F_k np.fft.fft(f_n) # 频率轴 freq np.fft.fftfreq(N, 1/fs) # 幅值谱归一化 amp np.abs(F_k) / N # 可视化 plt.figure(figsize(10, 6)) plt.subplot(2, 1, 1) plt.plot(t, f_n) plt.title(原始离散信号5Hz正弦波) plt.xlabel(时间 (s)) plt.ylabel(幅值) plt.grid(True) plt.subplot(2, 1, 2) plt.stem(freq, amp, basefmtb-) plt.title(DFT幅值谱) plt.xlabel(频率 (Hz)) plt.ylabel(幅值) plt.xlim(0, fs/2) # 只显示正频率 plt.grid(True) plt.tight_layout() plt.show()4.5 扩展至双变量函数4.5.1 二维冲激函数及其筛分性质4.5.2 二维连续傅里叶变换对4.5.3 二维采样与二维采样定理4.5.4 图像中的混叠现象图像采样时若分辨率不足采样频率低会出现边缘模糊、摩尔纹等混叠现象如低分辨率图片放大后的锯齿。4.5.5 二维离散傅里叶变换及其逆变换代码示例图像的二维 DFT 与逆变换import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 读取图像灰度图 img cv2.imread(lena.jpg, cv2.IMREAD_GRAYSCALE) if img is None: # 若读取失败生成测试图像 img np.zeros((256, 256), dtypenp.uint8) img[100:150, 100:150] 255 # 白色方块 # 计算二维DFT dft np.fft.fft2(img) # 将低频移到中心 dft_shift np.fft.fftshift(dft) # 幅值谱对数缩放便于可视化 magnitude_spectrum 20 * np.log(np.abs(dft_shift)) # 逆DFT dft_shift_back np.fft.ifftshift(dft_shift) img_back np.fft.ifft2(dft_shift_back) img_back np.abs(img_back).astype(np.uint8) # 可视化 plt.figure(figsize(12, 6)) plt.subplot(1, 3, 1) plt.imshow(img, cmapgray) plt.title(原始图像) plt.axis(off) plt.subplot(1, 3, 2) plt.imshow(magnitude_spectrum, cmapgray) plt.title(DFT幅值谱中心对齐) plt.axis(off) plt.subplot(1, 3, 3) plt.imshow(img_back, cmapgray) plt.title(逆DFT恢复图像) plt.axis(off) plt.tight_layout() plt.show()效果说明原始图像灰度图或测试方块图幅值谱中心亮斑为低频分量对应图像整体亮度边缘为高频分量对应边缘 / 细节恢复图像与原始图像几乎一致验证 IDFT 的正确性。4.6 二维离散傅里叶变换的性质4.6.1 空间域间隔与频域间隔的关系4.6.2 平移性与旋转性代码示例图像平移的 DFT 变化import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 读取图像 img cv2.imread(lena.jpg, cv2.IMREAD_GRAYSCALE) if img is None: img np.zeros((256, 256), dtypenp.uint8) img[100:150, 100:150] 255 # 图像平移右移50下移50 M, N img.shape dx, dy 50, 50 img_shift np.roll(np.roll(img, dx, axis1), dy, axis0) # 计算DFT dft_original np.fft.fftshift(np.fft.fft2(img)) dft_shift np.fft.fftshift(np.fft.fft2(img_shift)) # 幅值谱 mag_original 20 * np.log(np.abs(dft_original)) mag_shift 20 * np.log(np.abs(dft_shift)) # 可视化 plt.figure(figsize(12, 6)) plt.subplot(2, 2, 1) plt.imshow(img, cmapgray) plt.title(原始图像) plt.axis(off) plt.subplot(2, 2, 2) plt.imshow(img_shift, cmapgray) plt.title(平移后图像) plt.axis(off) plt.subplot(2, 2, 3) plt.imshow(mag_original, cmapgray) plt.title(原始图像DFT幅值谱) plt.axis(off) plt.subplot(2, 2, 4) plt.imshow(mag_shift, cmapgray) plt.title(平移图像DFT幅值谱) plt.axis(off) plt.tight_layout() plt.show()效果说明平移后图像的 DFT 幅值谱与原始一致仅相位变化验证平移性。4.6.3 周期性4.6.4 对称性4.6.5 傅里叶谱与相位角代码示例幅值谱与相位谱可视化import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False img cv2.imread(lena.jpg, cv2.IMREAD_GRAYSCALE) if img is None: img np.zeros((256, 256), dtypenp.uint8) img[100:150, 100:150] 255 # 计算DFT并移到中心 dft np.fft.fft2(img) dft_shift np.fft.fftshift(dft) # 幅值谱和相位谱 magnitude 20 * np.log(np.abs(dft_shift)) phase np.angle(dft_shift) # 可视化 plt.figure(figsize(12, 6)) plt.subplot(1, 3, 1) plt.imshow(img, cmapgray) plt.title(原始图像) plt.axis(off) plt.subplot(1, 3, 2) plt.imshow(magnitude, cmapgray) plt.title(幅值谱) plt.axis(off) plt.subplot(1, 3, 3) plt.imshow(phase, cmapgray) plt.title(相位谱) plt.axis(off) plt.tight_layout() plt.show()4.6.6 二维卷积定理4.6.7 二维离散傅里叶变换性质总结4.7 频域滤波基础4.7.1 频域的其他特性低频分量对应图像的整体亮度、大结构高频分量对应图像的边缘、细节、噪声滤波核心修改频域分量保留 / 增强 / 抑制再逆变换回空间域。4.7.2 频域滤波基本原理4.7.3 频域滤波步骤总结图像预处理灰度化、补零可选计算二维 DFT 并中心对齐设计频域滤波器低通 / 高通 / 带通等频域相乘滤波逆 DFT 转换回空间域后处理归一化、取实部。4.7.4 空间域滤波与频域滤波的对应关系空间域操作频域操作平滑均值 / 高斯滤波低通滤波锐化拉普拉斯 / Sobel高通滤波边缘检测高通滤波噪声去除低通滤波4.8 基于频域滤波器的图像平滑图像平滑的核心是抑制高频分量噪声 / 细节保留低频分量。4.8.1 理想低通滤波器ILPF4.8.2 巴特沃斯低通滤波器BLPF4.8.3 高斯低通滤波器GLPF4.8.4 低通滤波的扩展示例完整代码三种低通滤波器对比import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 1. 读取并预处理图像 img cv2.imread(../picture/AALi.jpg, cv2.IMREAD_GRAYSCALE) if img is None: # 生成测试图像添加噪声 img np.zeros((256, 256), dtypenp.uint8) img[80:180, 80:180] 255 # 添加高斯噪声 noise np.random.normal(0, 30, img.shape).astype(np.float32) img np.clip(img noise, 0, 255).astype(np.uint8) M, N img.shape # M高度(行), N宽度(列) print(f图像形状M{M}, N{N}) # 打印维度方便排查 # 2. 计算DFT并中心对齐 dft np.fft.fft2(img) dft_shift np.fft.fftshift(dft) # 3. 生成频域网格关键修正先v后u匹配图像行列 # 注意meshgrid第一个参数对应列(v)第二个对应行(u) v np.arange(N) # 列方向宽度 u np.arange(M) # 行方向高度 u_grid, v_grid np.meshgrid(u, v, indexingij) # indexingij 确保(u,v)对应(行,列) # 中心坐标 u0, v0 M // 2, N // 2 # 距离D(u,v)计算每个频域点到中心的欧式距离 D np.sqrt((u_grid - u0) ** 2 (v_grid - v0) ** 2) print(f距离矩阵形状{D.shape}DFT移位后形状{dft_shift.shape}) # 验证维度匹配 # 4. 设计滤波器截止频率D030 D0 30 n 2 # 巴特沃斯阶数 # 理想低通 H_ilpf np.where(D D0, 1, 0) # 巴特沃斯低通 H_blpf 1 / (1 (D / D0) ** (2 * n)) # 高斯低通 H_glpf np.exp(-(D ** 2) / (2 * D0 ** 2)) # 5. 频域滤波现在维度匹配可正常相乘 g_shift_ilpf dft_shift * H_ilpf g_shift_blpf dft_shift * H_blpf g_shift_glpf dft_shift * H_glpf # 6. 逆DFT添加小技巧取实部后归一化避免数值误差 # 理想低通 g_ilpf np.fft.ifftshift(g_shift_ilpf) g_ilpf np.fft.ifft2(g_ilpf) g_ilpf np.real(g_ilpf) # 优先取实部避免虚部残留 g_ilpf np.clip(g_ilpf, 0, 255).astype(np.uint8) # 归一化到0-255 # 巴特沃斯低通 g_blpf np.fft.ifftshift(g_shift_blpf) g_blpf np.fft.ifft2(g_blpf) g_blpf np.real(g_blpf) g_blpf np.clip(g_blpf, 0, 255).astype(np.uint8) # 高斯低通 g_glpf np.fft.ifftshift(g_shift_glpf) g_glpf np.fft.ifft2(g_glpf) g_glpf np.real(g_glpf) g_glpf np.clip(g_glpf, 0, 255).astype(np.uint8) # 7. 可视化补充第8个子图避免布局警告 plt.figure(figsize(15, 10)) # 原始图像 plt.subplot(2, 4, 1) plt.imshow(img, cmapgray) plt.title(原始图像含噪声) plt.axis(off) # 理想低通 plt.subplot(2, 4, 2) plt.imshow(g_ilpf, cmapgray) plt.title(理想低通滤波振铃效应明显) plt.axis(off) # 巴特沃斯低通 plt.subplot(2, 4, 3) plt.imshow(g_blpf, cmapgray) plt.title(巴特沃斯低通轻微振铃) plt.axis(off) # 高斯低通 plt.subplot(2, 4, 4) plt.imshow(g_glpf, cmapgray) plt.title(高斯低通无振铃) plt.axis(off) # 滤波器可视化 plt.subplot(2, 4, 5) plt.imshow(H_ilpf, cmapgray) plt.title(理想低通滤波器) plt.axis(off) plt.subplot(2, 4, 6) plt.imshow(H_blpf, cmapgray) plt.title(巴特沃斯低通滤波器) plt.axis(off) plt.subplot(2, 4, 7) plt.imshow(H_glpf, cmapgray) plt.title(高斯低通滤波器) plt.axis(off) # 补充第8个子图避免布局警告 plt.subplot(2, 4, 8) plt.text(0.5, 0.5, 低通滤波对比, hacenter, vacenter, fontsize12) plt.axis(off) plt.tight_layout() plt.show()效果对比理想低通噪声去除明显但边缘出现振铃效应吉布斯现象巴特沃斯低通振铃效应减轻平滑效果适中高斯低通无振铃效应平滑效果最自然。4.9 基于频域滤波器的图像锐化图像锐化的核心是增强高频分量边缘 / 细节抑制低频分量。4.9.1 理想高通滤波器IHPF4.9.2 巴特沃斯高通滤波器BHPF4.9.3 高斯高通滤波器GHPF4.9.4 频域中的拉普拉斯算子4.9.5 非锐化掩模、高提升滤波与高频强调滤波4.9.6 同态滤波同时增强对比度和抑制噪声核心是将图像分解为照度低频和反射高频分量完整代码高通滤波 同态滤波对比import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 1. 读取图像 img cv2.imread(../picture/TianHuoSanXuanBian.jpg, cv2.IMREAD_GRAYSCALE) if img is None: # 生成测试图像低对比度 img np.zeros((256, 256), dtypenp.uint8) img[80:180, 80:180] 255 # 降低对比度 img (img * 0.5).astype(np.uint8) M, N img.shape # M高度(行), N宽度(列) print(f图像形状M{M}, N{N}) # 打印维度方便排查 # 2. 计算DFT并中心对齐 dft np.fft.fft2(img.astype(np.float32)) dft_shift np.fft.fftshift(dft) # 3. 生成频域网格关键修正匹配图像行列维度 # 注意先定义列(v)、后定义行(u)并使用indexingij确保维度匹配 v np.arange(N) # 列方向宽度 u np.arange(M) # 行方向高度 u_grid, v_grid np.meshgrid(u, v, indexingij) # 生成(M,N)形状的网格 # 中心坐标 u0, v0 M // 2, N // 2 # 距离D(u,v)添加极小值eps避免除零 eps 1e-8 # 防止D0导致除零 D np.sqrt((u_grid - u0) ** 2 (v_grid - v0) ** 2) eps print(f距离矩阵形状{D.shape}DFT移位后形状{dft_shift.shape}) # 验证维度匹配 # 4. 设计高通滤波器截止频率D030 D0 30 n 2 # 巴特沃斯阶数 # 理想高通 H_ihpf np.where(D D0, 0, 1) # 巴特沃斯高通修正除零问题 H_bhpf 1 / (1 (D0 / D) ** (2 * n)) # 高斯高通 H_ghpf 1 - np.exp(-(D ** 2) / (2 * D0 ** 2)) # 高频强调滤波加入直流分量提升亮度 H_hfe 0.5 0.7 * H_ghpf # 5. 同态滤波增强对比度 gamma_h 2.0 # 高频增益增强细节 gamma_l 0.5 # 低频增益抑制背景 c 1 D1 30 H_homomorphic (gamma_h - gamma_l) * (1 - np.exp(-c * (D ** 2) / (D1 ** 2))) gamma_l # 6. 滤波计算统一优化取实部归一化避免虚部误差 # 理想高通 g_ihpf np.fft.ifftshift(dft_shift * H_ihpf) g_ihpf np.fft.ifft2(g_ihpf) g_ihpf np.real(g_ihpf) # 优先取实部避免虚部残留 g_ihpf np.clip(g_ihpf, 0, 255).astype(np.uint8) # 巴特沃斯高通 g_bhpf np.fft.ifftshift(dft_shift * H_bhpf) g_bhpf np.fft.ifft2(g_bhpf) g_bhpf np.real(g_bhpf) g_bhpf np.clip(g_bhpf, 0, 255).astype(np.uint8) # 高频强调 g_hfe np.fft.ifftshift(dft_shift * H_hfe) g_hfe np.fft.ifft2(g_hfe) g_hfe np.real(g_hfe) g_hfe np.clip(g_hfe, 0, 255).astype(np.uint8) # 同态滤波优化数值稳定性 img_log np.log1p(img.astype(np.float32)) # log(1x)避免0值 dft_log np.fft.fft2(img_log) dft_log_shift np.fft.fftshift(dft_log) g_log_shift dft_log_shift * H_homomorphic g_log np.fft.ifftshift(g_log_shift) g_log np.fft.ifft2(g_log) g_homomorphic np.expm1(np.real(g_log)) # exp(x)-1还原 g_homomorphic np.clip(g_homomorphic, 0, 255).astype(np.uint8) # 7. 可视化补充第6个子图避免布局警告 plt.figure(figsize(15, 10)) plt.subplot(2, 3, 1) plt.imshow(img, cmapgray) plt.title(原始图像低对比度) plt.axis(off) plt.subplot(2, 3, 2) plt.imshow(g_ihpf, cmapgray) plt.title(理想高通滤波振铃过暗) plt.axis(off) plt.subplot(2, 3, 3) plt.imshow(g_bhpf, cmapgray) plt.title(巴特沃斯高通滤波) plt.axis(off) plt.subplot(2, 3, 4) plt.imshow(g_hfe, cmapgray) plt.title(高频强调滤波亮度提升) plt.axis(off) plt.subplot(2, 3, 5) plt.imshow(g_homomorphic, cmapgray) plt.title(同态滤波对比度增强) plt.axis(off) # 补充第6个子图显示滤波器示意图提升实用性 plt.subplot(2, 3, 6) plt.imshow(H_hfe, cmapgray) plt.title(高频强调滤波器) plt.axis(off) plt.tight_layout() plt.show()效果对比理想高通边缘增强但有振铃图像整体过暗巴特沃斯高通边缘增强振铃减轻高频强调在增强边缘的同时提升整体亮度同态滤波同时增强对比度和细节效果最优。4.10 选择性滤波4.10.1 带阻滤波器与带通滤波器带阻滤波器抑制某一频段的分量如去除特定频率的噪声带通滤波器保留某一频段的分量如提取特定频率的纹理。4.10.2 陷波滤波器代码示例陷波滤波器去除周期性噪声import numpy as np import cv2 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 1. 读取/生成图像 img cv2.imread(../picture/GaoDa.png, cv2.IMREAD_GRAYSCALE) if img is None: # 备用测试图像确保维度是行×列 img np.ones((256, 256), dtypenp.uint8) * 128 img[80:180, 80:180] 255 # 核心明确图像的行(M)和列(N) M, N img.shape # M高度(行), N宽度(列) print(f✅ 图像形状行×列{img.shape}) # 2. 生成与图像完全匹配的网格行×列 M×N # 正确逻辑先列(N)、后行(M)indexingxy → 最终网格形状M×N x np.arange(N) # 列坐标0~N-1 y np.arange(M) # 行坐标0~M-1 x_grid, y_grid np.meshgrid(x, y, indexingxy) # 结果x_grid(M×N), y_grid(M×N) print(f✅ 网格形状行×列x_grid{x_grid.shape}, y_grid{y_grid.shape}) # 3. 添加周期性噪声维度100%匹配 freq 8 # 噪声频率越大条纹越密 noise_amp 30 # 噪声幅值越大条纹越明显 # 生成与图像同维度的噪声 noise noise_amp * ( np.sin(2 * np.pi * freq * x_grid / N) # 水平条纹沿列方向 np.sin(2 * np.pi * freq * y_grid / M) # 垂直条纹沿行方向 ) print(f✅ 噪声形状行×列{noise.shape}) # 叠加噪声并归一化 img_noisy np.clip(img noise, 0, 255).astype(np.uint8) # 4. 计算DFT并中心化 dft np.fft.fft2(img_noisy.astype(np.float32)) dft_shift np.fft.fftshift(dft) # 幅值谱避免log(0) magnitude 20 * np.log(np.abs(dft_shift) 1e-8) # 5. 设计陷波滤波器精准抑制噪声频率 # 频域中心 cy, cx M // 2, N // 2 # 噪声频率对应的频域偏移根据实际效果调整 offset freq # 陷波中心4个方向的噪声频率点 notch_centers [ (cy, cx offset), (cy, cx - offset), (cy offset, cx), (cy - offset, cx) ] print(f✅ 陷波中心坐标{notch_centers}) # 巴特沃斯陷波滤波器参数 D0 15 # 陷波半径大图像适当增大 n 4 # 阶数 eps 1e-8 # 防除零 # 初始化全通滤波器 H_notch np.ones((M, N), dtypenp.float32) for (yc, xc) in notch_centers: # 计算每个点到陷波中心的距离 D np.sqrt((y_grid - yc)**2 (x_grid - xc)**2) eps # 陷波阻带抑制该中心周围的频率 H_notch * 1 / (1 (D0 / D)**(2*n)) # 6. 频域滤波 逆变换 g_shift dft_shift * H_notch g np.fft.ifftshift(g_shift) g np.fft.ifft2(g) # 取实部并归一化避免虚部残留 g_filtered np.clip(np.real(g), 0, 255).astype(np.uint8) # 7. 可视化清晰对比 plt.figure(figsize(18, 10)) # 原始图像 plt.subplot(2, 3, 1) plt.imshow(img, cmapgray) plt.title(1. 原始无噪声图像, fontsize12) plt.axis(off) # 含噪声图像 plt.subplot(2, 3, 2) plt.imshow(img_noisy, cmapgray) plt.title(2. 含周期性条纹噪声的图像, fontsize12) plt.axis(off) # DFT幅值谱 plt.subplot(2, 3, 3) plt.imshow(magnitude, cmapgray) plt.title(3. 噪声图像DFT幅值谱\n亮点噪声频率, fontsize12) plt.axis(off) # 陷波滤波器 plt.subplot(2, 3, 4) plt.imshow(H_notch, cmapgray) plt.title(4. 陷波滤波器\n黑色噪声抑制区, fontsize12) plt.axis(off) # 滤波后图像 plt.subplot(2, 3, 5) plt.imshow(g_filtered, cmapgray) plt.title(5. 陷波滤波后图像\n噪声已去除, fontsize12) plt.axis(off) # 噪声残留 plt.subplot(2, 3, 6) residual np.abs(img_noisy - g_filtered).astype(np.uint8) plt.imshow(residual, cmapgray) plt.title(6. 噪声残留越黑残留越少, fontsize12) plt.axis(off) plt.tight_layout() plt.show()4.11 实现方法4.11.1 二维离散傅里叶变换的可分离性4.11.2 利用离散傅里叶变换算法计算逆变换4.11.3 快速傅里叶变换FFT4.11.4 滤波器设计相关说明滤波器需中心对齐与 DFT 移位匹配截止频率需根据图像尺寸归一化补零扩展可减少滤波后的边缘效应实值图像滤波后需取实部避免虚部误差。小结核心知识点总结频域滤波核心将图像从空间域转换到频率域通过修改频率分量实现增强 / 去噪再逆变换回空间域滤波器分类低通滤波平滑理想低通振铃、巴特沃斯低通适中、高斯低通无振铃高通滤波锐化理想高通、巴特沃斯高通、高斯高通高频强调滤波可提升亮度选择性滤波陷波滤波器可去除周期性噪声关键实现技巧用np.fft.fft2/np.fft.ifft2实现 DFT/IDFTnp.fft.fftshift将低频移到中心便于滤波器设计滤波后需取实部并归一化到 0-255。实践建议所有代码可直接运行只需替换lena.jpg为自己的图像路径调整截止频率D0、阶数n等参数观察滤波效果变化频域滤波的核心是理解 “低频对应整体、高频对应细节”根据需求选择合适的滤波器。