中值滤波原理及MATLAB实现.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中值滤波原理及MATLAB实现

摘要:图像是一种重要的信息源,通过图像处理可以帮助人们了解信息的内涵。本文将纯净的图像加入椒盐噪声,然后采用中值滤波的方法对其进行去噪。中值滤波是一种常用的非线性信号处理技术,在图像处理中,它对滤除脉冲干扰噪声最为有效。文章阐述了中值滤波的原理、算法以及在图像处理中的应用。MATLAB是一种高效的工程计算语言,在数据处理、图像处理、神经网络、小波分析等方面都有广泛的应用。

关键词:图像,中值滤波,去噪,MATLAB

1. 引言

20世纪20年代,图像处理首次得到应用。上个世纪60年代中期,随着计算机科学的发展和计算机的普及,图像处理得到广泛的应用。60年代末期,图像处理技术不断完善,逐渐成为一个新兴的学科。图像处理中输入的是质量低的图像,输出的是改善质量后的图像。

为了改善图像质量,从图像中提取有效信息,必须对图像进行去噪预处理。根据噪声频谱分布的规律和统计特征以及图像的特点,出现了多种多样的去噪方法。经典的去噪方法有:空域合成法,频域合成法和最优合成法等,与之适应的出现了许多应用方法,如均值滤波器,中值滤波器,低通滤波器,维纳滤波器,最小失真法等。这些方法的广泛应用,促进数字信号处理的极大发展,显著提高了图像质量。

2. 中值滤波

在图像滤波中,常用的方法是线性滤波技术和非线性滤波技术,线性滤波以其完美的理论基础,数学处理简单、易于采用和硬件实现等优点,一直在图像滤波领域中占有重要的地位。线性滤波对加性高斯噪声有较好的平滑作用,但对脉冲信号和其它形式的高频分量抑制效果较差,且模糊信号边缘。非线性滤波是基于对输入信号序列的一种非线性投影关系,常把某一特定的噪声近似为零而保留信号的重要特征,一定程度上克服线性滤波器的不足,非线性滤波早期运用较多的是中值滤波器,其应用于多维信号处理时,对窄脉冲信号具有良好的抑制能力,但

中值滤波器对中拖尾(如均匀分布噪声)和短拖尾分布噪声(如高斯噪声),滤波性能较差,且拖尾越短,其滤波能力越差。

中值滤波是一种典型的低通滤波器,属于非线性滤波技术,它的目的是保护图像边缘的同时去除噪声。所谓中值滤波,是指把以某点

(x,y)为中心的小窗口内的所有象素的灰度按从大到小的顺序排列,若窗口中的象素为奇数个,则将中间值作为(x,y)处的灰度值。若窗口中的象素为偶数个,则取两个中间值的平均值作为(x,y)处的灰度值。中值滤波对去除椒盐噪声很有效。中值滤波器的缺点是对所有象素点采用一致的处理,在滤除噪声的同时有可能改变真正象素点的值,引入误差,损坏图像的边缘和细节。该算法对高斯噪声和均匀分布噪声就束手无策。

2.1中值滤波基本原理

中值滤波是一种非线性滤波,由于它在实际运算过程中并不需要图像的统计特性,所以比较方便。中值滤波首先是被应用在一维信号处理技术中,后来被二维图像信号处理技术所应用。在一定的条件下,可以克服线性滤波器所带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声最为有效。但是对一些细节多,特别是点、线、尖顶细节多的图像不宜采用中值滤波的方法。

中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替。

设有一个一维序列,,…,,取窗口长度为m(m为奇数),对此序列进行中值滤波,就是从输入序列中相继抽出m个数,,…,,…,,…,,…,,其中为窗口的中心位置,,再将这m个点按其数值大小排列,取其序号为正中间的那作为输出。用数学公式表示为:

(2-2)

例如:有一个序列为{0,3,4,0,7},则中值滤波为重新排序后的序列{0,0,3,4,7}中间的值为3。此例若用平均滤波,窗口也是取5,那么平均滤波输出为。因此平均滤波的一般输出为:

(2-3)

对于二维序列进行中值滤波时,滤波窗口也是二维的,但这种二维窗口可以有各种不同的形状,如线状、方形、圆形、十字形、圆环形等。二维数据的中值滤波可以表示为: (2-4)

在实际使用窗口时,窗口的尺寸一般先用再取逐渐增大,直到其滤波效果满意为止。对于有缓变的较长轮廓线物体的图像,采用方形或圆形窗口为宜,对于包含尖顶角物体的图像,适宜用十字形窗口。使用二维中值滤波最值得注意的是保持图像中有效的细线状物体。与平均滤波器相比,中值滤波器从总体上来说,能够较好地保留原图像中的跃变部分。

2.2 中值滤波的去噪过程

本文给定的图像为二维信号,在信号中加入指定的椒盐噪声,然后利用中值滤波进行去噪。虽然有关中值滤波的函数是在matlab函数库中已经提供,但在图像处理中利用中值滤波去除图像中的椒盐噪声噪声却是一种有效的方法,利用中值滤波函数去除图像中的噪声过程如下:(1)使用imread()读入原始的彩色图像。

(2)因为使用中值滤波器只能对灰度图像进行处理,所以利用

rgb2gray()将彩色图像转化为灰度图像。

(3)用imnoise()在灰度图像中加入椒盐噪声。

(4)利用medfilt2()函数进行中值滤波,并在matlab环境下运行。

相应的MATLAB主程序如下:

clc;

clear all;

close all;

img=imread('3_1.bmp');

img_0=rgb2gray(img);

img_1=imnoise(img_0,'salt & pepper',0.02);

img_2=medfilt2(img_1);

subplot(2,2,1);imshow(img);title('原始图像');

subplot(2,2,2);imshow(img_0);title('灰度图像');

subplot(2,2,3);imshow(img_1);title('加入噪声后图像');

subplot(2,2,4);imshow(img_2);title('中值滤波后图像'); MatLab自编的均值滤波、中值滤波、高斯滤波图像处理函数。

%自编的均值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)

function d=avefilt(x,n)

a(1:n,1:n)=1; %a即n×n模板,元素全是1

p=size(x); %输入图像是p×q的,且p>n,q>n

x1=double(x);

x2=x1;

%A(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素

for i=1:p(1)-n+1

for j=1:p(2)-n+1

c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘

s=sum(sum(c)); %求c矩阵(即模板)中各元素之和

x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %将模板各元素的均值赋给模板中心位置的元素 end

end

%未被赋值的元素取原值

d=uint8(x2);

%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)

function d=midfilt(x,n)

p=size(x); %输入图像是p×q的,且p>n,q>n

x1=double(x);

x2=x1;

for i=1:p(1)-n+1

for j=1:p(2)-n+1

c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的) e=c(1,:); %是c矩阵的第一行

for u=2:n

e=[e,c(u,:)]; %将c矩阵变为一个行矩阵

end

mm=median(e); %mm是中值

x2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素

相关文档
最新文档