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

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

如有问题,欢迎指正。

相关推荐
1104.北光c°1 小时前
滑动窗口HotKey探测机制:让你的缓存TTL更智能
java·开发语言·笔记·程序人生·算法·滑动窗口·hotkey
仰泳的熊猫5 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码8 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发8 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre9 小时前
22 括号生成
算法·深度优先
努力也学不会java10 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎10 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan11 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业11 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机