图像处理算法 | 中值滤波

前面的高斯滤波和均值滤波都是线性滤波器,在数字图像处理中,凡是算子(kernel)可以显式的写出来的滤波器,都是线性滤波器,比如高斯算子,sobel算子,拉普拉斯算子等。这种滤波器对图像的处理效果从算子上就能一眼看出来,可以这么说,每个线性算子其实就是一个线性系统,这个系统对图像中的每一个pixel都做了相同的运算。

                                           gaus\_kernel=\begin{bmatrix} 1 & 2 & 1\\ 2 & 4 & 2\\ 1 & 2 & 1 \end{bmatrix} 

                                      sobel\_kernel=\begin{bmatrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1 & 2 & 1 \end{bmatrix}

                                  laplace\_kernel=\begin{bmatrix} -1 & -1 & -1\\ -1 & 8 & -1\\ -1 & -1 & -1 \end{bmatrix}

中值滤波是特别基础的一个非线性滤波器,它是对滤波窗口内的像素排序,然后取中间的那个像素作为输出,中值滤波一般在ISP中用于去除椒盐噪声或者是孤立的坏点。

1. 算法原理

中值滤波就没有kernel了,简单的画个图,对于一个3×3的窗口,其中值滤波的结果就是窗口内9个数据排序,取中间的那个作为输出,下图中就是取45作为当前窗口的输出。

图1 中值滤波原理图

2. 图像处理效果与对比

为了测试中值滤波的效果,用matlab对Lena图添加了高斯噪声和椒盐噪声,然后用中值滤波进行降噪测试,对比效果。

虽然matlab中有自带的中值滤波器函数,但是推荐使用ordfilt2函数来实现中值滤波,这是因为在做算法开发的时候,matlab中已经写好的函数不方便修改中间过程,这个时候用更基础的函数或者自己写的代码会更方便。比如ordfilt2函数,它的功能就是对二维数组中n个非零值按照从大到小排序,然后可以指定第几个位置的元素作为输出结果。以5×5窗口为例,13就是中间位置,相关代码已附在后面。

先加入椒盐噪声,椒盐噪声是一种颗粒噪声,像胡椒面一样随机分布,因此得名“椒盐噪声”。测试的效果如下图2所示,左边为输入图像,中间为加入椒盐噪声的图像,右边为5×5中值滤波的结果。判断一个滤波器是否优秀,只要看它是否在去除噪声的同时还能保持住边界,从这个角度出发,中值滤波对椒盐噪声的降噪效果还不错,虽然图像被模糊了,但是椒盐噪声去除的很干净。

2   椒盐噪声降噪效果

接下来看一下高斯噪声的降噪效果,显示的图像如下图3所示,左边为输入图像,中间为加入椒盐噪声的图像,右边为5×5中值滤波的结果。可见,中值滤波对高斯噪声的滤波效果就没那么椒盐噪声那么好了,也起到了降噪的效果,但是噪声没滤干净。

3   高斯噪声降噪效果

从上图可以看出,中值滤波用在椒盐噪声上的效果比较好,用在高斯噪声上的效果就很一般了。在实际算法开发的过程中,会根据噪声形态选择适合的滤波器,中值滤波一般用于去除颗粒噪声,在去坏点模块中会选择使用它,而高斯噪声一般选用高斯滤波或者双边滤波来降噪。

附录:

clc;
close all;

fileName      = 'lena';
fmat          = '.bmp';

input_raw     = imread([fileName, fmat]);
% [m,n,k]       = size(input_raw);
src           = double(input_raw)/256;
[m,n,k]       = size(src);
% figure,imshow(src),title('src');


%% 椒盐噪声
src_noise  = imnoise(src, 'salt & pepper', 0.05); % 加入椒盐噪声

% 实现中值滤波的时候使用ordfilt2函数,这个函数统计二维数组中n个非零数值按大到小排序
% 后处于第k个位置的元素作为滤波器的输出
med(:,:,1) = ordfilt2(src_noise(:,:,1),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,2) = ordfilt2(src_noise(:,:,2),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,3) = ordfilt2(src_noise(:,:,3),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);

figure,imshow([src,src_noise,med]);
% imwrite([src,src_noise,med],'median_salt.jpg');

%% 高斯噪声
src_noise  = imnoise(src, 'gaussian', 0, 0.01); % 加入高斯噪声

% 中值滤波
med(:,:,1) = ordfilt2(src_noise(:,:,1),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,2) = ordfilt2(src_noise(:,:,2),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);
med(:,:,3) = ordfilt2(src_noise(:,:,3),13,[1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;1,1,1,1,1]);

figure,imshow([src,src_noise,med]);
% imwrite([src,src_noise,med],'median_gaus.jpg');



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大凝的IC进阶之路

一起学习一起进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值