图像降噪处理——(中值、均值、最大值、最小值滤波)

用MATLAB对图像进行处理。微笑

在原图上添加椒盐噪声,运用中值滤波、最大值滤波和最小值滤波算法对图像降噪,并比较处理前后、不同模板均值滤波算法处理的效果。

一、基本原理

1.1 噪声的产生及分类

         噪声是图像干扰的重要原因。一幅图像在实际应用中可能存在各种各样的噪声,这些噪声可能在传输中产生,也可能在量化等处理中产生。根据噪声和信号的关系可将其分为三种形式:(f(x,y)表示给定原始图像,g(x,y)表示图像信号,n(x,y)表示噪声。)
1) 加性噪声,此类噪声与输入图像信号无关,含噪图像可表示为f(x,y)=g(x,y)+n(x,y),信道噪声及光导摄像管的摄像机扫描图像时产生的噪声就属这类噪声;
2) 乘性噪声,此类噪声与图像信号有关,含噪图像可表示为f(x,y)=g(x,y)+n(x,y)g(x,y),飞点扫描器扫描图像时的噪声,电视图像中的相干噪声,胶片中的颗粒噪声就属于此类噪声。
3) 量化噪声,此类噪声与输入图像信号无关,是量化过程存在量化误差,再反映到接收端而产生。

1.2 椒盐噪声

    椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。
去除脉冲干扰及椒盐噪声最常用的算法是中值滤波。
    路面图像属于结构光图像,使用区域分割技术中的阈值分割法消除白噪声及部分椒盐噪声,而不能使用中值滤波对白噪声及椒盐噪声进行滤波,因为滤 波模板在图像中漫游时会改变光条中像素的真实灰度分布,给随后的重心法细化过程带来负面影响。
    大量的实验研究发现,由摄像机拍摄得到的图像受离散的脉冲、椒盐噪声和零均值的高斯噪声的影响较严重。噪声给图像处理带来很多困难,对图像分割、特征提取、图像识别等具有直接影响。因此,实时采集的图像需进行滤波处理。消除图像中的噪声成份叫做图像的平滑化或滤波操作。滤波的目的有两个:一是抽出对象的特征作为图像识别的特征模式;二是为适应计算机处理的要求,消除图像数字化时所混入的噪声。对滤波处理的要求有两条:一是不能损坏图像轮廓及边缘等重要信息;二是使图像清晰,视觉效果好。
     椒盐噪声是指两种噪声,一种是盐噪声(salt noise),另一种是胡椒噪声(pepper noise)。盐=白色,椒=黑色。前者是高灰度噪声,后者属于低灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。

1.3 中值滤波

     中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。但在条纹中心分析方法中作用不大。

1.3.1 实现方法

(1)通过从图像中的某个采样窗口取出奇数个数据进行排序;
(2)用排序后的中值取代要处理的数据即可。

1.3.2 实际应用

中值滤波法对消除椒盐噪声非常有效,在光学测量条纹图象的相位分析处理方法中有特殊作用,但在条纹中心分析方法中作用不大。
中值滤波在图像处理中,常用于保护边缘信息,是经典的平滑噪声的方法。

1.4 最大值、最小值滤波

          最大值、最小值滤波与中值滤波相类似,先是排序像素值,而后对中心像素值和最大、最小像素值进行比较。若比最小值小,则将最小值替换成中心像素;同样若比最大值大,则将最大值替换成中心像素。
若设输出的图像为g(x,y)
最大值滤波:g(x,y)max{f(x s,y t),(s,t W)};
最小值滤波:g(x,y) min{f(x s,y t),(s,t W)}。

1.5 均值滤波

      均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标象素为中心的周围n个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

1.5.1 概述

          均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度个g(x,y),即个g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。

1.5.2 不足之处

           均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在 图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。

二、结果图对比

上图显示了被概率为0.05的椒盐噪声污染了的图像,可以看出,图像上呈现出了黑白杂点,其中黑点是胡椒噪声产生的,白点是由盐噪声所产生。



均值滤波器简单的平滑了一幅图像的的局部变化,在模糊了图像的同时减少了噪声,但不能完全的消除噪声。

中值滤波器将受干扰的像素值替换为模板区域的中值,同时它可以保护图像尖锐的边缘,且比相同尺寸的线性平滑滤波器引起的模糊更少,消除脉冲噪声的效果较好。


利用最大值滤波器对胡椒噪声进行处理,成功消除了胡椒噪声,但应注意到,它同时也从黑色物体的边缘移走了一些黑色像素

