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

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

如有问题,欢迎指正。

相关推荐
倦王2 分钟前
力扣日刷47
算法·leetcode·职场和发展
MicroTech20254 分钟前
突破量子数据加载瓶颈,MLGO微算法科技推出面向大规模量子计算的分治态制备技术
科技·算法·量子计算
码王吴彦祖6 分钟前
顶象 AC 纯算法迁移实战:从补环境到纯算的完整拆解
java·前端·算法
SccTsAxR11 分钟前
算法基石:手撕离散化、递归与分治
c++·经验分享·笔记·算法
yu859395811 分钟前
matlab雷达信号与干扰的仿真
开发语言·matlab
wuweijianlove12 分钟前
算法测试中的数据规模与时间复杂度匹配的技术4
算法
Q741_14736 分钟前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
The_Ticker37 分钟前
印度股票实时行情API(低成本方案)
python·websocket·算法·金融·区块链
夏乌_Wx41 分钟前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
AI成长日志1 小时前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试