基于非局部均值(NLM)的MATLAB图像去噪系统
项目简介
本项目是一个基于MATLAB平台开发的图像去噪系统,实现了先进的非局部均值(Non-Local Means, NLM)滤波算法。与传统的中值滤波或高斯滤波不同,NLM算法利用自然图像中普遍存在的“自相似性”特征,通过搜索整个图像或大范围区域内的相似结构块(Patches)来计算像素权重,从而在有效去除高斯白噪声的同时,极好地保持了图像的边缘锐度、纹理细节和结构信息。
为了解决传统NLM算法计算复杂度高的问题,本项目采用了一种基于图像平移(Image Shifting)的快速实现方案,利用MATLAB的矩阵运算优势,大幅提升了算法的执行效率。
功能特性
- 自动化图像预处理与噪声模拟:系统能够读取图像并自动归一化,支持人为添加指定强度的高斯白噪声,用于模拟真实的受噪环境。若读取图片失败,系统会自动生成棋盘格测试图像。
- 快速非局部均值滤波:通过矩阵平移和卷积操作替代了低效的逐像素双重循环,实现了NLM算法的向量化加速,显著减少了处理高分辨率图像时的等待时间。
- 客观质量评价:内置峰值信噪比(PSNR)和结构相似性(SSIM)计算模块,能够从像素误差和结构感知两个维度量化评估去噪效果。
- 多维度结果可视化:提供原始图像、噪声图像、去噪图像及噪声残差图的同屏对比显示,其中残差图经过亮度增强,便于观察被去除的噪声分布。
系统要求
- MATLAB R2016a 或更高版本(建议 R2018b+ 以获得更好的性能)。
- Image Processing Toolbox(图像处理工具箱,主要用于
padarray、imshow等基础函数)。
使用方法
- 将包含主脚本的文件夹设置为MATLAB的当前工作路径。
- 确保工作路径下存在名为
peppers.png 的示例图片(MATLAB通常内置,若无则系统会自动生成测试图)。 - 直接运行主脚本
main()。 - 程序运行结束后,控制台将输出去噪前后的PSNR和SSIM数值,并弹出一个窗口显示对比图像。
算法实现与核心逻辑详解
本项目的核心逻辑封装在主函数及若干子函数中,以下是基于实际代码的详细实现分析:
1. 图像预处理与加噪
- 加载逻辑:程序优先尝试读取指定文件名的外部图像;如果读取失败(例如文件缺失),则自动生成一个正弦波纹理的合成图像(棋盘格变体)并转为RGB格式,确保程序在任何环境下均可运行。
- 归一化:将图像数据转换为双精度浮点型(
double),并将像素值范围归一化到 [0, 1] 之间,便于后续的科学计算。 - 噪声注入:根据设定的标准差参数(
sigma,默认为25),生成符合正态分布的高斯随机噪声并叠加到原图中,最后通过截断操作保证像素值不溢出 [0, 1] 范围。
2. 快速NLM算法实现 (nlm_filter_fast)
这是本项目的核心部分,采用了
积分图/块平移加速的策略,其实现逻辑如下:
- 边界填充:为了处理图像边缘的搜索问题,首先对输入图像进行了对称填充(Symmetric Padding)。
- 避免逐像素循环:代码没有对每个像素点进行独立的邻域搜索(这在MATLAB中极慢),而是遍历搜索窗口内的所有可能位移向量
(dx, dy)。 - 整体平移计算:
1.
平移与差分:对于每一个位移
(dx, dy),将整张图像进行平移,计算原图与平移后图像的像素级差值平方。
2.
块距离聚合:通过二维卷积(
conv2,使用全1均值核)计算每个像素周围邻域块(Patch)的欧氏距离。这一步相当于一次性计算了所有像素点与其在当前位移下的邻域块相似度。
3.
权重计算:利用高斯核函数将距离转换为权重:
w = exp(-max(d - 2h^2, 0) / h^2)。
4.
图像重构:累加加权后的平移图像,并同步累加权重值。
- 归一化:遍历结束后,将累加的图像值除以总权重图,得到最终的去噪结果。
3. 图像质量评价 (calculate_psnr & calculate_ssim)
- 数据转换:在计算指标前,将浮点型数据重新映射回
uint8 (0-255) 格式,符合通用的图像评价标准。 - PSNR (峰值信噪比):计算参考图像与失真图像之间的均方误差(MSE),进而导出对数分贝值,数值越高代表失真越小。
- SSIM (结构相似性):
* 代码实现了一个简化的SSIM计算器。
* 首先将图像转为灰度图(基于亮度公式)。
* 利用高斯加权窗口计算图像局部的均值、方差和协方差。
* 根据亮度、对比度和结构分量公式计算全图的平均SSIM指数,数值越接近1代表结构保存越好。
4. 结果可视化
- 创建 2x2 的图表布局。
- 残差图增强:为了让人眼更容易观察到被算法去除的噪声成分,系统计算了噪声图像与去噪图像的差值绝对值,并将其亮度放大了3倍(
residual * 3)进行伪彩色显示。
关键参数说明
在代码头部区域,用户可以调整以下关键参数以改变算法行为:
sigma:高斯噪声的标准差(基于0-255尺度),值越大噪声越强。search_window:搜索窗口半径 t。算法会在 (2t+1) x (2t+1) 的范围内寻找相似块。该值越大计算越慢,但去噪潜力越大。patch_window:图像块半径 f。用于比较相似度的图块大小为 (2f+1) x (2f+1)。h_param:滤波平滑参数。通常与噪声强度成正比(代码中设为 10 * sigma)。该值决定了权重的衰减速度,值过大导致图像模糊,值过小则去噪不彻底。