图像降噪算法:中值滤波算法及MATLAB实现

目录

一.中值滤波

理论依据

排序方式的选择

三步并行法:

二.MATLAB实现


一.中值滤波

同前面所讲的均值滤波相类似,中值滤波也是取当前像素点周围的N x N窗口,取这些值的中值作为当前像素经过滤波后的值。

理论依据

因为邻域的像素具有一定的连续性以及相似性,如果某个像素被添加了噪声,那么这个值一定会偏离原值,在所选取的窗口中呈现异常。将所选取的窗口像素进行排序,这个被添加了噪声的值就会偏大或者偏小,那么选取中值作为滤波后的值就能有效地过滤噪声。

中值滤波示例如下:

(红色为添加噪声像素)

排序方式的选择

这里不选择冒泡排序法,选择并行三步中值法是为了方便此算法用于FPGA中。如果在FPGA中选择冒泡排序法,会浪费很多不必要的时间(具体原因可以查看《基于MATLAB与FPGA的图像数据处理教程》)。

三步并行法

1.首先求出每行的最大值max1,max2,max3,最小值min1,min2,min3和中值mid1,mid2,mid3;

2.然后求这些最大值中的最小值max_min,最小值中的最大值min_max,中值中的中值mid_mid;

3.最后求max_min,min_max,mid_mid中的中值。

二.MATLAB实现

这里以3X3的窗口大小为例,在椒盐噪声下,实现均值滤波(边缘不做处理,等于原值)

Matlab 复制代码
clc;
clear all;

img = imread('D:matlab file\image_med_filter\yu.bmp');
img = rgb2gray(img);

[h,w] = size(img);
n = 3; %3X3窗口
windows = zeros(n,n);

img_noise = imnoise(img,'salt & pepper',0.01);    %椒盐噪声

image = zeros(h,w);    %取出一个3X3的窗口矩阵
image1 = zeros(h,w);    %取出一个3X3的窗口矩阵
for i = 1 : h
    for j = 1 : w
        if(i<(n-1)/2+1 || i>h-(n-1)/2 || j<(n-1)/2+1 || j>w-(n-1)/2)
            image(i,j) = img_noise(i,j);
            image1(i,j) = img_noise(i,j);
        else
            windows = img_noise(i-(n-1)/2:i+(n-1)/2,j-(n-1)/2:j+(n-1)/2);
%            image(i,j) = median(median(windows(i,j)));
%            %在matlab里可以直接调用中值函数进行计算,但是为方便在FPGA中进行硬件加速的实现,这里采用3步中值法算出中值
             max1 = max(windows(1,1:3)); mid1 = median(windows(1,1:3)); min1 = min(windows(1,1:3));
             max2 = max(windows(2,1:3)); mid2 = median(windows(2,1:3)); min2 = min(windows(2,1:3));
             max3 = max(windows(3,1:3)); mid3 = median(windows(3,1:3)); min3 = min(windows(3,1:3));   
             
             max_min = min([min1,min2,min3]);
             mid_mid = median([mid1,mid2,mid3]);
             min_max = max([max1,max2,max3]);
             
             image1(i,j) = sum(sum(windows)) / (n*n);          %均值滤波
             image(i,j) = median([max_min,mid_mid,min_max]);   %中值滤波
        end
    end
end

image = uint8(image);
image1 = uint8(image1);

figure('Position', [500,400, 1600, 500]);  %设置figure的大小
subplot(1,4,1);imshow(img);title('原图');
subplot(1,4,2);imshow(img_noise);title('添加椒盐噪声');
subplot(1,4,3);imshow(image);title('中值滤波');
subplot(1,4,4);imshow(image1);title('均值滤波');

上述代码加入了均值滤波进行对比,结果如下:

可以看出,中值滤波能够有效消除椒盐噪声,而均值滤波的效果就没那么明显。

参考自《基于MATLAB与FPGA的图像处理教程》。

内容仅供学习使用,请勿转载。

如有问题,欢迎指正。

相关推荐
毕竟是shy哥6 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲6 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
拿我格子衫来7 小时前
LaserWeb4:矢量图与位图如何变成 G-code
图像处理·图形渲染
晊晌_h7 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦8 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考8 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客9 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
Dfreedom.10 小时前
目标检测后处理核心:NMS非极大值抑制详解
图像处理·人工智能·深度学习·目标检测·目标跟踪
小白羊丨12 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F13 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法