资讯动态

二维Morlet小波图像去噪:时频局部化降噪原理与工程实现

发布时间:2026/10/8 19:05:59 来源:尧图企业网站定制
简介本资源是一套面向信号处理与图像分析初学者及进阶学习者的Morlet小波实验实践包聚焦二维Morlet小波在图像多尺度分解与信号去噪中的核心应用。内容涵盖理论原理、MATLAB代码实现、可视化结果与实测数据适用于数字图像处理、遥感/医学影像预处理、课程设计及科研入门场景。压缩包共9个文件2.81MB含4个MATLAB源码如b.m、imageScaleT.m等实现三级小波分解与去噪流程、2张原始/处理后JPG图像、1张PNG效果图、1个MAT文件7.31.mat存储实验数据及1个FIG图形文件完整呈现从一维信号到二维图像的Morlet小波变换全流程。已有557人学习下载用户可直接运行代码复现实验获取带注释的去噪脚本、多尺度系数可视化方法、阈值选取参考及Morlet图像生成逻辑快速掌握小波去噪的关键参数调优与结果评估技巧。1. Morlet小波为什么是二维图像去噪的“隐形主力”它不靠卷积核大小赢而靠时频局部化赢你有没有试过用高斯滤波或中值滤波处理一张带纹理的医学CT切片结果边缘糊成一片、细小血管直接消失或者在遥感图像里想压制条带噪声又怕把农田边界也抹平这时候翻开源码看别人怎么做的十有八九会撞见morlet——不是作为某个深度学习模块的装饰而是真正在底层扛起时频分析大旗的实战组合。Morlet小波不是“更高级的滤波器”它是把图像当成二维非平稳信号来解构既关心某块区域“能量强不强”幅值也死磕“这股能量集中在哪个尺度、哪个方向”频率相位。标题里反复出现的“二维_Morlet图像_信号去噪”说的就是这件事用复数Morlet小波在图像平面做连续小波变换CWT把噪声和结构分别钉在不同尺度-方向通道里再做阈值裁剪——这不是图像处理是信号处理思维在像素阵列上的落地。适合谁不是只调cv2.bilateralFilter参数的初学者而是手上有低剂量CT、红外热成像、显微电镜图、SAR遥感图等信噪比吃紧、结构细节敏感的一线算法工程师也适合正被“传统滤波保边难、深度学习缺标注、小波包分解维度爆炸”三重卡脖子的团队。它不承诺端到端PSNR暴涨5dB但能给你可解释、可调控、不依赖大数据集的确定性降噪路径。2. 从一维Morlet到二维Morlet为什么不能直接把1D公式套进图像2.1 一维Morlet小波的“血统”与局限复指数高斯窗的物理直觉Morlet小波本质是一个复指数载波被高斯窗调制的结果。标准一维形式为$$ \psi(t) \pi^{-1/4} e^{i \omega_0 t} e^{-t^2 / 2} $$其中 $\omega_0$ 是中心角频率通常取5~6以保证时频分辨率平衡$\pi^{-1/4}$ 是归一化系数。关键点在于它是个复函数输出包含实部cosine-like和虚部sine-like合起来能同时捕获信号的幅度和相位信息。这对一维信号去噪极有用——比如心电图R波检测相位突变比幅值变化更鲁棒。但直接把它当卷积核在图像上滑动会出大问题。原因有三各向同性陷阱1D Morlet沿时间轴延展但图像有x/y两个空间维度。若简单用 $ \psi(x) \cdot \psi(y) $ 做可分离乘积得到的是圆对称小波无法区分水平边缘、垂直纹理、45°裂缝——而真实图像结构高度方向敏感尺度耦合失效1D中缩放参数 $a$ 控制单一尺度但在2D中仅缩放x/y相同倍数各向同性缩放会丢失“长条状噪声”如CT扫描线的定向抑制能力相位信息冗余图像灰度是实值场1D Morlet的复输出在2D中会产生四组冗余分量实/虚 × x/y徒增计算且无物理意义。提示别被“二维小波”字面迷惑——真正有效的2D Morlet不是1D的简单外积而是构造方向选择性的复数基函数。这是所有后续操作的起点。2.2 二维Morlet小波的工程化定义方向尺度偏移三要素工业界和论文中广泛采用的2D Morlet定义如Torrence Compo, 1998是$$ \psi_{a,\theta}(x,y) \frac{1}{a^2} \pi^{-1/2} e^{i \omega_0 \left( \frac{x \cos\theta y \sin\theta}{a} \right)} e^{-\left[ \left( \frac{x \cos\theta y \sin\theta}{a} \right)^2 \left( \frac{-x \sin\theta y \cos\theta}{a} \right)^2 \right] / 2} $$这个式子看着吓人拆解后就是三个可控旋钮尺度参数 $a$控制小波在主方向$\theta$上的伸展长度。$a$ 越大感受野越宽对应低频粗结构$a$ 越小聚焦越细对应高频噪声/边缘。实践中 $a$ 取 2^k 形式k0,1,2,...形成对数尺度序列方向参数 $\theta$决定小波的“朝向”。$\theta0^\circ$ 捕捉水平结构$\theta90^\circ$ 捕捉垂直结构$\theta45^\circ$ 捕捉斜向纹理。典型设置为 $\theta \in {0^\circ, 45^\circ, 90^\circ, 135^\circ}$共4个方向旋转坐标系式中 $x \cos\theta y \sin\theta$ 是沿 $\theta$ 方向的投影主轴$-x \sin\theta y \cos\theta$ 是垂直方向副轴。高斯窗在主轴方向按 $a$ 缩放在副轴方向也按 $a$ 缩放——这是各向同性缩放若要各向异性如拉长副轴以增强线状特征需额外引入副轴缩放因子 $b$$b \neq a$但会显著增加参数调优成本Morlet图像去噪中95%场景用各向同性已足够。2.3 在Python中手搓二维Morlet小波核避开SciPy的坑很多工程师第一反应是查scipy.signal.morlet2但注意morlet2返回的是1D Morlet在指定尺度下的采样不是2D核它设计初衷是给1D信号做CWT强行reshape成2D会得到错误的方向响应。正确做法是自己生成2D网格并代入公式import numpy as np import matplotlib.pyplot as plt def morlet2d(shape, scale, theta, omega05.0): 生成二维Morlet小波核 :param shape: (height, width) 输出核尺寸建议为奇数如33x33 :param scale: 尺度参数 a 0 :param theta: 方向角弧度 :param omega0: 中心频率默认5.0保证时频局部化 :return: 复数二维数组 (H, W) h, w shape # 创建中心对齐的坐标网格-h//2 到 h//2-1 y np.arange(-h//2, h//2).reshape(-1, 1) # (h, 1) x np.arange(-w//2, w//2).reshape(1, -1) # (1, w) # 旋转坐标系u x*cosθ y*sinθ, v -x*sinθ y*cosθ u x * np.cos(theta) y * np.sin(theta) v -x * np.sin(theta) y * np.cos(theta) # Morlet公式π^(-1/2) * exp(i*ω0*u/a) * exp(-(u²v²)/(2a²)) # 注意这里省略了1/a²归一化因后续做卷积时会由conv2d自动处理 psi (np.pi**(-0.5) * np.exp(1j * omega0 * u / scale) * np.exp(-(u**2 v**2) / (2 * scale**2))) return psi # 示例生成一个33x33、尺度a4、方向0°的Morlet核 kernel_0deg morlet2d((33, 33), scale4, theta0) print(fKernel shape: {kernel_0deg.shape}, dtype: {kernel_0deg.dtype}) # 输出Kernel shape: (33, 33), dtype: complex128这段代码的关键逻辑说明y和x使用arange(-h//2, h//2)确保核中心在(0,0)这对保持卷积的空间对齐至关重要u/v的旋转计算必须严格按公式任何符号错误如v的负号漏掉会导致方向响应完全错乱omega05.0是经验值小于4则高斯窗太宽时域定位差大于7则复指数振荡过密频域泄漏严重返回complex128类型因为后续CWT需要保留相位信息用于重构。注意此核是复数不能直接用cv2.filter2D它只支持实数核。必须用scipy.signal.convolve2d或 PyTorch 的F.conv2d输入转为复数张量。3. 二维Morlet连续小波变换CWT实战如何把一张图变成多尺度-多方向特征图3.1 CWT流程图不是一次卷积而是“尺度×方向”的全排列扫描对一张灰度图像 $I(x,y)$ 做2D Morlet CWT本质是对每个预设尺度 $a_k$ 和每个预设方向 $\theta_m$用对应的2D Morlet核 $\psi_{a_k,\theta_m}(x,y)$ 与图像做卷积得到该尺度-方向下的复数响应 $W_{a_k,\theta_m}(x,y)$。整个过程可理解为构建一个4D张量(尺度数, 方向数, 高度, 宽度)。例如取4个尺度a2,4,8,16和4个方向0°,45°,90°,135°最终得到16张复数特征图。每张图的模长|W|表示该位置在该尺度-方向下的能量强度相位angle(W)表示结构走向。去噪的核心就藏在这里噪声在所有尺度-方向上呈现均匀、无结构的“毛刺”能量而真实结构只在特定尺度-方向上形成连贯的高能量脊线。3.2 用Scipy实现高效CWT避免for循环的向量化技巧直接写四层嵌套for循环尺度×方向×图像高×图像宽会慢到无法忍受。正确姿势是预生成所有核堆叠成4D张量再用scipy.signal.convolve2d批量卷积。但注意convolve2d不支持批量核所以得用scipy.ndimage.convolve配合np.stackfrom scipy import ndimage import numpy as np def cwt_2d_morlet(image, scales, thetas, omega05.0, kernel_size33): 对图像执行2D Morlet连续小波变换 :param image: 2D numpy array (H, W)灰度图 :param scales: 尺度列表如 [2,4,8,16] :param thetas: 方向列表弧度如 [0, np.pi/4, np.pi/2, 3*np.pi/4] :return: 4D complex array (len(scales), len(thetas), H, W) h, w image.shape # 预生成所有核并堆叠(S, T, K, K) kernels [] for a in scales: for theta in thetas: kernel morlet2d((kernel_size, kernel_size), scalea, thetatheta, omega0omega0) kernels.append(kernel) kernels np.stack(kernels) # (S*T, K, K) # 将图像扩展为 (1, H, W) 以便广播 image_3d image[np.newaxis, ...] # (1, H, W) # 批量卷积对每个核与图像做2D卷积 # 注意ndimage.convolve默认用constant填充边界效应需后续处理 cwt_result np.zeros((len(scales), len(thetas), h, w), dtypenp.complex128) idx 0 for i, a in enumerate(scales): for j, theta in enumerate(thetas): # 卷积输出与输入同尺寸modesame conv_real ndimage.convolve(image, np.real(kernels[idx]), modeconstant, cval0.0) conv_imag ndimage.convolve(image, np.imag(kernels[idx]), modeconstant, cval0.0) cwt_result[i, j] conv_real 1j * conv_imag idx 1 return cwt_result # 示例调用 img np.random.rand(256, 256) # 模拟含噪图像 scales [2, 4, 8, 16] thetas [0, np.pi/4, np.pi/2, 3*np.pi/4] cwt_out cwt_2d_morlet(img, scales, thetas) print(fCWT output shape: {cwt_out.shape}) # (4, 4, 256, 256)这段代码的性能关键点kernel_size33是经验值太大如65导致核内大部分值趋近于0纯属算力浪费太小如15则无法覆盖Morlet的有效支撑域约±3σ造成截断误差modeconstant, cval0.0是最稳妥的边界填充避免reflect或wrap引入虚假周期性分开计算实部/虚部卷积是因为ndimage.convolve不支持复数核——这是Scipy的硬限制绕不开输出cwt_out[i,j]是复数矩阵后续所有操作阈值、重构都基于其模长和相位。3.3 可视化CWT结果看懂“能量脊线”才是去噪的开始光有数据不够得会读图。以下代码将CWT结果中某尺度-方向的模长图可视化并叠加原始图像对比def plot_cwt_slice(cwt_result, scale_idx, theta_idx, original_img, title_suffix): 绘制单个尺度-方向的CWT模长图 magnitude np.abs(cwt_result[scale_idx, theta_idx]) fig, axes plt.subplots(1, 2, figsize(12, 5)) # 左图原始图像 axes[0].imshow(original_img, cmapgray) axes[0].set_title(fOriginal Image {title_suffix}) axes[0].axis(off) # 右图CWT模长归一化到0-1 mag_norm (magnitude - magnitude.min()) / (magnitude.max() - magnitude.min() 1e-8) im axes[1].imshow(mag_norm, cmapjet) axes[1].set_title(fCWT Magnitude (scale{scales[scale_idx]}, θ{int(np.degrees(thetas[theta_idx]))}°)) axes[1].axis(off) plt.colorbar(im, axaxes[1], fraction0.046, pad0.04) plt.tight_layout() plt.show() # 绘制尺度2、方向0°的响应 plot_cwt_slice(cwt_out, scale_idx0, theta_idx0, original_imgimg, title_suffix(noisy))观察重点在干净区域如均匀背景模长图呈现低幅值、无规律的“雪花噪点”在边缘/纹理处模长图出现连续、高亮的线条脊线其走向与边缘方向一致在噪声密集区如椒盐噪声点模长图出现孤立、尖锐的亮点但无延伸性。这就是去噪的判据保留脊线抑制孤立点。下一章的阈值策略全基于这个视觉直觉。4. 小波系数阈值策略为什么全局阈值是玄学而尺度-方向自适应才是正解4.1 全局阈值的三大翻车现场它为何在Morlet CWT中彻底失效很多教程直接套用Donoho的VisuShrink公式threshold σ * sqrt(2*log(N))N为像素总数σ为噪声标准差。但在2D Morlet CWT中这招大概率翻车现象1边缘断裂。全局阈值一刀切把弱边缘如CT中早期微钙化灶的脊线能量误判为噪声削掉现象2伪影残留。噪声在某些尺度-方向上能量意外地高如传感器固定模式噪声全局阈值不够狠残留条带现象3纹理失真。自然纹理如木材年轮、织物经纬在多个尺度上都有响应全局阈值无法区分“结构”和“噪声”的能量分布形态。根本原因Morlet CWT的系数统计特性随尺度和方向剧烈变化。小尺度a2下系数近似高斯白噪声大尺度a16下系数呈现长程相关性结构主导。用同一阈值处理等于让小学生和博士生考同一张数学卷。4.2 尺度-方向自适应阈值用局部方差估计噪声强度工业级做法是对每个尺度 $a_k$ 和每个方向 $\theta_m$独立估计该通道的噪声标准差 $\sigma_{k,m}$再计算对应阈值。核心思想是——噪声在CWT域中仍近似白噪声其方差可用系数的局部统计量估计。常用方法中位绝对偏差MAD法对|W_{k,m}|的所有像素计算MAD median(| |W| - median(|W|) |)则 $\sigma \approx MAD / 0.6745$鲁棒中位法取|W_{k,m}|的低百分位如第1%像素值作为噪声基线再向上浮动2~3倍我们推荐的混合策略兼顾鲁棒性与效率def estimate_sigma_per_channel(magnitude_map, methodmad): 为单个CWT通道的模长图估计噪声标准差 :param magnitude_map: 2D array, |W_{k,m}(x,y)| :param method: mad or percentile :return: scalar sigma if method mad: # MAD法对所有像素计算MAD med np.median(magnitude_map) mad np.median(np.abs(magnitude_map - med)) sigma mad / 0.6745 else: # percentile法取1%分位数再乘系数 p1 np.percentile(magnitude_map, 1) sigma p1 * 2.5 # 经验系数可根据图像类型微调 return max(sigma, 1e-6) # 防止sigma为0 def adaptive_thresholding(cwt_result, methodmad, threshold_factor1.2): 对CWT结果进行尺度-方向自适应阈值 :param cwt_result: 4D complex array (S, T, H, W) :param method: 阈值估计方法 :param threshold_factor: 阈值放大系数1.0 :return: 阈值后的4D complex array S, T, H, W cwt_result.shape cwt_thresh np.zeros_like(cwt_result) for i in range(S): for j in range(T): mag np.abs(cwt_result[i, j]) sigma estimate_sigma_per_channel(mag, methodmethod) thresh threshold_factor * sigma # 软阈值更平滑W_thresh sign(W) * max(|W| - thresh, 0) phase np.angle(cwt_result[i, j]) mag_thresh np.maximum(mag - thresh, 0) cwt_thresh[i, j] mag_thresh * (np.cos(phase) 1j * np.sin(phase)) return cwt_thresh # 应用自适应阈值 cwt_thresh adaptive_thresholding(cwt_out, methodmad, threshold_factor1.2)参数说明threshold_factor1.2是起点太小1.0去噪不足太大1.5易伤结构。实际项目中我们总在1.1~1.3间微调用软阈值而非硬阈值软阈值让系数平滑过渡到0避免硬截断引入吉布斯振铃estimate_sigma_per_channel中methodmad更鲁棒percentile在强结构图像中更快因只算分位数。4.3 避坑Morlet CWT去噪的5个致命误区与血泪经验误区1直接对复数系数做阈值忽略相位一致性现象去噪后图像出现诡异的“彩虹色条纹”或大面积模糊。原因对复数W A*exp(iφ)直接W[W thresh] 0破坏了A和φ的耦合关系。当A被置零但φ未同步清零逆变换时相位混乱。解决永远先算mag |W|阈值作用于mag再用原φ重建W_thresh mag_thresh * exp(iφ)。代码中phase np.angle(...)正是为此。误区2CWT后不做系数重构以为模长图就是去噪结果现象输出的“去噪图”全是彩色斑点完全不像原图。原因CWT系数是中间表示不是图像。必须通过小波逆变换ICWT把阈值后的系数映射回像素域。Morlet的ICWT有解析解但工程中更常用重构核法下一章详解。解决把cwt_thresh当作新特征图必须走完整重构流程不可跳步。误区3尺度数量太少3或太多8导致频带覆盖不全现象小尺度噪声没压住或大尺度结构如器官轮廓被过度平滑。原因尺度序列应覆盖图像的主要频率成分。太少则频带缺口太多则计算爆炸且小尺度噪声与大尺度结构混叠。解决用对数尺度scales [2**i for i in range(min_power, max_power1)]。对512x512图min_power1, max_power5即2,4,8,16,32是黄金组合。误区4方向数固定为4忽视图像内容特异性现象处理文字扫描件时水平/垂直方向效果好但45°方向全是噪声处理织物图时45°/135°方向反而最关键。原因方向数应与图像主结构方向匹配。通用图选4方向0/45/90/135但若已知主方向如CT扫描线为水平可精简为2方向0/90提速。解决先用cv2.Canny或梯度直方图粗估主方向再定制thetas。误区5忽略CWT的冗余性用conv2d后直接拼接导致内存溢出现象cwt_out占用GB级内存程序崩溃。原因CWT是冗余变换系数数 像素数。4尺度×4方向×256×256 1MB但若用64尺度×8方向直接飙到16MB。解决用np.float32存储模长重构时再转复数对每个尺度-方向单独处理不用堆叠4D张量用dask.array或分块计算对超大图。5. 从CWT系数到去噪图像Morlet逆变换ICWT的两种落地路径5.1 理论逆变换的困境为什么Morlet没有完美解析ICWTMorlet小波不是正交基也不是双正交基因此不存在严格的、能量守恒的解析逆变换公式。文献中常写的ICWT积分式$$ I(x,y) \frac{1}{C_\psi} \int_0^\infty \int_{-\infty}^\infty \int_{-\infty}^\infty W_{a,\theta}(x,y) , \psi_{a,\theta}\left(\frac{x-x}{a}, \frac{y-y}{a}\right) , dx dy \frac{da}{a^3} d\theta $$其中 $C_\psi$ 是容许性常数。但这个三重积分在离散图像上无法精确实现连续尺度 $a$ 必须离散化引入近似误差方向 $\theta$ 离散化后旋转核的插值带来失真数值积分精度受网格密度制约计算量爆炸。所以工程实践必须妥协用重构核Reconstruction Kernel替代理论ICWT。核心思想是——既然正向CWT是卷积那逆变换就该是某种“反卷积”而Morlet的重构核就是其自身共轭翻转conjugate and flip的归一化版本。5.2 重构核法Reconstruction Kernel Method稳定、快速、可复现这是工业界首选方案。步骤清晰对每个尺度 $a_k$ 和方向 $\theta_m$生成其对应的重构核 $g_{a_k,\theta_m}(x,y) \frac{1}{a_k^2} \psi_{a_k,\theta_m}^*(-x,-y)$将阈值后的系数 $W_{a_k,\theta_m}^{thresh}(x,y)$ 与 $g_{a_k,\theta_m}$ 做卷积对所有尺度-方向的结果求和再除以总能量归一化因子。关键洞察由于Morlet是复数其重构核必须是共轭翻转不是简单翻转。代码实现def reconstruction_kernel_2d(shape, scale, theta, omega05.0): 生成2D Morlet重构核g(x,y) (1/a²) * ψ*(-x,-y) h, w shape y np.arange(-h//2, h//2).reshape(-1, 1) x np.arange(-w//2, w//2).reshape(1, -1) # 翻转坐标-x, -y u_flip (-x) * np.cos(theta) (-y) * np.sin(theta) v_flip -(-x) * np.sin(theta) (-y) * np.cos(theta) # 共轭exp(i*...) - exp(-i*...) psi_conj (np.pi**(-0.5) * np.exp(-1j * omega0 * u_flip / scale) * np.exp(-(u_flip**2 v_flip**2) / (2 * scale**2))) # 乘以1/a²归一化 g (1.0 / (scale**2)) * psi_conj return g def icwt_reconstruct(cwt_thresh, scales, thetas, kernel_size33, image_shapeNone): 用重构核法从阈值CWT系数重建图像 :param cwt_thresh: 4D complex array (S, T, H, W) :param image_shape: 原图尺寸 (H, W)用于初始化输出 :return: 2D real array (H, W) S, T, H, W cwt_thresh.shape if image_shape is None: image_shape (H, W) # 初始化重建图像 recon_img np.zeros(image_shape, dtypenp.complex128) # 对每个尺度-方向生成重构核并卷积 for i, a in enumerate(scales): for j, theta in enumerate(thetas): # 生成重构核 g reconstruction_kernel_2d((kernel_size, kernel_size), scalea, thetatheta) # 对该通道系数做卷积注意cwt_thresh[i,j]是复数 conv_real ndimage.convolve(np.real(cwt_thresh[i, j]), np.real(g), modeconstant, cval0.0) conv_imag ndimage.convolve(np.imag(cwt_thresh[i, j]), np.imag(g), modeconstant, cval0.0) conv_complex conv_real 1j * conv_imag recon_img conv_complex # 归一化除以总能量经验系数 # 理论上应除以 C_psi但实践中用均值归一化更鲁棒 recon_img np.real(recon_img) # 取实部虚部应接近0 recon_img (recon_img - recon_img.min()) / (recon_img.max() - recon_img.min() 1e-8) return recon_img.astype(np.float32) # 执行重构 denoised_img icwt_reconstruct(cwt_thresh, scales, thetas, kernel_size33, image_shapeimg.shape) print(fDenoised image shape: {denoised_img.shape}, dtype: {denoised_img.dtype})这段代码的生存指南reconstruction_kernel_2d中u_flip/v_flip的推导必须严格任何坐标符号错误都会导致重构图像整体偏移或模糊ndimage.convolve再次被使用因为它支持实数核与复数输入的卷积实部/虚部分开算最终np.real(recon_img)是必须的——理论上虚部应为0但数值误差会残留微小虚部归一化用(x-min)/(max-min)而非除以C_psi因为C_psi依赖于连续积分离散化后无精确值经验归一化更稳定。5.3 验证去噪效果不止看PSNR更要盯住“结构保真度”PSNR/SSIM是必要但不充分指标。我们坚持三个验证动作残差图可视化residual |original - denoised|理想情况是残差集中在噪声位置结构区域残差≈0频谱对比对原图、去噪图、残差图分别做2D FFT看高频噪声是否被压制而中频结构频谱是否保留关键结构ROI放大检查如CT中的血管分叉点、SAR中的道路交叉口手动放大100%确认边缘是否锐利、无振铃、无伪影。def validate_denoising(original, denoised, titleDenoising Validation): 三合一验证残差图、频谱、ROI放大 residual np.abs(original - denoised) # 计算FFT中心化 fft_orig np.fft.fftshift(np.fft.fft2(original)) fft_deno np.fft.fftshift(np.fft.fft2(denoised)) fft_res np.fft.fftshift(np.fft.fft2(residual)) # ROI取中心64x64区域放大 h, w original.shape roi_orig original[h//2-32:h//232, w//2-32:w//232] roi_deno denoised[h//2-32:h//232, w//2-32:w//232] fig, axes plt.subplots(2, 3, figsize(15, 10)) # 行1原图、去噪图、残差图 axes[0,0].imshow(original, cmapgray); axes[0,0].set_title(Original) axes[0,1].imshow(denoised, cmapgray); axes[0,1].set_title(Denoised) im3 axes[0,2].imshow(residual, cmaphot); axes[0,2].set_title(Residual); plt.colorbar(im3, axaxes[0,2]) # 行2频谱取log10(abs1)增强可视性 axes[1,0].imshow(np.log10(np.abs(fft_orig)1), cmapviridis); axes[1,0].set_title(FFT Original) axes[1,1].imshow(np.log10(np.abs(fft_deno)1), cmapviridis); axes p a hrefhttps://download.csdn.net/download/weixin_42696271/25533828 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