【MATLAB例程,图像滤波降噪12】加权中值滑动窗口滤波(WMF)图像降噪,包含滤波质量评价。附代码下载链接

原创代码,欢迎交流,但请勿翻卖

非AI生成,有中文注释,可联系我获取代码定制。讲解等

文章目录

面向图像局部噪声抑制与细节保持问题,独立实现加权中值滑动窗口滤波(WMF)。程序为窗口不同位置赋予整数权重,将对应灰度值按权重重复后取中值,使中心与近邻具有更强影响,同时保持对椒盐脉冲的鲁棒性。程序采用单个 .m 文件组织,仅使用基础MATLAB,自行生成测试图像、椒盐脉冲噪声、边界扩展、滤波计算和质量指标,关键步骤配有中文注释,适合图像处理课程实验、算法原理学习、参数调试和二次开发。

运行结果

  • 原始与含噪图像图:对比包含渐变、纹理、几何边缘和细线结构的原始测试图像与椒盐脉冲噪声图像。

  • 滤波结果与误差图:展示加权中值滑动窗口滤波(WMF)输出及其相对原始图像的绝对误差。

  • 边缘剖面与质量指标图:对比典型行灰度剖面,并给出滤波前后的PSNR、局部SSIM和边缘保持指标。

  • 命令行输出:直接输出图像与窗口尺寸、噪声类型、MSE、PSNR、局部SSIM、边缘指标、提升量、运行时间及有效值检查结果。

    程序结构:

MATLAB源代码

部分代码如下:

matlab 复制代码
%% 加权中值滑动窗口滤波(WMF)图像处理例程
% 作者:matlabfilter(V同号),接定位与导航、滤波相关的matlab代码定制
% 2026-08-27/Ver1

clc; clear; close all;
rng(0);

%% 参数设置与测试图像
cfg.imageSize = 128;
cfg.windowSize = 3;
cfg.noiseDescription = '椒盐脉冲噪声';
cfg.impulseDensity = 0.070;
originalImage = generateTestImage(cfg.imageSize);

%% 添加与算法场景匹配的噪声
noisyImage = originalImage;
impulseMask = rand(size(originalImage));
noisyImage(impulseMask < cfg.impulseDensity / 2) = 0;
noisyImage(impulseMask >= cfg.impulseDensity / 2 & impulseMask < cfg.impulseDensity) = 1;

%% 执行加权中值滑动窗口滤波(WMF)
tic;
[filteredImage, diagnosticData] = applyCurrentFilter(noisyImage, cfg);
elapsedTime = toc;
filteredImage = clipImage(filteredImage);

assert(isequal(size(filteredImage), size(originalImage)), '滤波结果尺寸与输入不一致。');
assert(all(isfinite(filteredImage(:))), '滤波结果包含NaN或Inf。');
assert(all(filteredImage(:) >= 0 & filteredImage(:) <= 1), '滤波结果超出[0,1]范围。');

%% 手工计算图像质量指标
noisyMetrics = evaluateImageQuality(originalImage, noisyImage);
filteredMetrics = evaluateImageQuality(originalImage, filteredImage);
printResults(cfg, noisyMetrics, filteredMetrics, elapsedTime);

%% 绘图:图窗保持纯净,源码不保存图片或添加水印
plotOriginalAndNoisy(originalImage, noisyImage, cfg);
plotFilteredAndError(originalImage, filteredImage);
plotProfileAndMetrics(originalImage, noisyImage, filteredImage, ...
    noisyMetrics, filteredMetrics);


%% 本地函数
function [filteredImage, diagnosticData] = applyCurrentFilter(noisyImage, cfg)
radius = floor(cfg.windowSize / 2);
padded = reflectPad(noisyImage, radius, radius);
filteredImage = zeros(size(noisyImage));
integerWeight = [1, 2, 1; 2, 4, 2; 1, 2, 1];
for row = 1:size(noisyImage, 1)
    for column = 1:size(noisyImage, 2)
        region = padded(row:row + 2 * radius, column:column + 2 * radius);
        expandedValues = zeros(sum(integerWeight(:)), 1);
        position = 1;
        for index = 1:numel(region)
            count = integerWeight(index);
            expandedValues(position:position + count - 1) = region(index);
            position = position + count;
        end
        filteredImage(row, column) = median(expandedValues);
    end
end
diagnosticData = [];
end

完整代码下载链接:

如需帮助,或有导航、定位滤波相关的代码定制需求,可从个人主页左侧联系我

相关推荐
Tairitsu_H1 小时前
[C++] C++11类和STL的新特性
开发语言·c++·stl·c++11
智行合一科技1 小时前
肖利华博士受邀参加第九届OTC品牌与科普宣传月暨全民健康嘉年华启动大会
人工智能
承渊政道1 小时前
Python IDLE鸿蒙PC适配全记录:从Tkinter桌面程序到ArkUI原生开发闭环
开发语言·python·harmonyos·鸿蒙系统·桌面程序
七灵微1 小时前
【AI】代码实战- 基于时间序列的轴承检测1
人工智能·机器学习·ai·pandas·matplotlib
OFIRM碳基硅基1 小时前
西游金蝉劫 IP · 之 《金蝉子前传渡缘劫》电影 20 亿票房触发 · 项目专项扶持协议 总览 拉格朗日光影动画-西游金蝉劫项目组
大数据·人工智能·西游金蝉劫·蝎子精·蝎子精女妖王·金蝉子前传渡缘劫
YMWM_2 小时前
查看realsense相机序列号脚本
开发语言·python·数码相机
银空飞羽2 小时前
职型求职工具实测:把简历分析、岗位匹配和定向优化串成一条求职链路
人工智能·经验分享·面试·职场和发展·跳槽·求职招聘·创业创新
ChaITSimpleLove2 小时前
AI时代 “本体” 的 “标准化” 定义
人工智能·dsl·rdf·ontology·ai本体·json-ld
FL16238631292 小时前
基于YOLOv8的智慧校园人脸识别和公路汽车检测项目源码+训练好的模型
人工智能