恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

MATLAB图像去噪实践:传统算法与DnCNN源码对比

  • 首页
  • 资讯中心
  • /
  • MATLAB图像去噪实践:传统算法与DnCNN源码对比

相关资讯

PHP软件分发站跨终端部署与下载链路实战 2026/9/14 5:03:08
Unity DOTS深度解析:从Entity到System,彻底搞懂ECS核心机制 2026/9/14 5:03:08
一条告警响 100 次,怎么变成 1 次?开源 AIOps Keep 告警自动化快速上手 2026/9/14 5:03:08

最新资讯

MCP Server进阶实践:错误处理、流式输出与远程部署全指南
弧齿锥齿轮TCA技术:原理、建模与工程应用
Dozzle 容器显示名称完整指南:dev.dozzle.name 标签与 Coolify 集成原理
Keep 告警自动化完整指南:5 分钟跑起来,从接入告警到自动响应
Python面向对象三大特性:继承、多态与封装实战解析
300美元DIY三维扫描系统:USB相机+ESP32+Open3D实战指南

今日推荐

ASP+Access库存管理系统源码部署与IIS配置实战指南
基于SSM框架的毕业季旧物分类处理系统设计与实现
MATLAB FFT频谱仿真:从DFT原理到参数设置与窗函数选择

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

MATLAB图像去噪实践:传统算法与DnCNN源码对比

