基于 MATLAB 图像处理的中值滤波器、均值滤波器和高斯滤波器的实现与比较
基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比
作者:lee神
1. 背景知识
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
2 |
4 |
8 |
||
1 |
3 |
9 |
||
5 |
7 |
6 |
||
g(x,y)=med{f(x-k,y-l),(k,l∈W)}
g =med[2,4,8;1,3,9;5,7,6] = 5
中值滤波后的结果:
5 |
||||
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
2 |
4 |
8 |
||
1 |
3 |
9 |
||
5 |
7 |
6 |
||
g(x,y)=1/m ∑f(x,y)
g = (1/8)*(2+4+8+1+9+5+7+6)= 5
均值滤波后的结果:
5 |
||||
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
2. MATLAB实现
源码:
%%-------------------------------------------------------------------------------------------
%% 2018/01/03
%% lee
%% 137194782@qq.com
%% 微信公众号:FPGA开源工作室
%%--------------------------------------------------------------------------------------------
clear all;
clc;
M = imread('timg.jpg'); %读取MATLAB中的名为timg的图像
figure,imshow(M); %显示原始图像
title('original');
gray = rgb2gray(M);
figure,imshow(gray); %显示灰度图像
title('gray');
P1 = imnoise(gray,'gaussian',0.02); %加入高斯躁声
figure,imshow(P1); %加入高斯躁声后显示图像
title('gaussiannoise');
P2 = imnoise(gray,'salt& pepper',0.02); %加入椒盐躁声
figure,imshow(P2); %加入椒盐躁声后显示图像
title('salt& pepper noise');
g = medfilt2(P1); %对高斯躁声中值滤波
figure,imshow(g);
title('medfiltergaussian');
h = medfilt2(P2); %对椒盐躁声中值滤波
figure,imshow(h);
title('medfiltersalt & pepper noise');
a=[1 1 1 %对高斯躁声算术均值滤波
1 11
1 11];
l=1/9*a;
k = conv2(double(P1),double(l));
figure,imshow(k,[]);
title('arithmeticfiltergaussian');
d = conv2(double(P2),double(l)); %对椒盐躁声算术均值滤波
figure,imshow(d,[]);
title('arithmeticfiltersalt & pepper noise');
sigma=8;%标准差大小
window=double(uint8(3*sigma)*2+1);%窗口大小一半为3*sigma
H=fspecial('gaussian',window, sigma);%fspecial('gaussian',hsize, sigma)产生滤波模板
img_gauss=imfilter(P1,H,'replicate'); %为了不出现黑边,使用参数'replicate'(输入图像的外部边界通过复制内部边界的值来扩展)
figure, imshow(img_gauss);
title('gaussianfilting gauss noise');
img_salt=imfilter(P2,H,'replicate');
figure, imshow(img_salt);
title('gaussianfilting salt pepper noise');
结果展示:
原始图像
灰度图像
加入高斯噪声的灰度图像
加入椒盐噪声的灰度图像
经过中值滤波后的高斯噪声灰度图像
经过中值滤波后的椒盐噪声灰度图像
经过均值滤波的高斯噪声灰度图像
经过均值滤波的椒盐噪声灰度图像
经过高斯滤波的高斯噪声灰度图像
经过高斯滤波的椒盐噪声的灰度图像
结果分析:图像经过中值滤波后,高斯噪声没有被完全去除,椒盐噪声几乎被完全去除效果较好。经过均值滤波后不管是高斯噪声还是椒盐噪声大部分都没有被去除,只是稍微模糊化。经过高斯滤波后,高斯噪声和椒盐噪声几乎被很大程度的模糊化,原图好像被加上了一层蒙版。
上一篇: MathJax 教程
下一篇: 微分的应用科学与工程中的广泛应用
推荐阅读
-
基于 MATLAB 图像处理的中值滤波器、均值滤波器和高斯滤波器的实现与比较
-
基于 MATLAB 的数字信号处理(4) IIR 数字滤波器设计与软件实现
-
计算机视觉中,究竟有哪些好用的目标跟踪算法(下)-快速变形主要因为CF是模板类方法。容易跟丢这个比较好理解,前面分析了相关滤波是模板类方法,如果目标快速变形,那基于HOG的梯度模板肯定就跟不上了,如果快速变色,那基于CN的颜色模板肯定也就跟不上了。这个还和模型更新策略与更新速度有关,固定学习率的线性加权更新,如果学习率太大,部分或短暂遮挡和任何检测不准确,模型就会学习到背景信息,积累到一定程度模型跟着背景私奔了,一去不复返。如果学习率太小,目标已经变形了而模板还是那个模板,就会变得不认识目标。(举个例子,多年不见的同学,你很可能就认不出了,而经常见面的同学,即使变化很大你也认识,因为常见的同学在你大脑里面的模型在持续更新,而多年不见就是很久不更新) 快速运动主要是边界效应(Boundary Effets),而且边界效应产生的错误样本会造成分类器判别力不够强,下面分训练阶段和检测阶段分别讨论。 训练阶段,合成样本降低了判别能力。如果不加余弦窗,那么移位样本是长这样的: 除了那个最原始样本,其他样本都是“合成”的,100*100的图像块,只有1/10000的样本是真实的,这样的样本集根本不能拿来训练。如果加了余弦窗,由于图像边缘像素值都是0,循环移位过程中只要目标保持完整那这个样本就是合理的,只有目标中心接近边缘时,目标跨越边界的那些样本是错误的,这样虽不真实但合理的样本数量增加到了大约2/3(padding= 1),即使这样仍然有1/3(3000/10000)的样本是不合理的,这些样本会降低分类器的判别能力。再者,加余弦窗也不是“免费的”,余弦窗将图像块的边缘区域像素全部变成0,大量过滤掉分类器本来非常需要学习的背景信息,原本训练时判别器能看到的背景信息就非常有限,我们还加了个余弦窗挡住了背景,这样进一步降低了分类器的判别力(是不是上帝在我前遮住了帘。不是上帝,是余弦窗)。 检测阶段,相关滤波对快速运动的目标检测比较乏力。相关滤波训练的图像块和检测的图像块大小必须是一样的,这就是说你训练了一个100*100的滤波器,那你也只能检测100*100的区域,如果打算通过加更大的padding来扩展检测区域,那样除了扩展了复杂度,并不会有什么好处。目标运动可能是目标自身移动,或摄像机移动,按照目标在检测区域的位置分四种情况来看: 如果目标在中心附近,检测准确且成功。 如果目标移动到了边界附近但还没有出边界,加了余弦窗以后,部分目标像素会被过滤掉,这时候就没法保证这里的响应是全局最大的,而且,这时候的检测样本和训练过程中的那些不合理样本很像,所以很可能会失败。 如果目标的一部分已经移出了这个区域,而我们还要加余弦窗,很可能就过滤掉了仅存的目标像素,检测失败。 如果整个目标已经位移出了这个区域,那肯定就检测失败了。 以上就是边界效应(Boundary Effets),推荐两个主流的解决边界效应的方法,但速度比较慢,并不推荐用于实时场合。