利用最小值滤波器对盐噪声进行处理,在这种情况下,最小值滤波器比最大值滤波器效果更好,但它也从亮物体边缘移走了一些白色像素,使亮物体变小,暗物体变大,这是因为围绕着这些物体的白点被设置成了暗灰度级。

3*3邻域模板到8*8邻域模板,随着模板的增大,需要计算的数据量也更大,滤波的效果越来越平滑,图像更加模糊,对比而言,通过3*3邻域模板做均值滤波处理后,不仅计算的数据量少,而且图像清晰。

三、程序

I=imread('C:\Users\Administrator\Desktop\55.jpg');
G=rgb2gray(I);
J = imnoise(G,'salt & pepper',0.05);
J1= imnoise(G,'salt & pepper',0.05);
J2= imnoise(G,'salt & pepper',0.05);
[M,N]=size(J);
for i=1:M
for j=1:N
if(J1(i,j)==255)
J1(i,j)=0;
else
J1(i,j)=J1(i,j);
end
end
end
for i=1:M
for j=1:N
if(J2(i,j)==0)
J2(i,j)=255;
else
J2(i,j)=J2(i,j);
end
end
end
A= meshgrid(1:3, 1:3);
A1= meshgrid(1:5, 1:5);
A2= meshgrid(1:8, 1:8);
figure(1)
subplot(221);imshow(G);title('原始灰度图像');
subplot(222);imshow(J);title('添加椒盐噪声图像');
subplot(223);imshow(J1);title('添加胡椒噪声图像');
subplot(224);imshow(J2);title('添加盐噪声图像');
4.2.4 用不同滤波器对图像进行滤波
figure(2)
subplot(121);sortfilter(J,A,'mid');title('3x3邻域窗的中值滤波图像');
subplot(122);sortfilter(J,A,'mea');title('3x3邻域窗的均值滤波图像');
figure(3)
subplot(121);sortfilter(J1,A,'max');title('3x3邻域窗的最大值滤波图像');
subplot(122);sortfilter(J2,A,'min');title('3x3邻域窗的最小值滤波图像');
figure(4)
subplot(131);sortfilter(J,A,'mea');title('3x3均值滤波图像');
subplot(132);sortfilter(J,A1,'mea');title('5x5均值滤波图像');
subplot(133);sortfilter(J,A2,'mea');title('8x8均值滤波图像');
function vertex = Matrix2Vertex(matrix)[row, col] = size(matrix);vertex = zeros(row * col, 1);for i = 1 : row * colvertex(i) = matrix(i);endend
滤波器函数
function f = sortfilter(impath,A,para)
%该函数的作用是统计的排序滤波,包括中值滤波,最小值滤波,最大值滤波。
%参数impath为图像的路径
%A为模块儿矩阵,此时,只与此矩阵的大小有关,与元素无关。
%para参数用于选择排序滤波的方式,最小,中间,最大的三个英文首字母分别表示最小滤波,中值滤波,最大滤波。
input=impath;  [row,col]=size(input);%返回矩阵的行和列。[m,n]=size(A);%返回模板的行和列分别存于m,n中。edgeLength=floor(m/2);%模板的半长edgeWidth=floor(n/2);%模板的半高image=zeros(row+2*edgeLength,col+2*edgeWidth);%将矩阵扩充2edgeLength行,2edgewidth列,填充元素为0,并存于image中for i=1:1:rowfor j=1:1:colimage(i+edgeLength,j+edgeWidth)=input(i,j);endendoutput=input;%将output输出矩阵初始化%最小值滤波for i=1+edgeLength:1:row-edgeLengthfor j=1+edgeWidth:1:col-edgeWidthmask=image(i-edgeLength:i+edgeLength,j-edgeWidth:j+edgeWidth);%在扩充的矩阵中以image(i,k)为中心取与模块A大小相同的矩阵vertex=Matrix2Vertex(mask);%将矩阵转换成行向量[vertex2,~]=sort(vertex);%对行向量进行排序,返回到vertex2矩阵中meanvule=mean(nonzeros(vertex));if para=='min'    output(i-edgeLength,j-edgeWidth)=vertex2(1);%将对应元素最小值输出到output矩阵的相应位中。elseif para=='mid'output(i-edgeLength,j-edgeWidth)=vertex2(floor(m*n/2)+1);%将对应元素中间值输出到output矩阵的相应位中。elseif  para=='max'output(i-edgeLength,j-edgeWidth)=vertex2(m*n);%将对应元素最大值输出到output矩阵的相应位中。elseif  para=='mea' output(i-edgeLength,j-edgeWidth)= meanvule;endendendimshow(output);
end


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部