发布时间:2026/9/14 5:08:09
MATLAB图像去噪实践:传统算法与DnCNN源码对比 简介一套基于MATLAB的图像去噪算法完整源码资料包同时覆盖传统去噪算法与基于深度卷积神经网络的DnCNN方法适用于期末大作业、课程设计与毕业设计等场景。压缩包内共177个文件总体积约80MB包含35个m格式主程序脚本、33个mat格式数据或模型文件、26个png格式结果对比图另有多平台可用的mex编译库便于直接调用txt与markdown说明文档有助于快速上手。已有361人学习或下载源码注释详细、逻辑清晰新手也能独立完成部署与运行。包内算法涵盖BM3D、VBM3D、CBM3D、CVBM3D等经典变体可处理图像与视频去噪同时附带DnCNN演示程序便于对比传统方法与深度学习的差异理解噪声抑制与细节保持原理。目录按算法模块组织结构清晰通过已有模型即可直接获得实验输出尤其适合需要快速完成高分课程作业或毕业设计实验的学生。1. 图像去噪在MATLAB里的两条路线传统算法与DnCNN源码为什么值得同时跑图像去噪是图像处理里最基础也最容易做错的一步。做缺陷检测的人先试中值滤波发现边缘糊了做医学切片的人换小波阈值又看到振铃听同行说DnCNN效果好结果连训练数据都准备好几周。真正可复用的做法是把传统去噪算法和深度卷积神经网络放在同一个MATLAB工程里用同一张带噪图、同一套PSNR/SSIM指标去对比再根据结果选择模型。标题里的“源码全部资料”其实就是这个意思不追求从零发明网络而是把传统滤波的调参逻辑、DnCNN的网络结构和训练命令都固定下来随取随用。下面先把传统去噪的MATLAB实现方式过一遍再拆开DnCNN的卷积残差结构最后用统一测试脚本把两条路线的差距量化出来。新手可以直接抄命令熟手则留意每一处参数边界的讨论。2. 传统图像去噪算法在MATLAB里的矩阵实现与参数选择2.1 用同一份噪声数据搭建传统算法对比基线做传统去噪的第一步不是选滤波器而是先把噪声模型固定下来。固定噪声模型的意思是随机种子、噪声类型、噪声强度都要写进脚本保证后续每个算法面对的是同一张带噪图。常见做法是先把图像转成double并归一化到[0,1]再用imnoise叠加零均值高斯噪声噪声水平用σ25/255代表。为什么不在uint8图像上做因为imnoise对uint8输入会先还原到[0,1]范围再叠加噪声之后重新量化回整数这一来一回会让实际噪声方差和预期值之间出现偏差PSNR测量也不稳定。I im2double(imread(cameraman.tif)); rng(2024); sigma 25 / 255; I_noisy imnoise(I, gaussian, 0, sigma^2); I_med medfilt2(I_noisy, [3 3]); I_wiener wiener2(I_noisy, [5 5]); fprintf(noisy: PSNR%.2f SSIM%.4f\n, psnr(I_noisy, I), ssim(I_noisy, I)); fprintf(median: PSNR%.2f SSIM%.4f\n, psnr(I_med, I), ssim(I_med, I)); fprintf(wiener: PSNR%.2f SSIM%.4f\n, psnr(I_wiener, I), ssim(I_wiener, I));这段代码说明了三个要点。rng(2024)固定随机种子让每次生成的高斯噪声都一样比较算法时不会因为噪声差异而误判imnoise的方差输入必须写成sigma^2而不是sigma本身psnr和ssim函数要求输入两个同尺寸、同数值范围的图像所以原始图和带噪图都用im2double统一归一化。如果你想要一个更公平的传统算法基线建议把这一小段脚本封装成compare_traditional.m后续每加一种算法就插入一行评价输出。2.2 均值、中值、维纳滤波的核大小和边界处理均值滤波是最容易上手的做法但它在MATLAB里踩过坑的人非常多。直接用fspecial(average, [3 3])生成核再用imfilter做卷积这是最稳的组合方式。很多人直接写conv2结果尺寸小了或者边界变黑就是因为没有处理边界填充。imfilter的边界选项默认是零填充对于图像边缘来说零填充会让边缘像素被拉暗。我一般会在比较实验里统一使用symmetric边界让边缘向外镜像这样边缘处的去噪效果不会因为补零而产生假边框。算法常见调用关键参数适用噪声主要问题均值滤波imfilter(I, fspecial(average,[3 3]),symmetric)核大小高斯噪声边缘模糊细节丢失中值滤波medfilt2(I, [3 3], symmetric)邻域尺寸椒盐噪声高斯噪声下作用有限维纳滤波wiener2(I, [5 5])窗口尺寸高斯噪声纹理区域易过度平滑小波阈值wdenoise2(I, 3, Wavelet,sym4)分解层数、阈值规则混合噪声振铃与边缘伪影维纳滤波的窗口大小直接影响噪声方差估计。窗口调成[3 3]时保边更好但去噪较弱[7 7]以上噪点基本消失但图像会明显变糊。实际调参时我习惯先看输出图的方差窗口从5开始若背景噪声还有明显颗粒感就加大若主体纹理开始丢失就减小。中值滤波对高斯噪声并不是最合适的它在有椒盐噪声时能一下把白点黑点擦掉但如果仅仅是高斯噪声不如维纳和小波。2.3 小波阈值去噪的分解层数与阈值规则MATLAB从R2016b开始提供了比较完整的wdenoise和wdenoise2接口。wdenoise2面向图像内部会执行二维小波分解、阈值处理、重构三步而wdenoise是给一维信号用的。常见做法是选sym4小波基、分解3层、阈值规则用Bayes因为Bayes阈值对中等噪声水平下的自然图像比较稳健不会像Universal阈值那样把细节滤得过于干净。下面这段代码把小波去噪放进基线I_wavelet wdenoise2(I_noisy, 3, ... Wavelet, sym4, ... DenoisingMethod, Bayes, ... ThresholdRule, Median, ... NoiseEstimate, LevelIndependent);如果分解层数设为1去噪能力不够背景噪声残存很多设为5以上虽然噪声几乎降为零但图像中的细小结构比如发丝、边缘会和小波系数一起被阈值掉。阈值规则中的Median指用中位数绝对偏差估计噪声标准差LevelIndependent表示各层噪声水平独立估计。这组参数在自然图像上通常比固定阈值好但遇到医学图像这种纹理密集的场景时需要把Rule改为SURESURE准则在弱纹理区域不容易产生伪影代价是弱噪声下去噪不彻底。传统算法里真正能达到实用工业级的是非局部均值(NLM)和BM3D。MATLAB本身没有内建BM3D常见做法是去下载公开的BM3D源码加入路径后调用。由于它涉及块匹配和协同滤波比较耗时一般在做最终基准时才会启用。我不建议把它写进入门脚本先用均值、中值、维纳、小波把流程跑通再考虑扩展。3. 基于深度卷积神经网络的DnCNN源码残差学习与MATLAB训练参数3.1 DnCNN的残差学习为什么对去噪有效DnCNN的核心思想是让卷积神经网络直接预测干净的图像吗不是它预测的是噪声残差。给定带噪图像yxn其中x是干净图像n是噪声网络输出R(y)约等于n最终预测为y-R(y)。这个设计的直接好处是让网络把注意力集中在噪声模式上而不用重新生成整幅图的纹理。DnCNN原始结构起于2017年CVPR那篇文章常见的网络深度采用17层结构第一层是卷积层加ReLU激活中间14层是“卷积批量归一化(BN)ReLU”最后一层用纯卷积输出单通道残差图。BN层的存在让高噪声水平的训练收敛更快这是它比普通CNN在MATLAB里更容易训练的原因之一。3.2 在MATLAB里手动搭建DnCNN层图在使用MATLAB深度学习工具箱时有两个选择直接调用denoisingNetwork(dncnn)获取预训练网络适合推理和微调或者自己搭一遍网络结构适合生成自己的训练源码。如果你想把源码看明白建议把层图手动建一遍。下面代码构造了一个17层的DnCNN网络结构第一层不加BN最后输出层也不加BNlayers [ imageInputLayer([40 40 1], Name, input, Normalization, none) convolution2dLayer(3, 64, Padding, same, Name, conv1) reluLayer(Name, relu1) ]; for idx 2:15 layers [layers; convolution2dLayer(3, 64, Padding, same, Name, [conv num2str(idx)]); batchNormalizationLayer(Name, [bn num2str(idx)]); reluLayer(Name, [relu num2str(idx)])]; end layers [layers; convolution2dLayer(3, 1, Padding, same, Name, conv_out); regressionLayer(Name, mse)]; lgraph layerGraph(layers);这段代码有几个需要解释的设计点。第一层是固定在40×40的灰度图像输入Normalization改成none因为图像归一化应该在进入网络之前完成网络内部只做卷积和ReLU不需要再次归一化。中间循环从idx2到15生成14个卷积层每层都使用64个3×3卷积核Padding设为same保证特征图尺寸不变。最后一个conv_out用1个3×3卷积核输出单通道残差图最后接回归层计算像素级均方误差。如果你的显存足够大patch尺寸可以改成50×50或更大但注意patch尺寸将直接影响训练时能看到的上下文范围。3.3 训练数据准备成对补丁与噪声残差DnCNN的训练数据一般来自自然图像做法是先把图像转成灰度并裁剪成固定尺寸的补丁。为了稳定我先离线生成一批带噪图再使用randomPatchExtractionDatastore把干净图和带噪图成对裁剪sigma 25 / 255; imds imageDatastore(data/raw, IncludeSubfolders, true); mkdir(data/train_noisy); for k 1:numel(imds.Files) I im2double(imread(imds.Files{k})); I im2gray(I); I_noisy imnoise(I, gaussian, 0, sigma^2); imwrite(I_noisy, fullfile(data/train_noisy, [n_ num2str(k) .png])); end cleanDS imageDatastore(data/raw, IncludeSubfolders, true, ColorSpace, grayscale); noisyDS imageDatastore(data/train_noisy, IncludeSubfolders, true, ColorSpace, grayscale); pairDS randomPatchExtractionDatastore({cleanDS, noisyDS}, [40 40], PatchesPerImage, 128); residualDS transform(pairDS, makeResidual); function dataOut makeResidual(data) clean data{1}; noisy data{2}; dataOut {noisy, noisy - clean}; end这里的关键是makeResidual。data{1}是干净补丁data{2}是同一个位置带噪补丁让网络的输入是noisy期望输出是noisy - clean也就是噪声残差。注意不要直接把网络输出设定为clean虽然也能收敛但收敛速度和最终PSNR会比残差学习差不少。randomPatchExtractionDatastore的两个数据源必须来自完全对应的目录如果多一张或少一张图片读取过程会直接报错。3.4 训练选项参数表与收敛技巧训练参数决定网络是欠拟合还是发散。以下这组配置是DnCNN在中等噪声水平下比较常用的options trainingOptions(sgdm, ... InitialLearnRate, 0.001, ... MaxEpochs, 50, ... MiniBatchSize, 128, ... Shuffle, every-epoch, ... LearnRateSchedule, piecewise, ... LearnRateDropFactor, 0.1, ... LearnRateDropPeriod, 30, ... GradientThreshold, 0.1, ... Plots, training-progress, ... ExecutionEnvironment, auto);这个参数表里最关键的是GradientThreshold和DropPeriod。GradientThreshold设为0.1是在梯度爆炸时做截断因为DnCNN有BN训练初期如果学习率偏高残差loss会突然跳到NaNDropPeriod设30表示30轮之后学习率乘以0.1让网络在后期更精细地调整卷积核。MiniBatchSize在单卡8G显存上一般选64或128如果显存不够优先减到64而不是把patch尺寸调小因为patch太小会让感受野不足。InitialLearnRate从0.001开始如果loss曲线震荡改成0.0005再跑一轮。参数推荐值调节方向patch尺寸40×40增大提升效果增加显存噪声范围sigma ∈ [0,50]/255想泛化复杂噪声随机采样sigma训练轮数30-50更久不一定更好看验证loss批大小64-128小batch对BN不稳定学习率0.001 → 0.0001震荡时调小一半如果目标不是训练一遍完整模型而是想快速得到基线可以直接用denoisingNetwork(dncnn)加载预训练网络不需要自己训练。这个函数返回的网络已经能处理σ25附近的噪声节省的时间足够你多跑几组对比实验。4. 源码怎么跑目录、推理与微调命令4.1 一份可复用的源码包目录结构标题中的“源码全部资料”在工程上落地为一份结构清晰的目录。我通常这样组织把数据、训练脚本、测试脚本、工具函数和文档分开而不是所有m文件堆在一起。一个最简结构如下目录 / 文件作用data/raw/原始干净图像训练和测试共用data/train_noisy/由脚本生成的带噪图避免重复加噪models/DnCNN.mat预训练网络或训练输出train/run_train_dncnn.m训练入口负责数据准备、网络搭建、训练test/run_denoise_compare.m传统算法与DnCNN对比入口utils/add_noise.m噪声注入封装utils/eval_metrics.mPSNR/SSIM评价封装README.md参数说明与运行顺序这里最重要的是输入数据要统一放到data/raw而不是散落在桌面。所有脚本都通过相对路径从项目根目录解析在MATLAB里cd到项目根目录再运行避免使用绝对路径这样换机器也能直接跑。4.2 用预训练模型对一张测试图做推理的最小命令拿到源码后第一件事不是训练而是跑通推理。MATLAB的深度学习工具箱提供了denoisingNetwork和denoiseImage两个函数让DnCNN推理变得非常短。下面这段命令可以直接放进命令行net denoisingNetwork(dncnn); I im2double(imread(data/raw/cameraman.tif)); I_noisy imnoise(I, gaussian, 0, (25/255)^2); I_denoised denoiseImage(I_noisy, net); imwrite(I_denoised, results/cameraman_dncnn.png);denoiseImage与predict的区别在于denoiseImage会处理图像边界并进行适当的重叠推理输出尺寸与输入一致对任意尺寸图像都能处理。predict则要求输入尺寸与网络输入大小一致或者使用大小可变的输入层。所以作为源码中的测试脚本我推荐用denoiseImage。如果网络是手动搭建的lgraph需要先转为dlnetwork或使用层图再调用预测。对大多数使用者来说预训练模型跑推理只需要这几行。4.3 噪声水平sigma参数固定噪声与噪声自适应模型实际使用中会遇到一个问题用σ25训练的模型去处理σ50的带噪图效果会明显变差。因为残差网络只学会了25强度附近的噪声分布。如果要处理动态范围的噪声常见做法有两个。一是训练时对每个batch随机采样一个σ比如从[0,50]/255均匀抽取让网络适应不同强度这就是“噪声自适应”的基本思路。二是仍然固定噪声水平但提供多个噪声档位的模型。源码包中一般会预留一个noise_level参数用来区分训练和推理时的强度。在MATLAB里最简单的做法是在生成训练数据时动态传入sigma而不是写死。例如训练配置里可以这样定义sigma_range [0 50]/255; currentSigma rand(1) * diff(sigma_range) sigma_range(1);注意如果同一个batch内所有patch的噪声强度不同BN层会被迫学习一个“平均噪声强度”的特征分布导致单档噪声去噪不彻底。所以在实际训练中一个mini-batch内应保持同一σ不同mini-batch之间随机。你可以在数据流中用标签记录每个patch的σ但DnCNN原始模型没有输入噪声强度所以保持batch内一致是最稳妥的。4.4 用预训练模型微调小学习率与继续训练如果自己的图像风格与自然图像差异大比如医学影像或工业点云投影图最好的办法不是从零训练而是微调预训练网络。常见做法是先加载模型然后以0.0001的学习率、20轮epoch继续训练net denoisingNetwork(dncnn); lgraph layerGraph(net); options trainingOptions(sgdm, ... InitialLearnRate, 1e-4, ... MaxEpochs, 20, ... MiniBatchSize, 64); trainedNet trainNetwork(pairDS, lgraph, options);全量微调最省事但数据量不足时容易过拟合。如果训练集只有几百张图建议把学习率再降为3e-5并增加数据增强。如果想冻结前层需要先用analyzeNetwork查看网络层名再把对应卷积层的WeightLearnRateFactor和BiasLearnRateFactor置为0Matlab官方例子中常借助freezeWeights和createLgraphUsingConnections实现但这部分代码会随网络层名变化不建议新手直接套用。5. 对比实验同一测试管线下传统算法和DnCNN的差距5.1 统一测试脚本和结果表格输出把前面所有算法拉进同一条测试管线用脚本自动生成对比表。这里假设I_noisy、I_med、I_wiener、I_wavelet、I_denoised都来自前面章节的同一张测试图methods {Noisy,Median,Wiener,Wavelet,DnCNN}; results zeros(numel(methods), 2); results(1,:) [psnr(I_noisy,I), ssim(I_noisy,I)]; results(2,:) [psnr(I_med,I), ssim(I_med,I)]; results(3,:) [psnr(I_wiener,I), ssim(I_wiener,I)]; results(4,:) [psnr(I_wavelet,I), ssim(I_wavelet,I)]; results(5,:) [psnr(I_denoised,I), ssim(I_denoised,I)]; T array2table(results, VariableNames, {PSNR,SSIM}, RowNames, methods); disp(T);在实际结果中σ25下DnCNN的PSNR通常比维纳滤波器高3~5dBSSIM提升更明显。如果DnCNN效果反而不如维纳优先检查输入图像是否归一化、denoiseImage是否把输出裁剪到[0,1]以及模型对应的σ是否匹配。5.2 从视觉伪影反推参数问题PSNR高不代表视觉好。传统算法在高噪声下容易出现振铃小波阈值去噪在边缘附近产生波纹维纳滤波在纹理区域会有类似油画的过度平滑。DnCNN在这两类问题上明显更少但如果你用不匹配σ的模型会出现微弱网格或者斑点。在源码包里我会额外输出一张绝对误差热图用imagesc(abs(I_denoised - I))看看残差集中在哪些区域。如果残差集中在高频细节区说明去噪强度过大需要降低噪声参数或用更小的σ模型如果残差明显是稀疏的高斯点说明模型对当前噪声水平适应不足。5.3 把去噪放进图像预处理管线的实用技巧当需要把去噪结果送入分割或检测算法时不建议单独追求最高PSNR。因为分割算法往往依赖边缘梯度传统均值滤波虽然PSNR提升但梯度幅值下降明显反而让分割结果更碎。DnCNN的优势在于去噪后保留边缘直接用原图梯度做阈值会更稳定。如果你处理的是连续视频帧建议对相邻帧先做时序平均再交给DnCNN这样标准差降低可以用更小的σ模型输出更干净。最后把源码中的噪声生成函数单独提取出来随机种子写进README文档这样每次对比都能用同一随机种子生成完全相同的测试噪声实验基线才不会被重新运行悄悄改变。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号