
我最早接触Marr小波是好几年前做信号特征提取的时候。那时候项目里需要从一段含噪的振动数据里把瞬态冲击成分找出来试过短时傅里叶变换分辨率总是不太够后来换到小波分析一下就把问题简化了。而在所有小波基里Marr小波也叫墨西哥帽小波Mexican Hat又是最直觉、最直观的一个——波形长得就跟一顶倒扣的帽子一样对信号的突变点天生敏感。这篇博文就从Matlab_Marr小波尺度变换图这个标题出发把Marr小波的原理、尺度变换的含义、Matlab里完整的复现流程以及我实际踩过的坑一次性讲清楚。无论你是刚开始接触小波分析的学生还是做故障诊断、生物电信号处理、图像边缘提取的工程师这篇文章都能给你一条可以直接照着跑的路线。1. Marr小波是什么——别急着写代码先把这顶帽子认识清楚1.1 一个负正负波形为什么会是边缘检测的利器Marr小波这个名字来源于计算机视觉领域的David Marr。他在研究视觉系统中的边缘检测时提出用高斯函数的二阶导数来模拟生物视觉的感受野这个函数后来被纳入小波族就成了Marr小波。它的数学表达式是ψ(t) (2 / (√3 · π^(1/4))) · (1 - t²) · e^(-t²/2)如果你在Matlab里把这个函数画出来会看到一条中间高峰、两侧负谷的对称曲线整体轮廓确实像一顶墨西哥草帽。这个形状的关键在于(1 - t²)这个因子。当t从0开始增大时t²小于1函数为正一旦|t|超过1符号翻转函数变成负数形成一个围绕主峰的负圈。这个正负交替的结构让它天然具备了二阶微分的特性。我们回想一下信号的一阶导数响应的是上升沿和下降沿二阶导数则在信号突变的地方出现过零正负极值对。Marr小波直接在模板层面完成了这一步所以你拿它去做卷积、去做连续小波变换本质上就是在不同尺度下对信号做多分辨率的高通滤波把哪里变化剧烈标记出来。1.2 尺度参数到底在缩放什么小波的尺度和位置两个维度构成了小波变换的坐标系。Marr小波的母函数ψ(t)被定义为基本形态然后通过对t做伸缩和平移生成一组小波基ψa,b(t) (1/√a) · ψ((t - b)/a)这里的a就是尺度参数b是平移参数。改变a就相当于把原始波形水平拉伸或压缩。a越大波形越宽——注意不是简单的放大而是波形在时间轴上被拉伸频率自然变低a越小波形越窄对应高频分量。为什么前面要乘1/√a这涉及小波的能量归一化。如果不做这个归一化拉伸后的小波能量会变大变换系数就会偏向大尺度分量画出来的尺度图会在低频区域大面积偏亮严重影响对信号真实强度的判断。这一点很多人写代码时会漏掉后面我们画图时会重点看这个影响。1.3 Marr小波与Haar、Morlet、db小波的选型对比我经常被问到既然有那么多小波基为什么偏偏选Marr下面这张表是我自己总结的选型参考都是实际用过之后的体会小波基波形特点最适合的任务注意点Haar方波阶梯突变检测、教学演示不光滑频域衰减慢Morlet复指数调制高斯时频分析、振荡信号适合连续小波变换不适合离散重构db系列紧支撑正交信号压缩、去噪重构阶数越高越光滑计算量越大Marr实值对称正负成对边缘提取、瞬态识别无尺度函数不能做完整重构Marr小波最突出的特点是实值、对称、光滑。和其他小波相比它的波形在时域上没有振荡尾巴不会在旁边激起假响应在频域上衰减很快频带干净。这使它特别适合检测那些来无影去无踪的瞬态成分——比如机械故障中的撞击信号、电力系统的局部放电脉冲、脑电信号里的棘波。而如果你做的是信号的完全重构、压缩编码那Marr就不合适了因为它没有配套的尺度函数说白了它不是正交基你只能做分析不能精确地重构回原信号。2. 尺度变换图里藏了什么信息——多尺度分析的底层逻辑2.1 时间分辨率与频率分辨率的矛盾尺度变换图尺度图scaleogram的横轴是时间或空间位置纵轴是尺度或对应的等效频率颜色代表小波系数的幅值。这张图做的事本质上是在时间和频率的赛跑里找一个折中。这里用显微镜来类比最合适当你用低倍镜看一个样本视野很大但小结构看不清楚换成高倍镜细节出来了但你只能看到很小一片区域。小波变换里的尺度参数就相当于显微镜的倍率。小尺度对应高倍镜——时间分辨率高能把一个突变点的位置精确到毫秒级但此时等效频率高、频带窄你看不到低频趋势大尺度对应低倍镜——你能看到整个信号的包络走向但一个尖锐的冲击会被抹成宽缓的起伏定位精度大打折扣。短时傅里叶变换的窗口是固定的一旦选好窗长整张谱图的时间分辨率就被锁死了而小波变换天生就是用窄窗看高频、宽窗看低频的策略让每个频段的特征都以它最合适的分辨率呈现。这也是为什么尺度图在分析非平稳信号时明显优于传统时频图。2.2 尺度与等效频率的换算关系在使用Matlab的cwt函数时你会发现输出的是尺度而不是频率。在很多场景下我们更希望看到物理意义明确的频率轴。对于Marr小波存在一个常用的小波中心频率Fc。Matlab里可以通过centfrq(mexh)直接查询这个值大约在0.25左右精确值是0.2509。然后根据下面的换算公式把尺度a映射到等效频率ff Fc / (a · Δt)其中Δt是采样间隔Δ1/FsFs为采样率。举一个具体的例子假设信号采样率Fs 1000 Hz小波中心频率Fc 0.25某时刻的尺度a 5那么等效频率就是0.25 / (5 / 1000) 50 Hz。也就是说这个尺度下小波主要打量的是信号中50 Hz附近的分量。这个换算关系要自己动手验证过才能记得牢。我在实际项目里会先用一个已知频率的仿真信号跑一遍尺度图看峰值出现在哪个尺度再反推频率确保换算式里的符号没写反、单位没搞错。这种事不验证一次出了问题很难排查。2.3 一张尺度图上典型的四种特征形态看多了尺度图之后你会形成一种快速读图的能力。下面这四种形态是我在各类信号里反复见到的水平亮带信号中存在一个持续稳定的频率分量比如工频噪声在尺度图上表现为一条横贯的亮带尺度值恒定意味着频率恒定。垂直线条某个瞬间发生了一次强冲击信号在那一刻包含极宽的频率成分图上就会在对应时刻出现一条从上到下的亮色细线。倒锥形亮区信号的频率随时间升高或降低比如动设备启动时的升速过程亮区会呈现明显的倾斜走向频率升高对应于不断变小的尺度。均匀噪点背景噪声对应的系数普遍较小在图上表现为一种均匀分布的浅色纹理和真正的特征成分很好区分。有了这些判读基础后面我们构造仿真信号和解读尺度图时就能一眼看出哪里是料哪里只是噪声。3. 手把手用Matlab画出第一张Marr小波尺度变换图3.1 环境准备与工具箱说明开始之前先确认你的Matlab环境可用。绘制Marr小波和使用连续小波变换主要依赖两大块功能Wavelet Toolbox小波工具箱——提供cwt、centfrq、scal2frq等核心函数。基础绘图功能——所有版本的Matlab都自带。如果你没有Wavelet Toolbox大多数画Marr小波的操作也能通过手动卷积完成后面我会专门演示这条不依赖工具箱的路线。但正规起见我还是建议先检查一下ver在命令行运行上面的命令在弹出的版本信息里搜索Wavelet Toolbox。如果没有可以尝试在命令行运行matlab.addons.installedAddons查看可用的扩展或者考虑安装工具箱。单纯为了跑通本文的示例你有两条路一是安装完整的Wavelet Toolbox二是直接复制后面的纯手写卷积代码那个不依赖任何工具箱。3.2 第一步生成Marr小波基函数并观察其形态我们需要先直观感受一下Marr小波长什么样。在Matlab中可以直接用小波工具箱内置的wavefun函数生成% 生成Marr小波墨西哥帽点数可以自行调整 [psi, xval] wavefun(mexh, 20); figure(Color, w, Position, [100 100 800 400]); plot(xval, psi, b-, LineWidth, 2); grid on; xlabel(时间 t); ylabel(幅值); title(Marr小波墨西哥帽母函数波形);运行之后你会看到一个清晰的正-负-正波形中间主峰高耸两侧对称下陷。这个负瓣的大小和主峰的比例是固定的正是这个固定比例赋予了它二阶微分的定位能力。如果觉得分辨率不够可以增大wavefun的第二个参数代表分解层数点数会自动变密。直接修改点数到更高值再重画一遍你会看到负瓣的深度和边缘的光滑度都会明显改善。这是很多教程没提的一个细节——画小波函数时点数不够看起来会毛糙容易误以为是代码写错了。3.3 第二步构造一个用于分析的仿真信号直接对随机信号做变换可以展示流程但看不出任何门道。我习惯先构造一个已知答案的信号既有低频趋势又有高频瞬态成分再加一点噪声这样后面看尺度图时能明确地检验结果。% 采样参数 Fs 1000; % 采样率1kHz t 0:1/Fs:1; % 1秒时长 N length(t); % 三个成分50Hz正弦波 0.55s处的高斯冲击 白噪声 sig_low 1.5 * sin(2*pi*50*t); gauss_pulse 3 * exp(-((t - 0.55).^2) / (2*0.002^2)); sig_noise 0.3 * randn(size(t)); sig sig_low gauss_pulse sig_noise; % 绘制原信号 figure(Color, w, Position, [100 100 800 300]); plot(t, sig, k-, LineWidth, 1); xlabel(时间 (s)); ylabel(幅值); title(仿真信号低频正弦波 瞬态冲击 噪声); grid on;这个信号里50Hz的正弦是持续分量高斯冲击是瞬态事件噪声是干扰背景。三者频率成分有重叠又有区分。如果用短时傅里叶变换来分析窗一旦取长冲击的时间定位变模糊窗取短频率分辨率又受到限制。而Marr小波的尺度变换图处理这种混合信号能同时照顾两头的需求。3.4 第三步执行连续小波变换并绘制尺度图用Matlab实现Marr小波尺度变换图有两条路线官方工具箱路线和手写卷积路线分别对应不同的使用场景。路线一官方工具箱适合快速分析从R2016b之后Matlab的cwt函数经过了重构输入输出格式和以前不一样。2020a之后的版本推荐的调用方式是% 直接用默认参数执行连续小波变换 [wt, freqs] cwt(sig, Fs, mexh); % 绘制尺度图 figure(Color, w, Position, [100 100 900 500]); t_axis t; imagesc(t_axis, freqs, abs(wt)); set(gca, YDir, normal); % 让低频在下方高频在上方 xlabel(时间 (s)); ylabel(频率 (Hz)); title(Marr小波尺度变换图等效频率坐标); colorbar; colormap(jet); axis tight;这里有个很关键的点新版cwt返回的是以Hz为单位的等效频率而不是尺度。这省去了我们自己换算的麻烦但也带来一个细节——老版本Matlab的cwt返回的是尺度向量如果代码在网上东拼西凑非常容易出现版本错配。我后面在常见问题部分再展开讲这个坑。路线二手写卷积适合理解原理和规避工具箱依赖如果你想彻底掌握Marr小波变换的原理或者Matlab里没有安装小波工具箱就看这条路。思路就是按定义生成不同尺度的Marr小波核再用卷积核与信号做卷积% 手动Marr小波变换 scales 1:80; % 尺度范围 coefs zeros(length(scales), N); % 存储系数 for i 1:length(scales) a scales(i); % 生成当前尺度下的Marr小波核 tau -5*a:1/Fs:5*a; % 截断窗口取[-5a, 5a]因为高斯尾巴在5a外已衰减到几乎为0 psi (1/sqrt(a)) * (2/(sqrt(3)*pi^(1/4))) * (1 - (tau/a).^2) .* exp(-0.5*(tau/a).^2); % 卷积截取有效部分 conv_res conv(sig, fliplr(psi), same) / Fs; coefs(i, :) conv_res; end % 画图 figure(Color, w, Position, [100 100 900 500]); imagesc(t, scales, abs(coefs)); set(gca, YDir, normal); xlabel(时间 (s)); ylabel(尺度 a); title(Marr小波尺度变换图手写实现纵轴为尺度); colorbar; colormap(parula); axis tight;注意这里卷积时用了fliplr(psi)。很多人第一次写卷积总会忘了小波核需要翻转虽然数值上可能差别不大但严格按互相关的定义就应该这么做。还有除以Fs的操作是为了把连续卷积的数值尺度修正回信号的原始幅值水平。这两处属于隐藏在代码里的细节不解释你可能永远不知道为什么要写。两条路线怎么选如果你只是为了出图、看趋势、做毕业论文的展示用工具箱的cwt一分钟出图效果稳定。如果你要深入研究变换机理、需要在边缘设备上复现算法、或者后续要修改小波定义手写实现是绕不开的基本功。3.5 第一步到第三步的完整整合代码为了让读者能直接复制运行我把从信号生成到画出尺度图的全部代码整合成一个脚本%% Marr小波尺度变换图完整示例 clearvars; close all; clc; % 1. 生成信号 Fs 1000; t 0:1/Fs:1; sig_low 1.5 * sin(2*pi*50*t); gauss_pulse 3 * exp(-((t - 0.55).^2) / (2*0.002^2)); sig_noise 0.3 * randn(size(t)); sig sig_low gauss_pulse sig_noise; % 2. 使用Wavelet Toolbox的cwt函数 [wt, freqs] cwt(sig, Fs, mexh); % 3. 绘图 figure(Color,w,Position,[100 100 1200 400]); subplot(1,2,1); plot(t, sig, k-); xlabel(时间 (s)); ylabel(幅值); title(原始信号); grid on; subplot(1,2,2); imagesc(t, freqs, abs(wt)); set(gca, YDir, normal); xlabel(时间 (s)); ylabel(频率 (Hz)); title(Marr小波尺度变换图); colorbar; colormap(jet); axis tight;运行这段代码之后理想情况下你会看到尺度图上在50 Hz附近有一条水平亮带对应正弦波在t0.55s附近有一根垂直亮线对应冲击其余位置分布着均匀的浅色噪点。如果这三个特征都能清晰辨认说明你的变换流程没有原则性问题。3.6 手动调参经验尺度范围怎么选手动实现时尺度的取值范围要在频率分辨能力和计算开销之间权衡。我的经验是最低尺度取1对应最高频率最大尺度的确定结合信号最低频率来看。对上面的仿真信号50Hz正弦波和冲击成分的频率跨越几十到几百赫兹用1到80的尺度范围足够覆盖。具体换算式是f Fc / (a · Δt)。如果需要看低频成分把最大尺度调大如果只关心高频细节限制最大尺度到30以内即可尺度过多只会拖慢计算、增加冗余信息。另外尺度间隔建议用线性间隔a1:2:80不要一开始就用对数间隔后者会让你在高频段的分辨率损失太明显不利于观察瞬态信号的定位。4. 从图到判断——尺度图出来后怎么读到有效信息4.1 读图的三步法演示尺度图不是画出来就算完事最关键的是要从图里读出结论。我在实际项目中把读图过程总结成三步新手可以照着这个顺序来第一步看整体分布。先用色标和图面配色判断系数幅值的大致量级。如果某个区域的颜色接近色条的上限说明那里有强能量成分需要重点关注。第二步定位时间特征。从图上找到垂直方向的亮条或暗条。垂直线条意味着信号在某一瞬间发生了突变这在故障诊断中非常关键——因为它直接告诉你故障发生的时刻。我做过一个轴承故障检测的项目就是在尺度图上看到周期性的垂直线条才定位到缺陷产生的冲击频率的。第三步分析频率走向。如果亮带不是水平而是倾斜的说明信号频率在随时间变化这往往是设备升降速、振动模态变化等过程的重要线索。4.2 用峰值搜索自动提取瞬态成分读图可以人工做但工程上常常需要自动化提取。我常用的方法是沿着时间轴对每个时刻的系数幅值求和然后找局部极大值% 对任意时刻的系数求绝对值的和 energy_per_time sum(abs(wt), 1); % 找到冲击位置 threshold 0.5 * max(energy_per_time); [~, locs] findpeaks(energy_per_time, MinPeakHeight, threshold, ... MinPeakDistance, 100); % 最小间隔至少0.1秒 figure(Color,w,Position,[100 100 1000 300]); plot(t, energy_per_time, b-); hold on; plot(t(locs), energy_per_time(locs), ro, MarkerSize, 8, LineWidth, 2); xlabel(时间 (s)); ylabel(小波能量和); title(瞬态事件自动识别结果); grid on; legend(能量和曲线, 检出的冲击);这段代码的思路是瞬态成分在每个尺度上都会产生较大系数所以把各尺度系数的绝对值求和可以显著放大瞬态事件的响应再配合简单的峰值检测就能自动找出冲击发生的时间位置。注意MinPeakDistance要根据信号采样率来调整否则同一个冲击可能被检成多次。我先后在仿真信号和真实采集的电流信号上验证过这个逻辑只要信噪比不是特别差低于3dB要慎重效果都不错。4.3 尺度图与短时傅里叶谱图的核心区别既然一直在对比这里把尺度图与短时傅里叶谱图的核心差异用最直白的方式说明白窗函数是否固定。短时傅里叶变换用固定长度的窗时频网格是均匀的小波变换用变宽的窗时频网格在高频处窄、低频处宽。低频处频率分辨率。相同分析时长下小波变换在低频段的频率分辨率更好能把低频接近的频率成分分开短时傅里叶变换要做到这一点必须加大窗长结果又牺牲了时间分辨率。瞬态定位能力。高频段小波的时间分辨率高所以对冲击类信号的定位特别有利。如果信号是平稳的、只关心慢变趋势短时傅里叶谱图完全够用一旦信号里混着突发成分和非平稳过程尺度图的优势就体现出来了。这不是谁替代谁的问题而是根据任务选工具的问题。5. 参数归一化与细节优化——影响尺度图质量的关键点5.1 归一化问题尺度图的美观和信息可读性很大程度上取决于是否做了正确的归一化。Marr小波变换得到的系数幅值跨度往往很大如果直接画色标会把小系数压成一片深色细节全被淹没了。常用的做法是取幅值后再做一次对数压缩或者直接用imagesc后通过caxis老版本或clim新版本把色标范围限制在一个合理的区间内。我的经验是先画出全幅图找到系数幅值的5%和95%分位数然后把色标范围设在这两个值之间这样既能保留弱信号细节又不会让个别强峰值把整个色标拉伸得失去辨识度。在Matlab的较新版本中clim取代了caxis写法为clim([low, high])。另一个常见的误区是绝对不要默认用jet色图到底。jet从蓝到红过渡看似绚丽但对色盲人群不友好而且颜色对比度过大容易掩盖幅值的细微变化。我个人在数据分析场景更推荐parulaMatlab默认色图或viridis它们按亮度渐变适合精确观察系数强弱。5.2 边缘效应处理使用连续小波变换时有一个很容易被忽略的问题——边缘效应。小波核是有支撑宽度的在信号的开始和结束位置卷积计算时核会部分落在数据范围之外导致边界的系数不可靠。在尺度图上这种效应通常表现为两端出现异常的强亮条或暗条。处理方式有两种一是分析前给信号两侧做对称或周期延拓算完变换后裁掉对应区域二是直接裁剪显示范围只保留可靠区域。Marr小波在尺度a下的核支撑大约在[-5a, 5a]换算成时间边界左右各要舍弃约5a/Fs秒。在实际应用里我通常直接丢弃两端的5%数据或者根据最大尺度的支撑长度来定裁剪量效果很稳定。5.3 计算性能优化与大数据处理建议尺度图的计算量要清醒评估一下。假设信号长度N10000尺度数80手写双重循环的复杂度是O(N · 尺度数 · 核长度)在普通笔记本上可能要跑几十秒。如果遇到这种情况有几个优化手段第一把尺度数从线性间隔改成对数间隔从80个尺度降为40个视觉差异很小计算量减半。第二用Matlab的conv函数的GPU版本或者改用并行循环parfor。我的一个经验是在小波工具箱版本的cwt内部已经做了快速算法大多数情况下官方cwt的性能远优于手写实现。第三高采样率的数据可以先降采样。如果信号最高关心频率只有100Hz信号采样率是10kHz那完全可以直接降采样到500Hz再分析计算量大大减少信息量几乎无损。5.4 存储与导出在Matlab里导出尺度图我建议用exportgraphics而不是saveas前者能保证导出分辨率清晰适合写作或汇报。figure(Color,w,Position,[100 100 900 500]); imagesc(t, freqs, abs(wt)); set(gca, YDir, normal); colormap(parula); colorbar; axis tight; exportgraphics(gcf, Marr_wavelet_scaleogram.png, Resolution, 300);导出时给图片加一个合理的标题和坐标标签标注好采样率、小波类型、尺度范围这样图放在论文或报告里读者不用看正文也能理解这张图是怎么得到的。6. 常见问题速查表——从配色到版本兼容踩坑实录问题现象可能的根源解决办法尺度图全是一片深色或一片亮色色标范围不合理系数动态范围太大改用clim限制显示范围或用分位数压缩图的横纵坐标刻度看着不对cwt返回的是频率老代码可能拿它当尺度处理先查看变量用freqs还是scales看数值范围判断信号两端出现明显的异常条带边缘效应丢弃两端不可靠数据或先做延拓手动画出的Marr小波感觉形状不对离散点数不够增大wavefun点数或把tau取更密使用cwt时报错提示输入参数不对Matlab版本不同语法差异查doc cwt确认当前版本参数格式注意R2016b前后差异尺度图上高频部分看不清尺度间隔设置过宽减小尺度步进或改用对数间隔后调整色标波形图是对的但尺度图的绝对值太小缺少能量归一化1/√a导致系数偏低检查公式确认归一化因子想导出高清图但画质模糊用了saveas缩放不当使用exportgraphics并设置300dpi以上6.1 版本兼容问题深挖关于cwt函数Matlab在R2016b和R2020a有过两次重要调整。旧版cwt的调用格式允许直接传小波名称比如cwt(sig, 1:32, mexh)返回的第一个变量是系数矩阵第二个是尺度向量新版cwt返回的第二个变量是频率向量或结构体且频率对应实际物理频率。如果你在2023a上跑网上找到的旧教程代码第一步往往就报错。我的建议是不要和版本较劲直接以doc cwt的官方示例为准或者把旧代码里的cwt调用改成新格式。另外如果你用的是很新的R2026a之类的版本记得先看官方release notes里有没有对Wavelet Toolbox的更新避免因函数签名变化而白折腾。6.2 作图时的配色坑很多人习惯直接用默认的jet色图。jet的问题在于颜色过渡是非线性的而且有几段色带在灰度化之后几乎无法区分。我对尺度图的配色建议是学术展示用parula或viridis亮度递增信息保真度最高。如果目标是突出高亮区域比如故障点可以用hot色图它从黑到红到黄到白视觉冲击更强。尽量避免用rainbow类色图做定量分析它对色觉缺陷人群非常不友好。这个建议同样是经验之谈。有一次我在报告里用了parula结果评审老师看得清楚、提问也少后来我换回jet给另一个项目出图被人问你这高亮到底是强还是弱从那以后我就把配色当作数据分析的一部分来认真对待。7. 从会画图到会用图——Marr小波尺度变换的三个典型应用场景7.1 机械故障诊断识别振动信号中的冲击成分机械设备比如滚动轴承、齿轮箱发生局部损伤时振动信号会周期性地出现冲击脉冲。这类冲击持续时间极短覆盖频带很宽在普通时域图上可能被噪声掩盖但在尺度图上会表现为周期性的垂直亮条——而且这些亮条出现的周期正好对应着故障特征频率。我在一个轴承外圈故障的仿真数据上做过测试把Marr小波尺度图的垂直亮条位置提取出来计算相邻亮条的间隔反推出来的故障频率和理论值误差在1%以内。这个精度足够支撑工程判断了。实际操作时你要注意选择尺度范围让冲击信号的频段落在尺度图的中高区域否则亮条会糊在一起。7.2 生物电信号分析锁定瞬态波形脑电EEG里的棘波、肌电里的爆发信号、心电里的早搏波形都具有突然出现、很快消失的特点。Marr小波的多尺度分辨能力让这些瞬态波形在不同尺度上呈现出不同的形态变化。在分析一批癫痫脑电数据时我用Marr小波先做变换再在特定尺度带上观察系数幅值的突变成功把棘波从大量正常背景中分离了出来。这种方法的优势在于不用预先知道棘波的具体形态只要它和背景在时间-尺度特征上有差异尺度图就能把它顶出来。7.3 图像处理从一维到二维的边缘提取Marr小波在图像处理中最经典的应用是Marr-Hildreth边缘检测算法。思路是先用高斯滤波器平滑图像去除噪声再求拉普拉斯算子检测过零点。本质上这就是在用一个二维的墨西哥帽核对图像做滤波。在Matlab中如果你已经画熟了一维的Marr小波尺度变换图再去看二维的Mar小波滤波会发现很多概念是共通的——同样的正负区域结构同样对剧烈变化敏感。理解了一维的尺度变换二维的滤波核理解起来就水到渠成。8. 最后的一点心得体会Marr小波尺度变换图这个东西说难不难说简单也不简单。刚上手时你可能照着教程把图跑出来激动个三分钟然后对着图上花花绿绿的颜色发懵——这些色块到底代表什么为什么和我预期的不一样这种能画但不会用的阶段我经历过而且花了不少时间才走出来。我的体会是想真正掌握它一定要从构造一个自己知道答案的信号开始。比如先用两个正弦波加一个脉冲搭出信号再去做尺度变换看看图上哪个位置出现亮条、亮条宽度和尺度是什么关系。当你在这个往返验证的过程中建立起信号特征→尺度图特征的直觉之后处理真实数据时就不再是盲目地调色、调尺度范围而是有目的地去寻找你要的特征——这种感觉完全不一样。Marr小波只是小波家族里最简单、最直观的一个成员但它背后那一整套多尺度看信号的思维方式才是真正值得反复琢磨、反复积累的财富。希望这篇从原理到代码、从画图到读图、从参数调到实际应用都覆盖到的文章能让你少走一些我当年走过的弯路。