图像降噪算法:中值滤波算法及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的图像处理教程》。

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

如有问题,欢迎指正。

相关推荐
知乎的哥廷根数学学派1 小时前
基于多分辨率注意力脉冲神经网络的机械振动信号故障诊断算法(西储大学轴承数据,Pytorch)
人工智能·pytorch·深度学习·神经网络·算法·机器学习
kebijuelun2 小时前
Qwen 团队提出 ArenaRL:面向开放式 Agent RL 任务
人工智能·算法·语言模型·transformer
机器学习之心2 小时前
PSO优化的K-means++聚类算法用于用户用电行为分析的实现方案
算法·kmeans·聚类
小黄鸭code2 小时前
C++ 算法笔试题(常见算法版)
c++·算法·排序算法
lixinnnn.2 小时前
优先级队列:最小函数值
数据结构·算法
Xの哲學2 小时前
Linux Worklet 深入剖析: 轻量级延迟执行机制
linux·服务器·网络·数据结构·算法
666HZ6662 小时前
数据结构2.1 线性表习题
c语言·数据结构·算法
lihao lihao2 小时前
C++ set和map
开发语言·c++·算法
学嵌入式的小杨同学2 小时前
顺序表(SqList)完整解析与实现(数据结构专栏版)
c++·算法·unity·游戏引擎·代理模式