恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
基于MATLAB小波变换的图像去噪与边缘检测实现
首页
资讯中心
/
基于MATLAB小波变换的图像去噪与边缘检测实现
基于MATLAB小波变换的图像去噪与边缘检测实现
发布时间:2026/10/8 14:32:00
很多人接触数字图像处理时去噪和边缘检测往往是绕不开的两道坎。传统做法通常是先高斯滤波或者中值滤波把噪声压下去再用Sobel、Prewitt或者Canny算子找边缘。这套组合拳对付轻度噪声没问题但一旦噪声变重或者图像本身纹理复杂你就会发现一个尴尬的平衡——噪音滤得越干净边缘细节丢得越厉害边缘保得越完整残留噪声又让检测结果布满伪边缘。我实际做MATLAB图像处理项目时后来换成了一套统一的小波变换框架用同一组分解系数同时做去噪和边缘检测效果比传统流程稳定不少。这篇内容就围绕小波变换在MATLAB中的去噪与边缘检测代码实现展开先从原理讲清楚为什么小波能兼顾这两件事再给出可以直接跑的完整代码和调参经验适合正在做MATLAB图像处理大作业、信号处理课题或者想替换传统检测流程的读者。1. 为什么边缘检测要引入小波变换传统算子的瓶颈在哪里在写代码之前我建议先花几分钟想清楚一个问题Sobel、Prewitt、Canny这些经典算子为什么在噪声较大的场景下会失灵理解这个你才能明白小波变换带来的真正价值而不是仅仅多学一个工具箱函数。1.1 噪声和边缘在频域里的身份重叠图像边缘的本质是灰度值的剧烈变化反映在频域里就是高频分量。而噪声——尤其是高斯噪声和椒盐噪声——同样落在高频区域。传统算子Sobel、Prewitt、Laplacian本质上是高通滤波器它们会把所有高频分量一视同仁地放大这就导致一个无法避免的困境算子拿到的高频能量里边缘和噪声是混在一起的根本无法靠滤波本身区分。Canny算子的思路是先用高斯模糊做平滑把一部分噪声先滤掉再做梯度计算。但高斯滤波的尺度参数sigma很敏感sigma小了噪声压不住sigma大了细边缘和角点也跟着被抹平。这个矛盾在小波变换里有一个更优雅的解法——多分辨率分析。小波变换把图像分解成不同尺度下的近似分量和细节分量噪声和边缘在不同尺度上的表现规律是不同的真实边缘往往在多个尺度上都保持较强的响应而噪声随着尺度增大迅速衰减。利用这个差异就能在保留边缘的同时去掉噪声。1.2 小波变换能同时解决去噪和边缘检测的底层逻辑小波变换的核心思想是把信号分解成一系列小波基函数的叠加。对图像做二维小波分解后会得到四个子带一个低频近似分量CA以及三个方向的高频细节分量——水平CH、垂直CV、对角CD。低频分量承载图像的主体结构高频分量承载边缘、纹理和噪声。这里就有两个关键性质可以利用信号的小波系数幅值通常大于噪声的小波系数幅值所以在小波域做阈值收缩可以比较干净地剥离噪声这是小波去噪的理论基础。图像的边缘在小波域中对应的是模值较大的系数而且在多个尺度上都有延续噪声系数则分布散乱、尺度间不相关。于是可以通过模极大值或者多尺度系数融合来定位边缘。所以你会发现去噪和边缘检测本质上是围绕同一批小波系数做不同的后处理去噪是收缩系数边缘检测是筛选系数。这也是我后来在项目里把两者合并到同一套流程的根本原因——代码结构更清晰调试也更方便。1.3 MATLAB小波工具箱的选型哪些函数是核心做这类工作MATLAB的小波工具箱Wavelet Toolbox里有几个函数你一定会频繁用到我先把职责理清楚wavedec2对二维图像做多层小波分解返回系数向量c和簿记矩阵s。wrcoef2从分解系数中重构出指定层、指定方向的子带图像方便可视化。waverec2由处理后的系数重构图像。wdenoise2/wdencmp二维小波去噪的封装函数适合快速出结果。wthresh对系数应用软阈值或硬阈值自定义去噪流程时会用到。swt2二维平稳小波变换具有平移不变性做边缘检测更稳。老版本MATLAB比如R2016a之前没有wdenoise2需要用wdencmp替代下面我会在代码里给出两种写法。2. 小波去噪的关键在于阈值策略从原理到MATLAB实现去噪是整套流程的第一步也是决定最终边缘检测效果的上限。很多初学者把去噪理解为调一个denoise函数传进去就完事但实际效果好不好很大程度上取决于阈值怎么选、用软阈值还是硬阈值、按全局统一阈值还是逐层分层阈值。我逐一拆开讲。2.1 阈值选择的数学依据Donoho固定阈值和极大极小阈值小波去噪的理论基础是Donoho提出的 wavelet shrinkage 方法。它的核心假设是高斯白噪声经过正交小波变换后仍然是高斯白噪声且各层小波系数标准差基本一致。基于这个假设Donoho给出了一个全局阈值计算公式thr sigma * sqrt(2 * log(N))其中sigma是噪声标准差N是信号采样点数。直觉上这个阈值会随着N增大而增大因为点数越多出现大噪声系数的概率越高阈值需要定得更保守才能防止误判。但公式里的sigma一般是未知的需要估计。MATLAB提供了两种常见估计方式基于最细尺度高频系数的中位数绝对偏差MAD估计sigma median(abs(cD1)) / 0.6745这个0.6745来自正态分布的分位数关系鲁棒性很好。也可以直接用MATLAB的noisest函数对最细尺度对角线系数做估计。实际工程中我更喜欢用分层阈值level-dependent threshold因为随着分解层数加深噪声系数幅值会略有变化每层单独估计sigma更精细。wdenoise2里有一个参数NoiseEstimate可以设成LevelDependent就是这个思路。此外还有极大极小阈值minimaxi和Bayes阈值可供选择前者在信号比较平滑时效果接近最优后者在图像纹理丰富时往往更实用。2.2 软阈值与硬阈值一个保幅值一个保尖锐阈值选定之后要对小波系数做收缩处理。两种最基础的策略硬阈值系数绝对值大于阈值就保留原值小于等于阈值就置零。表达式干净但函数在阈值处不连续重构图像容易产生振铃Gibbs伪影。软阈值系数绝对值大于阈值时向零方向收缩一个阈值量小于等于阈值置零。函数连续重构更平滑但会系统性压缩所有大系数的幅值导致边缘对比度下降。我在实际使用中的经验如果后面还要做边缘检测硬阈值其实更友好——边缘不会变钝但硬阈值带来的振铃会在边缘附近产生虚假的高频响应。折中的做法是采用软硬折中阈值firm threshold即在软硬之间加一个线性过渡区或者使用非负garrote阈值。MATLAB里的wthresh函数原生支持软阈值s和硬阈值h折中方案需要自己写几行后面我会给一个实现。2.3 一维信号去噪先跑通最小闭环再上二维图像我建议你第一步先在CPU上跑一个一维信号去噪的demo把阈值策略调明白再切换到二维图像。这样排查问题会快很多因为一维情形下系数变化非常直观。下面是MATLAB代码%% 一维信号小波去噪示例 clear; clc; rng(0); % 生成测试信号含有突变的正弦波 t 0:0.01:1; clean sin(2*pi*4*t) 0.5*sign(sin(2*pi*20*t)); noisy clean 0.3*randn(size(t)); % 使用wdenoise快速去噪 % 参数说明6层分解sym8小波Bayes阈值软阈值规则 denoised wdenoise(noisy, 6, Wavelet, sym8, ... DenoisingMethod, Bayes, ThresholdRule, Soft); % 计算信噪比 snr_in 10*log10(sum(clean.^2)/sum((noisy-clean).^2)); snr_out 10*log10(sum(clean.^2)/sum((denoised-clean).^2)); fprintf(输入信噪比: %.2f dB - 输出信噪比: %.2f dB\n, snr_in, snr_out); % 可视化 figure; subplot(3,1,1); plot(t, clean); title(原始信号); grid on; subplot(3,1,2); plot(t, noisy); title(含噪信号); grid on; subplot(3,1,3); plot(t, denoised); title(去噪信号); grid on;这段代码跑通之后你会发现方波突变处的跳变沿被保留得很好这是传统FIR低通滤波很难做到的。原因就是小波基在时域和频域都有良好的局部化特性它处理非平稳信号有突变、有瞬态成分比傅里叶方法自然得多。2.4 二维图像去噪wdenoise2与wdencmp两种写法有了上面的基础二维图像去噪就很顺了。我给出两个版本兼容新旧MATLAB版本%% 二维图像小波去噪 clear; clc; rng(0); % 读取灰度图像并加入高斯噪声 img im2double(imread(cameraman.tif)); noisy imnoise(img, gaussian, 0, 0.01); % 均值0方差0.01 % 版本一R2017b推荐用法 wdenoise2 % level3 分解层数, sym4小波, Bayes阈值, 软阈值 denoised1 wdenoise2(noisy, 3, Wavelet, sym4, ... DenoisingMethod, Bayes, ... ThresholdRule, Soft, ... NoiseEstimate, LevelDependent); % 版本二老版本兼容写法 wdencmp % gbl表示全局阈值模式thr是手动估计的阈值 [c, s] wavedec2(noisy, 3, sym4); sigma median(abs(c(end-3*prod(s(1,:)) (1:prod(s(1,:)))))) / 0.6745; thr sigma * sqrt(2 * log(numel(noisy))); denoised2 wdencmp(gbl, noisy, sym4, 3, thr, s, 1); % 计算峰值信噪比PSNR psnr_denoised1 psnr(denoised1, img); psnr_denoised2 psnr(denoised2, img); fprintf(wdenoise2 PSNR: %.2f dB\n, psnr_denoised1); fprintf(wdencmp PSNR: %.2f dB\n, psnr_denoised2); figure; subplot(2,2,1); imshow(img); title(原始图像); subplot(2,2,2); imshow(noisy); title(含噪图像); subplot(2,2,3); imshow(denoised1); title(wdenoise2去噪结果); subplot(2,2,4); imshow(denoised2); title(wdencmp去噪结果);这里有个细节要提醒如果用psnr函数注意输入应该是double类型且取值范围一致0~1否则算出来的值会莫名其妙。另外wdenoise2内部默认会做边界扩展不需要你手工dwtmode但如果你改用wavedec2手动处理边界模式的影响就会显现出来我放到本文最后一部分专门讲。3. 基于小波模极大值的边缘检测核心逻辑与代码拆解去噪做完了接下来是重头戏——用小波变换检测边缘。这里我会从原理讲到实现再给出一段可以在MATLAB里直接运行的代码。3.1 边缘在小波域里的表现多尺度模值延续性先看一张图在小波分解后的样子。对灰度图像做两层wavedec2分解后你会在水平细节子带CH里看到横向边缘、在垂直细节子带CV里看到纵向边缘、在对角子带CD里看到斜向边缘。这意味着边缘的方向信息被天然地分离到了不同的子带中。但真正重要的性质是尺度间的延续性。一个真实边缘从细尺度第1层到粗尺度第2层、第3层对应的小波系数幅值都会比较大而且位置基本对齐。而噪声系数则不然——细尺度上可能幅值不小但到了粗尺度几乎衰减为0。这就是经典的多尺度边缘检测思想在多个尺度上都保持较强响应的位置才是可靠边缘点。我实际项目中使用的判定方式通常是取第1层的水平与垂直细节幅值组合再乘以一个由粗尺度响应加权的置信系数这样既保住了细尺度上的定位精度又借粗尺度剔除了噪声。3.2 实用的检测方案高频细节幅值与多尺度融合在MATLAB代码实现层面最实用的方案有两种方案A简单直接对去噪后的图像做小波分解提取第1层的水平、垂直细节系数计算梯度幅值sqrt(CH1.^2 CV1.^2)再Otsu阈值化得到二值边缘图。这个方案跑起来快适合纹理相对简单的图像。方案B多尺度融合同时用第1层和第2层的信息粗尺度响应作为边缘置信度掩膜细尺度响应提供定位叠加后阈值化。这个方案对复杂纹理更稳代价是多一点计算量。我给出的完整代码如下默认采用方案B%% 小波边缘检测完整实现 function edge_map waveletEdgeDetect(img, level, wname) % 输入img为double型灰度图像level为分解层数wname为小波基 % 输出edge_map为二值边缘图 if nargin 2, level 2; end if nargin 3, wname db4; end % 多层小波分解 [c, s] wavedec2(img, level, wname); % 提取第1层和第2层的水平、垂直细节 CH1 wrcoef2(h, c, s, wname, 1); CV1 wrcoef2(v, c, s, wname, 1); CH2 wrcoef2(h, c, s, wname, 2); CV2 wrcoef2(v, c, s, wname, 2); % 细尺度梯度幅值负责边缘定位 grad_fine sqrt(CH1.^2 CV1.^2); % 粗尺度梯度幅值负责噪声抑制和边缘置信 grad_coarse sqrt(CH2.^2 CV2.^2); % 将粗尺度响应归一化到0~1作为置信度加权 grad_coarse_norm mat2gray(grad_coarse); grad_fine_norm mat2gray(grad_fine); % 融合粗尺度置信度高的地方细尺度响应被保留 fused grad_fine_norm .* (0.5 grad_coarse_norm); % Otsu自适应阈值 thresh graythresh(fused); edge_map imbinarize(fused, thresh); % 清除太小的孤立点面积小于4像素的连通域去掉 edge_map bwareaopen(edge_map, 4); endwrcoef2这个函数很关键它能把多层小波分解系数重构出指定方向、指定层的子带图像尺寸与原图一致方便直接做矩阵运算。需要注意它每次调用都会做一次重构操作所以如果对性能敏感可以改用appcoef2与detcoef2配合自己拼系数。3.3 与Canny、Sobel、Prewitt的定性对比光写代码还不够我拉了一张对比表是我在cameraman.tif加噪后实测的直观感受具体的数值会因噪声分布浮动但趋势很稳定检测方法强噪声下的边缘连续度伪边缘数量细纹理保留度对参数的敏感度Sobel中断明显较多低中阈值难定Prewitt中断明显较多低中Canny较好中中高sigma和双阈值都要调小波多尺度融合好少中高低对小波基不太敏感Canny在干净图像上确实很强但噪声一重它的双阈值会变得非常难调低阈值设高了边缘断裂设低了噪声全被当成边缘。小波方法的优势在于粗尺度置信度加权天然做了第二次筛选伪边缘数量明显可控而且bwareaopen清理掉的小连通域正好是那些孤立噪声点。3.4 更高阶玩法平稳小波变换SWT抑制振铃如果你追求更好的边缘连续性可以试试swt2平稳小波变换。它的特点是不做下采样每一层的子带尺寸和原图一致因此具有平移不变性——不会因为图像平移几个像素导致检测结果发生突变。代价是计算量和内存占用更大。%% 平稳小波边缘检测对振铃更不敏感 function edge_map swtEdgeDetect(img, level, wname) if nargin 2, level 2; end if nargin 3, wname db4; end [A, H, V, D] swt2(img, level, wname); % H{1}为第1层水平细节V{1}为第1层垂直细节 grad_fine sqrt(H{1}.^2 V{1}.^2); grad_coarse sqrt(H{2}.^2 V{2}.^2); grad_fine_norm mat2gray(grad_fine); grad_coarse_norm mat2gray(grad_coarse); fused grad_fine_norm .* (0.5 grad_coarse_norm); edge_map imbinarize(fused, graythresh(fused)); edge_map bwareaopen(edge_map, 4); endswt2输出的H、V是元胞数组每一层是一个矩阵。如果你只是做边缘检测SWT的细腻程度通常更讨喜但内存占用大约是普通DWT的level倍实验图片不大的话完全可以承受。4. 参数怎么影响结果小波基、分解层数与阈值系数的实测对比写代码容易调参数才是真正拉开发差距的地方。这一节我用实际跑过的结果说话把几个关键参数逐一讲透。4.1 小波基的选择Haar、db系列、sym系列怎么取舍不同的小波基会影响去噪平滑度和边缘锐度。我常用的是db4、sym4和sym8haar最简单计算最快但连续性差去噪后容易产生块状伪影不建议用于自然图像。db4/db2Daubechies系紧支撑性好计算量适中图像去噪的万金油。sym4/sym8近似对称相位失真小纹理细节保留更好适合后续做边缘检测。我的建议如果是快速验证直接用db4如果追求更好的纹理保持用sym4。对称性重要吗视觉上你会发现用sym系小波重构出来的图像更少出现斜线锯齿感。4.2 分解层数的取舍不是越多越好分解层数设置到多少很多教程默认写3层但实际要看图像尺寸和噪声强度。我测试了cameraman.tif256×256在不同层数下的PSNR表现分解层数强噪声方差0.02PSNR弱噪声方差0.005PSNR备注128.6 dB32.1 dB去噪不充分230.8 dB33.5 dB综合表现好331.0 dB33.2 dB强噪声下略优弱噪声反而不如2层430.5 dB32.4 dB出现过平滑细节损失注意到一个反直觉现象弱噪声场景下层数设多了PSNR反而下降。原因是层数越深低频分量越被过度平滑边缘弱化。通用的经验是噪声强可以上到3层噪声弱2层就够了。做边缘检测时我通常只用前两层细节第三层只用来做粗尺度置信度不会直接用于定位。4.3 阈值系数的微调给自适应阈值加一个缩放因子不管是wdenoise2的自动阈值还是Donoho公式算出的阈值实际场景中往往需要一个人工缩放因子来微调。比如thr sigma * sqrt(2 * log(N)) * alpha; % alpha通常取0.5~1.5alpha小于1阈值更小保留更多细节去噪不彻底。alpha大于1阈值更大图像更平滑但边缘可能被削。我习惯的做法是先跑一次自动阈值看PSNR和主观效果再手动按0.1步长调整alpha通常在0.8~1.2之间能找到一个不错的平衡点。这个操作在老旧MATLAB上用wdencmp时尤其重要因为它的固定阈值不会根据图像内容自适应。4.4 不同噪声类型的影响高斯噪声和椒盐噪声要区别对待文章开头我把小波说得很万能但这里必须补充一个边界小波阈值去噪主要针对高斯噪声这类服从正态分布、能量散布在所有频带的噪声。如果遇到椒盐噪声脉冲噪声直接用阈值收缩效果并不好——因为脉冲噪声在小波域的系数幅值极大和真实边缘很难区分。处理椒盐噪声更优的方案是先做中值滤波预处理把小波去噪作为第二道精修。我在流程图上是这样安排的你可以参考含噪图像 | --- 椒盐噪声明显 ? --- 先3x3中值滤波 --- 小波去噪 --- 边缘检测 | --- 纯高斯噪声 ? ---------------- 小波去噪 --- 边缘检测这个前置判断在实战中很管用很多人拿到图直接套小波去噪结果遇到椒盐噪声效果反而不如一个中值滤波来得直接。5. 完整可运行代码从去噪到边缘检测的一站式实现前面每一段代码都比较分散这一节我把它们整合成一个完整的流程你可以直接复制跑通。这段代码同时覆盖了去噪、边缘检测、结果对比和客观指标计算。5.1 整合后的核心脚本%% 基于小波变换的图像去噪与边缘检测完整流程 clear; clc; close all; rng(0); % ---------- 1. 准备数据 ---------- original im2double(imread(cameraman.tif)); noisy imnoise(original, gaussian, 0, 0.01); % ---------- 2. 小波去噪 ---------- wname sym4; level 2; denoised wdenoise2(noisy, level, Wavelet, wname, ... DenoisingMethod, Bayes, ... ThresholdRule, Soft, ... NoiseEstimate, LevelDependent); % ---------- 3. 小波边缘检测 ---------- edge_wavelet waveletEdgeDetect(denoised, level, wname); % ---------- 4. 传统方法对比 ---------- edge_canny edge(denoised, canny); edge_sobel edge(denoised, sobel); % ---------- 5. 客观指标 ---------- psnr_dn psnr(denoised, original); snr_dn 10*log10(sum(original(:).^2) / sum((denoised(:)-original(:)).^2)); fprintf(去噪结果 - PSNR: %.2f dB, SNR: %.2f dB\n, psnr_dn, snr_dn); % ---------- 6. 可视化结果 ---------- figure; subplot(2,3,1); imshow(original); title(原始图像); subplot(2,3,2); imshow(noisy); title(含噪图像); subplot(2,3,3); imshow(denoised); title(小波去噪); subplot(2,3,4); imshow(edge_wavelet); title(小波边缘检测); subplot(2,3,5); imshow(edge_canny); title(Canny边缘检测); subplot(2,3,6); imshow(edge_sobel); title(Sobel边缘检测);记得把waveletEdgeDetect函数定义放到脚本末尾或单独保存为同目录下的.m文件。函数定义我之前已经给过直接复制即可。5.2 结果里那些看起来不对的地方第一次跑通后你大概率会遇到几个小问题我提前说边缘图比想象中细碎这是因为oatsu阈值是基于全图统计的遇到灰度层次特别多的图像会把部分弱边缘吞掉。解决方法是降低bwareaopen的面积阈值到2或者对fused图先做一次3×3均值滤波再二值化。Canny的边缘看起来反而更连续这在低噪声图上确实会出现Canny的双阈值做了滞后连接所以长边缘不断裂。此时可以观察伪边缘数量——小波法的伪边缘通常明显更少。如果想提升小波法的连续性可以后续加一步形态学闭运算imclose。去噪图像的边缘稍微发虚这是软阈值收缩带来的系统性偏置。如果特别在意锐度可以把ThresholdRule改成Hard代价是图像会稍微变脏一点振铃增加。我的建议还是软阈值优先因为后续边缘检测对振铃非常敏感。5.3 老版本MATLAB的降级方案如果你用的是R2016a之前的老版本没有wdenoise2和imbinarize替换方案如下wdenoise2替换成wdencmp具体代码在2.4节已经给出。imbinarize(fused, thresh)替换成fused thresh。psnr如果是R2014a之前也没有手动写10*log10(1 / mean((original(:)-denoised(:)).^2))前提是图像取值在0~1。这些兼容细节我在帮别人debug时经常用到很多学生翻代码跑不通往往就是版本差异导致的函数不存在。6. 工程化过程中的常见坑边界效应、数据类型与性能问题最后这部分是一些不太容易在教科书里看到的工程细节几乎每条都是我踩过的坑写出来帮你省时间。6.1 数据类型陷阱uint8和double混用导致的黑边、白点MATLAB图像处理最常见的坑就是数据类型。wavedec2、swt2这些函数对输入类型很敏感如果你直接对uint8图像做分解不去噪重构后有概率出现灰度偏移或黑边。我建议一律先转成double再处理img_d im2double(img_u8); % 转换成0~1范围的double % 处理完成后如果需要显示或保存 img_u8_out im2uint8(img_d_out);这个转换不只是为了满足函数要求更关键的是uint8下做阈值运算时会发生截断阈值逻辑会被破坏。别偷懒统一double处理。6.2 边界效应和dwtmode重构图像边缘为什么有异常小波变换在处理有限长度信号时边界处的滤波会面临信号不够长的问题。MATLAB做了多种边界扩展方案默认是dwtmode(sym)——对称扩展主观效果比较平滑。但如果你去做边缘检测会发现图像的右边缘和下边缘偶尔出现异常的强响应这通常不是真实边缘而是边界扩展造成的伪影。处理办法有两个方向一是用dwtmode(per)周期扩展它对边缘检测更友好代价是去噪时可能在边界引入跳变二是检测之前先把图像四周裁掉比如各剪掉2像素再处理结束之后再pad回来。我倾向后者虽然麻烦一点但最可控。% 裁剪边界避免边缘伪影 img_crop img(3:end-2, 3:end-2); denoised_crop wdenoise2(img_crop, ...); edge_crop waveletEdgeDetect(denoised_crop, ...); % 如果要对齐到原图用padarray补回尺寸 edge_full padarray(edge_crop, [2 2], 0, both);6.3 批量处理图像时的内存与性能考量如果你需要对一批图像批量执行去噪边缘检测我的经验是提前做好三件事预分配结果变量不要在循环里动态增长数组。所有图像重置为统一尺寸比如统一缩放到512×512这样分解层数和阈值参数可以通用。小波基选择固定不变避免每次初始化滤波器开销。我用过很暴力的做法一次性读100张图全部imresize到256×256再对每张执行三层分解总耗时大约几十秒完全可接受。但如果图像很大4000×4000以上就要考虑分块处理或者只用一层分解否则wrcoef2反复重构矩阵会非常慢。6.4 这个方法还能往哪儿扩展深度估计、图像增强与融合最后说一点扩展思路。小波变换在图像处理中的应用远不止去噪和边缘检测。我最近在看深度估计方向有些方法用多尺度小波系数做RGB图像的深度线索提取——纹理和边缘信息恰恰是深度估计里最可靠的几何线索。另外小波变换在图像增强里也有独特位置对低频做对比度拉伸、对高频做增益控制能实现只增强细节不放大噪声的效果这比直方图均衡化要精细得多。如果你正在做图像处理大作业不妨试着把这套流程扩展成去噪-边缘检测-图像增强三合一套件答辩时会很有亮点。在实际项目中我最大的体会是小波方法的上限不取决于工具箱里的函数有多高级而取决于你是否理解阈值和尺度之间的关系。同样的代码敢把阈值、层数、小波基挨个调一遍和写完就忘掉参数最终交付的效果能差出一大截。如果你在自己数据集上测出来某个小波基效果特别好也欢迎回来交流——这种东西数据集不同结论差异很大多分享才能少走弯路。