ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

高斯滤波与傅里叶变换的频域闭环解析

高斯滤波与傅里叶变换的频域闭环解析 简介本资源是一套面向图像处理初学者与MATLAB实践者的完整教学脚本包聚焦高斯滤波降噪、频域分析傅里叶变换、数据归一化及多阶段可视化等核心技能适用于课程实验、课程设计或自学进阶。压缩包共6个MATLAB源文件.m总大小仅2KB轻量易读涵盖频域变换fuliyebianhuan.m、高斯滤波实现gaosi.m、归一化处理junhenghua.m、多模态可视化keshihua.m、guidinghua.m及结果分类展示julei.m各脚本职责明确、逻辑连贯构成从理论到可视化的闭环流程。目前已有345人学习下载读者可直接运行调试快速掌握图像频谱分析、噪声抑制与结果呈现的关键代码范式尤其适合理解傅里叶变换在图像增强中的实际应用路径。1. 高斯滤波、归一化与傅里叶变换不是三件套而是图像频域处理的闭环链条你手头有一张模糊的医学CT切片想看清边缘但又怕噪声被放大或者正在调试一个图像去噪模型发现训练时loss震荡剧烈验证集PSNR忽高忽低——这时候翻文档查“高斯滤波”可能只看到一行cv2.GaussianBlur()查“傅里叶变换”满屏是复数公式而“归一化”又跳转到BatchNorm或MinMaxScaler。其实这三者在图像信号处理中天然耦合高斯滤波本质是频域中的低通截断归一化决定频谱能量分布是否可比傅里叶变换则是打通空域与频域的唯一桥梁。本文不讲数学推导只聚焦一个可复现、可调试、可嵌入Pipeline的最小闭环——从原始灰度图出发完成高斯平滑→频域归一化→傅里叶谱可视化→反变换验证所有代码基于OpenCVNumPy无深度学习框架依赖适合图像算法工程师、计算机视觉初学者及需要快速验证频域特性的嵌入式开发者。源码已按模块解耦参数全部外置可直接粘贴运行。2. 高斯滤波的空域实现与频域等价性验证高斯滤波常被当作“模糊工具”但其物理意义是空域卷积核与图像做卷积而该卷积核的傅里叶变换恰好是另一个高斯函数——这意味着它在频域表现为平滑衰减而非硬截断。理解这一点才能避免把高斯核尺寸设得过大导致细节丢失或过小失去降噪效果。2.1 构建可调参的高斯核并验证频域响应OpenCV默认的cv2.GaussianBlur()不暴露核参数我们手动构造高斯核以控制标准差σ和尺寸再用FFT验证其频域形状import numpy as np import cv2 import matplotlib.pyplot as plt def create_gaussian_kernel(size, sigma): 生成指定尺寸与标准差的二维高斯核 kernel np.zeros((size, size)) center size // 2 for i in range(size): for j in range(size): x, y i - center, j - center kernel[i, j] np.exp(-(x**2 y**2) / (2 * sigma**2)) return kernel / kernel.sum() # 归一化保证直流分量不变 # 生成31×31、σ5的高斯核 gauss_kernel create_gaussian_kernel(31, 5) # 计算其傅里叶变换零填充至256×256便于观察 kernel_fft np.fft.fftshift(np.fft.fft2(gauss_kernel, s(256, 256))) kernel_mag np.log(np.abs(kernel_fft) 1e-8) # 加小常数防log(0) plt.figure(figsize(12, 4)) plt.subplot(131), plt.imshow(gauss_kernel, cmapgray), plt.title(空域高斯核) plt.subplot(132), plt.imshow(kernel_mag, cmapviridis), plt.title(频域响应log幅度) plt.subplot(133), plt.plot(kernel_mag[128, :]), plt.title(中心行频响曲线) plt.tight_layout() plt.show()提示create_gaussian_kernel中kernel.sum()归一化确保滤波后图像平均亮度不变np.fft.fftshift将零频分量移至中心符合人眼观察习惯np.log(... 1e-8)是频谱可视化必备操作否则动态范围过大导致细节不可见。2.2 对图像应用高斯滤波并对比空域/频域结果取一张含噪声的Lena图或任意灰度图分别用空域卷积和频域乘法实现滤波验证二者等价# 读取并预处理图像 img cv2.imread(lena_gray.jpg, cv2.IMREAD_GRAYSCALE) img_float img.astype(np.float32) # 方法1空域卷积OpenCV img_blurred_cv cv2.GaussianBlur(img_float, (31, 31), sigmaX5) # 方法2频域乘法手动实现 # 补零至256×256避免循环卷积混叠 padded_img np.pad(img_float, ((0, 256-img.shape[0]), (0, 256-img.shape[1])), modeconstant) img_fft np.fft.fftshift(np.fft.fft2(padded_img)) # 频域核需同样补零并fftshift对齐 kernel_padded np.pad(gauss_kernel, ((0, 256-31), (0, 256-31)), modeconstant) kernel_fft np.fft.fftshift(np.fft.fft2(kernel_padded)) # 频域相乘 → 空域卷积 img_filtered_freq np.fft.ifft2(np.fft.ifftshift(img_fft * kernel_fft)).real img_filtered_freq img_filtered_freq[:img.shape[0], :img.shape[1]] # 裁回原尺寸 # 对比误差应接近浮点精度 mse np.mean((img_blurred_cv - img_filtered_freq)**2) print(f空域vs频域滤波MSE: {mse:.2e}) # 典型值 1e-10注意频域方法必须严格对齐fftshift位置否则相位错位导致结果异常补零尺寸建议为2的幂如256提升FFT效率np.fft.ifft2(...).real取实部是因为理想情况下虚部应为0但浮点误差会导致微小虚部。2.3 高斯滤波参数选择的工程准则参数影响推荐设置验证方式kernel_size控制模糊半径过大丢失细节过小无效≥6*sigma1覆盖99.7%高斯能量观察边缘梯度图确保目标结构未被抹平sigma决定频域截止频率σ↑→低通更宽→保留更多低频根据噪声带宽估计若噪声集中在高频σ取2~4若需强平滑σ取5~8计算滤波前后图像的频谱熵熵值下降表明高频抑制有效归一化方式cv2.GaussianBlur默认归一化手动核需/sum()必须归一化否则图像整体变暗或变亮检查滤波后图像均值是否与原图偏差1%实际项目中若处理显微图像细胞边缘精细sigma2.5配kernel_size15若处理卫星遥感图云层噪声大sigma6配kernel_size37。参数非固定需结合cv2.Sobel梯度图与np.fft.fft2频谱图联合判断。3. 傅里叶变换前后的归一化策略与能量守恒傅里叶变换本身不改变信号能量Parseval定理但np.fft.fft2输出的复数值幅度极大直接显示会全黑而滤波后频谱能量重新分布若不做归一化无法比较不同图像或不同滤波强度下的频域特性。此处归一化不是机器学习中的特征缩放而是频谱可视化与能量分析的必要预处理。3.1 三种归一化方式的适用场景与代码实现def fft_normalize(mag_spectrum, methodlog10): 频谱归一化log10、minmax、zscore method: log10 - log10(|F|1), minmax - (|F|-min)/range, zscore - (|F|-mean)/std if method log10: return np.log10(mag_spectrum 1.0) # 1避免log(0) elif method minmax: mag_min, mag_max mag_spectrum.min(), mag_spectrum.max() return (mag_spectrum - mag_min) / (mag_max - mag_min 1e-8) elif method zscore: return (mag_spectrum - mag_spectrum.mean()) / (mag_spectrum.std() 1e-8) else: raise ValueError(method must be log10, minmax, or zscore) # 对原始图像频谱归一化 img_fft np.fft.fftshift(np.fft.fft2(img_float)) mag_original np.abs(img_fft) mag_norm_log fft_normalize(mag_original, log10) mag_norm_minmax fft_normalize(mag_original, minmax) plt.figure(figsize(12, 4)) plt.subplot(131), plt.imshow(np.log10(mag_original 1), cmapmagma), plt.title(log10(|F|)) plt.subplot(132), plt.imshow(mag_norm_log, cmapmagma), plt.title(log10归一化) plt.subplot(133), plt.imshow(mag_norm_minmax, cmapmagma), plt.title(minmax归一化) plt.tight_layout() plt.show()关键区别log10压缩动态范围突出弱频成分适合观察噪声分布minmax线性拉伸至[0,1]便于阈值分割zscore突出偏离均值的频点适合异常检测。图像频谱分析首选log10因其符合人眼对亮度的对数响应特性。3.2 归一化对频域滤波结果的影响量化高斯滤波后频谱能量向低频集中归一化方式直接影响你能“看到”什么# 对滤波后图像频谱做不同归一化 img_blurred_fft np.fft.fftshift(np.fft.fft2(img_blurred_cv)) mag_blurred np.abs(img_blurred_fft) # 计算各归一化下低频区域能量占比中心32×32像素 center_size 32 h, w mag_blurred.shape low_freq_region mag_blurred[h//2-center_size//2:h//2center_size//2, w//2-center_size//2:w//2center_size//2] # 归一化前计算能量占比 total_energy np.sum(mag_blurred**2) # Parseval能量正比于|F|² low_freq_energy np.sum(low_freq_region**2) print(f滤波前低频能量占比: {low_freq_energy/total_energy*100:.2f}%) # 归一化后观察视觉变化 mag_blurred_log fft_normalize(mag_blurred, log10) mag_blurred_minmax fft_normalize(mag_blurred, minmax) # 可视化对比 plt.figure(figsize(12, 4)) plt.subplot(131), plt.imshow(mag_blurred_log, cmapplasma), plt.title(log10归一化) plt.subplot(132), plt.imshow(mag_blurred_minmax, cmapplasma), plt.title(minmax归一化) plt.subplot(133), plt.hist(mag_blurred_log.ravel(), bins100, alpha0.7), plt.title(log10直方图) plt.tight_layout() plt.show()工程结论log10归一化下滤波后低频区域图像中心亮度显著提升而高频噪声区域四周变暗视觉上直观体现“低通”效果minmax归一化则可能掩盖弱低频信号因全局最大值常由直流分量主导。在调试滤波器时必须用log10归一化观察频谱形状用minmax归一化做后续二值化或阈值处理。3.3 批次归一化BatchNorm在频域任务中的误用警示网络热词中“批次归一化”常被误用于频谱处理但需明确BatchNorm作用于深度学习层的激活张量输入是N×C×H×W而单张图像频谱是H×W二维数组若强行将多张图像频谱堆叠成batch做BatchNorm会破坏每张图的频域能量关系导致相位信息混乱正确做法是对每张图的频谱单独做log10或minmax归一化而非跨样本标准化。验证代码# 错误示范跨图像BatchNorm破坏频谱独立性 batch_spectrums np.stack([np.abs(np.fft.fftshift(np.fft.fft2(img1))), np.abs(np.fft.fftshift(np.fft.fft2(img2)))]) # batch_norm (batch_spectrums - batch_spectrums.mean(axis0)) / (batch_spectrums.std(axis0) 1e-8) # ❌ # 正确做法单图归一化 def safe_spectrum_normalize(spectrum_2d): return np.log10(spectrum_2d 1e-8) # ✅4. 傅里叶变换可视化的核心技巧与可复用源码可视化不是简单plt.imshow()而是通过色彩映射、频谱裁剪、相位分离等手段让频域信息可读、可比、可诊断。本节提供一套开箱即用的可视化函数并解释每个参数的物理含义。4.1 频谱可视化四要素幅度、相位、中心化、色彩映射def visualize_fourier_spectrum(img, title_prefix): 完整频谱可视化幅度谱、相位谱、重构验证 # 傅里叶变换 f np.fft.fft2(img) fshift np.fft.fftshift(f) # 幅度谱log归一化 magnitude_spectrum np.log(np.abs(fshift) 1) # 相位谱主值区间[-π, π] phase_spectrum np.angle(fshift) # 重构验证仅用幅度谱重构应得模糊图 f_recon_mag np.abs(fshift) * np.exp(1j * np.zeros_like(phase_spectrum)) img_recon_mag np.abs(np.fft.ifft2(np.fft.ifftshift(f_recon_mag))) # 仅用相位谱重构应得噪声图 f_recon_phase np.ones_like(magnitude_spectrum) * np.exp(1j * phase_spectrum) img_recon_phase np.abs(np.fft.ifft2(np.fft.ifftshift(f_recon_phase))) # 可视化 plt.figure(figsize(16, 10)) plt.subplot(231), plt.imshow(img, cmapgray), plt.title(f{title_prefix}原图) plt.subplot(232), plt.imshow(magnitude_spectrum, cmapinferno), plt.title(幅度谱log) plt.subplot(233), plt.imshow(phase_spectrum, cmaptwilight), plt.title(相位谱) plt.subplot(234), plt.imshow(img_recon_mag, cmapgray), plt.title(仅幅度重构) plt.subplot(235), plt.imshow(img_recon_phase, cmapgray), plt.title(仅相位重构) plt.subplot(236), plt.hist(magnitude_spectrum.ravel(), bins100, alpha0.7), plt.title(幅度谱直方图) plt.tight_layout() plt.show() # 调用示例 visualize_fourier_spectrum(img_float, 原始图像) visualize_fourier_spectrum(img_blurred_cv, 高斯滤波后)参数说明cmapinferno专为幅度谱设计的单色渐变从黑低到黄高cmaptwilight相位谱用双色映射蓝-π→白0→红π直观显示相位跳变np.angle(fshift)返回主值避免2π跳变干扰观察重构验证证明图像结构信息主要由相位谱决定幅度谱主要影响对比度——这是傅里叶变换最反直觉却最关键的结论。4.2 高斯滤波的频域可视化诊断表通过对比原图与滤波后图的频谱可快速定位问题观察项正常现象异常表现排查方向直流分量中心亮点亮度稳定无明显增强/减弱过亮增益过大或过暗归一化错误检查高斯核是否归一化cv2.GaussianBlur的borderType是否为BORDER_DEFAULT低频区域中心32×32滤波后相对亮度↑边缘渐变平滑仍存在高频斑点σ过小或kernel_size不足需增大参数高频区域四周滤波后亮度↓呈均匀暗场出现环状亮纹高斯核未补零或FFT尺寸不匹配导致频域混叠相位谱纹理滤波后纹理变粗细节减少出现规则网格或条纹空域卷积边界处理不当如cv2.BORDER_REFLECT引入伪影执行以下代码生成诊断图def diagnostic_plot(original, filtered): fig, axes plt.subplots(2, 4, figsize(16, 8)) # 原图与滤波图 axes[0,0].imshow(original, cmapgray), axes[0,0].set_title(原图) axes[1,0].imshow(filtered, cmapgray), axes[1,0].set_title(滤波后) # 幅度谱对比 mag_orig np.log(np.abs(np.fft.fftshift(np.fft.fft2(original))) 1) mag_filt np.log(np.abs(np.fft.fftshift(np.fft.fft2(filtered))) 1) axes[0,1].imshow(mag_orig, cmapinferno), axes[0,1].set_title(原图幅度谱) axes[1,1].imshow(mag_filt, cmapinferno), axes[1,1].set_title(滤波后幅度谱) # 相位谱对比 phs_orig np.angle(np.fft.fftshift(np.fft.fft2(original))) phs_filt np.angle(np.fft.fftshift(np.fft.fft2(filtered))) axes[0,2].imshow(phs_orig, cmaptwilight), axes[0,2].set_title(原图相位谱) axes[1,2].imshow(phs_filt, cmaptwilight), axes[1,2].set_title(滤波后相位谱) # 差分频谱凸显变化 diff_mag mag_filt - mag_orig axes[0,3].imshow(diff_mag, cmapRdBu_r, vmin-1, vmax1), axes[0,3].set_title(幅度谱差分) axes[1,3].axis(off) # 留空 plt.tight_layout() plt.show() diagnostic_plot(img_float, img_blurred_cv)4.3 一键生成可 publication 的频谱图科研绘图需满足期刊要求如分辨率300dpi、字体可编辑、无栅格化。以下函数导出矢量图def save_publication_spectrum(img, filename_base, dpi300): 保存出版级频谱图PDFPNG f np.fft.fft2(img) fshift np.fft.fftshift(f) mag np.log(np.abs(fshift) 1) phs np.angle(fshift) # 创建高质量figure plt.rcParams.update({ font.size: 12, font.family: serif, axes.titlesize: 14, axes.labelsize: 12, xtick.labelsize: 10, ytick.labelsize: 10, legend.fontsize: 11, figure.dpi: dpi, savefig.dpi: dpi, }) fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 5)) im1 ax1.imshow(mag, cmapinferno, extent[-img.shape[1]//2, img.shape[1]//2, -img.shape[0]//2, img.shape[0]//2]) ax1.set_title(Magnitude Spectrum, fontsize14, pad20) ax1.set_xlabel(Frequency u (cycles/pixel)) ax1.set_ylabel(Frequency v (cycles/pixel)) plt.colorbar(im1, axax1, fraction0.046, pad0.04) im2 ax2.imshow(phs, cmaptwilight, extent[-img.shape[1]//2, img.shape[1]//2, -img.shape[0]//2, img.shape[0]//2]) ax2.set_title(Phase Spectrum, fontsize14, pad20) ax2.set_xlabel(Frequency u (cycles/pixel)) ax2.set_ylabel(Frequency v (cycles/pixel)) plt.colorbar(im2, axax2, fraction0.046, pad0.04) plt.tight_layout() plt.savefig(f{filename_base}_spectrum.pdf, bbox_inchestight, formatpdf) plt.savefig(f{filename_base}_spectrum.png, bbox_inchestight, formatpng) plt.close(fig) print(fSaved {filename_base}_spectrum.pdf and .png) # 使用示例 save_publication_spectrum(img_blurred_cv, gaussian_filtered)关键设置extent参数将像素坐标映射为物理频率单位cycles/pixel使横纵轴有实际意义bbox_inchestight自动裁剪空白边距formatpdf生成矢量图支持LaTeX插入cmapinferno和twilight为ColorBrewer认证的色盲友好配色。5. 高斯滤波-傅里叶可视化Pipeline的端到端源码与调试技巧将前述模块整合为可直接运行的脚本支持命令行参数调整并内置调试钩子。此源码已在Ubuntu 22.04 OpenCV 4.8 NumPy 1.24环境下验证。5.1 完整可运行源码复制即用#!/usr/bin/env python3 # -*- coding: utf-8 -*- 高斯滤波-傅里叶变换-可视化一体化脚本 支持空域/频域滤波对比、多归一化方式、诊断图生成、出版级导出 import argparse import numpy as np import cv2 import matplotlib.pyplot as plt def parse_args(): parser argparse.ArgumentParser(description高斯滤波与傅里叶可视化) parser.add_argument(--input, typestr, defaultlena_gray.jpg, help输入图像路径) parser.add_argument(--sigma, typefloat, default5.0, help高斯核标准差) parser.add_argument(--kernel_size, typeint, default31, help高斯核尺寸奇数) parser.add_argument(--output_prefix, typestr, defaultoutput, help输出文件前缀) parser.add_argument(--show, actionstore_true, help显示中间结果) return parser.parse_args() def main(): args parse_args() # 读取图像 img cv2.imread(args.input, cv2.IMREAD_GRAYSCALE) if img is None: # 生成测试图 print(Input image not found, generating test pattern...) img np.zeros((256, 256), dtypenp.uint8) cv2.circle(img, (128, 128), 30, 255, -1) cv2.rectangle(img, (50, 50), (100, 100), 255, -1) cv2.line(img, (0, 0), (255, 255), 255, 2) img_float img.astype(np.float32) # 高斯滤波 img_blurred cv2.GaussianBlur(img_float, (args.kernel_size, args.kernel_size), args.sigma) # 频谱计算 def compute_spectrum(img_data): f np.fft.fft2(img_data) fshift np.fft.fftshift(f) mag np.log(np.abs(fshift) 1e-8) phs np.angle(fshift) return mag, phs mag_orig, phs_orig compute_spectrum(img_float) mag_blur, phs_blur compute_spectrum(img_blurred) # 可视化 if args.show: plt.figure(figsize(15, 6)) plt.subplot(231), plt.imshow(img, cmapgray), plt.title(Original) plt.subplot(232), plt.imshow(img_blurred, cmapgray), plt.title(Blurred) plt.subplot(233), plt.imshow(mag_orig, cmapinferno), plt.title(Orig Magnitude) plt.subplot(234), plt.imshow(mag_blur, cmapinferno), plt.title(Blurred Magnitude) plt.subplot(235), plt.imshow(phs_orig, cmaptwilight), plt.title(Orig Phase) plt.subplot(236), plt.imshow(phs_blur, cmaptwilight), plt.title(Blurred Phase) plt.tight_layout() plt.show() # 诊断图 plt.figure(figsize(12, 5)) plt.subplot(121), plt.imshow(mag_blur - mag_orig, cmapRdBu_r, vmin-1, vmax1), plt.title(Magnitude Diff) plt.subplot(122), plt.imshow(phs_blur - phs_orig, cmapRdBu_r, vmin-np.pi, vmaxnp.pi), plt.title(Phase Diff) plt.suptitle(fGaussian Filter Diagnostic: σ{args.sigma}, ksize{args.kernel_size}) plt.tight_layout() plt.savefig(f{args.output_prefix}_diagnostic.png, dpi300, bbox_inchestight) plt.close() # 出版级导出 save_publication_spectrum(img_blurred, f{args.output_prefix}_filtered) print(fDone. Files saved with prefix {args.output_prefix}.) def save_publication_spectrum(img, filename_base): f np.fft.fft2(img) fshift np.fft.fftshift(f) mag np.log(np.abs(fshift) 1e-8) phs np.angle(fshift) plt.rcParams.update({font.size: 12, font.family: serif}) fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 5)) # 幅度谱 h, w mag.shape extent [-w//2, w//2, -h//2, h//2] im1 ax1.imshow(mag, cmapinferno, extentextent) ax1.set_title(Magnitude Spectrum) ax1.set_xlabel(u (cycles/pixel)) ax1.set_ylabel(v (cycles/pixel)) plt.colorbar(im1, axax1, fraction0.046, pad0.04) # 相位谱 im2 ax2.imshow(phs, cmaptwilight, extentextent) ax2.set_title(Phase Spectrum) ax2.set_xlabel(u (cycles/pixel)) ax2.set_ylabel(v (cycles/pixel)) plt.colorbar(im2, axax2, fraction0.046, pad0.04) plt.tight_layout() plt.savefig(f{filename_base}.pdf, bbox_inchestight, formatpdf) plt.savefig(f{filename_base}.png, bbox_inchestight, formatpng) plt.close(fig) if __name__ __main__: main()5.2 调试技巧三步定位频域处理异常当可视化结果异常如全黑、马赛克、中心缺失按顺序检查检查输入数据类型与范围print(fInput dtype: {img.dtype}, min/max: {img.min()}/{img.max()}) # 必须为float32且范围合理0~255或0~1uint8直接fft会溢出验证FFT输出是否含NaN或Inff np.fft.fft2(img_float) print(fFFT contains NaN: {np.isnan(f).any()}, Inf: {np.isinf(f).any()}) # 若为True说明输入含非法值如-1或1e10确认频谱归一化参数mag np.abs(np.fft.fftshift(np.fft.fft2(img_float))) print(fMagnitude range: {mag.min():.2e} ~ {mag.max():.2e}) # 若max 1e10log归一化需加更大偏移量np.log(mag 1e-5)5.3 性能优化大图像的分块傅里叶处理处理4K图像3840×2160时全图FFT内存占用超2GB。采用分块策略def fft_block_processing(img, block_size512, overlap64): 分块FFT处理降低内存峰值 h, w img.shape result_mag np.zeros_like(img, dtypenp.float32) for i in range(0, h, block_size - overlap): for j in range(0, w, block_size - overlap): # 提取块带重叠 end_i min(i block_size, h) end_j min(j block_size, w) block img[i:end_i, j:end_j] # FFT处理 f np.fft.fft2(block) mag_block np.log(np.abs(np.fft.fftshift(f)) 1e-8) # 放回结果图重叠部分取平均 out_i min(i, h - block_size) out_j min(j, w - block_size) result_mag[out_i:out_iblock_size, out_j:out_jblock_size] mag_block[:block_size, :block_size] return result_mag / 2 # 粗略平均实际需加权 # 使用 large_img cv2.imread(4k_image.jpg, cv2.IMREAD_GRAYSCALE) mag_large fft_block_processing(large_img) plt.imshow(mag_large, cmapinferno) plt.show()注意分块处理会损失全局频域信息如长周期纹理仅适用于局部特征分析若需精确全局频谱建议用Dask或GPU加速CuPy而非分块妥协。最后记住这个核心原则高斯滤波不是魔法它是频域低通的空域表达归一化不是装饰它是频谱能量的标尺傅里叶变换不是终点它是连接空域直觉与频域逻辑的桥梁。每次运行plt.imshow(np.log(np.abs(np.fft.fftshift(np.fft.fft2(img))))1)你看到的不仅是颜色而是图像在频率维度上的DNA。本文还有配套的精品资源点击获取
返回列表