中值滤波 - 图文

更新时间:2024-04-26 02:51:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学号:专业:

字 图 像 处 理

姓名:XXXXXXXXXX

XXXXXXXXXXXXXXXX XX

非线性平滑——中值滤波

一. 实验目的

1. 了解统计排序滤波器在数字图象处理中的作用; 2. 理解中值滤波的原理、特点、适用对象; 3. 掌握中值滤波的各种方法。

二. 实验原理

中值滤波是一种非线性信号处理方法,与其对应的中值滤波器是一种统计排序滤波器,用象素邻域内各灰度级排序的中值来代替该象素的灰度级(用一个奇数点的移动窗口,将窗口中心点的值用窗口内的中值代替),一定条件下,可以克服线性滤波器(如邻域平滑滤波等)所带来的图象细节模糊,而且对滤除脉冲干扰及图象扫描噪声最为有效(中值滤波的输出与输入噪声的密度分布有关,对随机噪声的抑制能力,中值滤波比平均值滤波要差一些;但对脉冲干扰,特别是脉冲宽度小于窗口一半、相距较远的窄脉冲干扰,中值滤波的效果较好)。

设有一个一维序列f1, f2, …, fn,取窗口长度(点数)为m(m为奇数),对其进行中值滤波,就是从输入序列中相继抽出m个数fi-v, …, fi-1, fi, fi+1, …, fi+v(其中fi为窗口中心点值,v=(m-1)/2),再将这m个点按其数值大小排序,取其序号为中心点的那个数作为滤波输出。用数学公式表示为:

yi?Med{fi?v,?,fi,?fi?v}m?1i?N,v?(4—1)

2这样处理的特点是:周期小于m/2(窗口一半)的脉冲会被抑制,而周期大于m/2(窗口一半)

的脉冲得到保留,在窗口内单调增加或单调减少的序列,中值滤波输出信号仍保持输入信号不变(利用这个特点,可以使中值滤波既能去除图象中的噪声,又能保持图象中一些物体的边缘)。

同理,二维中值滤波可由下式表示:

yij?Med{fij}(4—2)

A式中:A为窗口; {fij}为二维数据序列。这样处理的特点是:当在窗口内,被噪声污染的象素不超过滤波器区域的一半时,噪声会被抑制;当在窗口内,被噪声污染的象素超过滤波器区域的一半时,噪声会得到保留。

二维中值滤波的窗口形状和尺寸对滤波效果影响较大,不同的图象内容和不同的应用要求,往往采用不同的窗口形状和尺寸。常用的二维中值滤波窗口有线状、十字形、方形等。窗口尺寸一般先用3×3,再取5×5逐渐增大,直到滤波效果满意为止。就一般经验来讲,对于有缓变的较长轮廓线物体的图象,采用方形窗口为宜。对于包含有尖顶物体的图象,用十字形窗口;而窗口大小则以不超过图象中最小有效物体的尺寸为宜。如果图象中点、线、尖角细节较多,则不宜采用中值滤波。对一些内容复杂的图象,可以使用复合型中值滤波,如中值滤波的线性组合,即将几种窗口尺寸大小和形状不同的中值滤波器复合使用,只要各窗口都与中心对称,滤波输出可保持几个方向上的边缘跳变,而且跳变幅度可调节;其线性组合方程如下:

Yij??akMed{fij}(4—3)

k?1AkN式中:ak为不同中值滤波的系数,Ak为窗口。

三. 程序代码

1. 方形模板滤波

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') X=J;k=5; %中值k=5

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B=g(i-1:i+1,j-1:j+1); %把图像中的一个3*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1);

temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j-1)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('3×3中值滤波图像') 滤波结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') X=J;k=13; %中值k=13

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大两圈的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B=g(i-2:i+2,j-2:j+2); %把图像中的一个5*5领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:25 %利用冒泡法排序 for n=2:25

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('5×5中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01

figure,subplot(1,2,1),imshow(J);title('加入高斯噪声图像'); X=J;k=5; %中值k=5

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B=g(i-1:i+1,j-1:j+1); %把图像中的一个3*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j-1)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素

end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('3×3中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01

figure,subplot(1,2,1),imshow(J);title('加入高斯噪声图像'); X=J;k=13; %中值k=13

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大两圈的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B=g(i-2:i+2,j-2:j+2); %把图像中的一个5*5领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:25 %利用冒泡法排序 for n=2:25

if temp(n-1)>temp(n)

t=temp(n-1);

temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('5×5中值滤波图像') 结果截图

程序代码

clear;

J=imread('f:00.Bmp');

subplot(1,2,1),imshow(J); title('瑞利噪声干扰图像') X=J;k=5; %中值k=5

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B=g(i-1:i+1,j-1:j+1); %把图像中的一个3*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp

for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j-1)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('3×3中值滤波图像') 结果截图

程序代码

clear;

J=imread('f:00.Bmp');

subplot(1,2,1),imshow(J); title('瑞利噪声干扰图像') X=J;k=13; %中值k=13

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大两圈的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end

end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B=g(i-2:i+2,j-2:j+2); %把图像中的一个5*5领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:25 %利用冒泡法排序 for n=2:25

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('5×5中值滤波图像') 结果截图

2. 线性模板滤波

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') X=J;k=2; %中值k=2

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N;

g=zeros(p,q); %产生一个大的零矩阵 fori=2:p-1 for j=1:q

g(i,j)=X(i-1,j);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=1:q

B=g(i-1:i+1,j); %把图像中的一个1*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:3 %利用冒泡法排序 for n=2:3

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j)=temp(k);%将模板的中值(k=2)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('1×3中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') X=J;k=3; %中值k=3

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N;

g=zeros(p,q); %产生一个大的零矩阵 fori=3:p-2 for j=1:q

g(i,j)=X(i-2,j);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=1:q

B=g(i-2:i+2,j); %把图像中的一个1*5领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:5 %利用冒泡法排序 for n=2:5

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j)=temp(k);%将模板的中值(k=3)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('1×5中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01

figure,subplot(1,2,1),imshow(J); title('高斯噪声干扰图像') X=J;k=2; %中值k=2

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N;

g=zeros(p,q); %产生一个大的零矩阵 fori=2:p-1 for j=1:q

g(i,j)=X(i-1,j);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=1:q

B=g(i-1:i+1,j); %把图像中的一个1*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:3 %利用冒泡法排序 for n=2:3

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end

end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j)=temp(k);%将模板的中值(k=2)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('1×3中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01

figure,subplot(1,2,1),imshow(J); title('高斯噪声干扰图像') X=J;k=3; %中值k=3

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N;

g=zeros(p,q); %产生一个大的零矩阵 fori=3:p-2 for j=1:q

g(i,j)=X(i-2,j);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=1:q

B=g(i-2:i+2,j); %把图像中的一个1*5领域赋给B

temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:5 %利用冒泡法排序 for n=2:5

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j)=temp(k);%将模板的中值(k=3)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('1×5中值滤波图像') 结果截图

程序代码

clear;

J=imread('f:00.Bmp');

subplot(1,2,1),imshow(J); title('瑞利噪声干扰图像') X=J;k=2; %中值k=2

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N;

g=zeros(p,q); %产生一个大的零矩阵 fori=2:p-1 for j=1:q

g(i,j)=X(i-1,j);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=1:q

B=g(i-1:i+1,j); %把图像中的一个1*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:3 %利用冒泡法排序 for n=2:3

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j)=temp(k);%将模板的中值(k=2)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('1×3中值滤波图像') 结果截图

程序代码

clear;

J=imread('f:00.Bmp');

subplot(1,2,1),imshow(J); title('瑞利噪声干扰图像') X=J;k=3; %中值k=3

[M,N]=size(X); %求出输入图像的行数M和列数N

p=M+4; q=N;

g=zeros(p,q); %产生一个大的零矩阵 fori=3:p-2 for j=1:q

g(i,j)=X(i-2,j);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=1:q

B=g(i-2:i+2,j); %把图像中的一个1*5领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:5 %利用冒泡法排序 for n=2:5

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j)=temp(k);%将模板的中值(k=3)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('1×5中值滤波图像') 结果截图

3. 十字模板滤波

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') X=J;k=3;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B1=g(i,j-1:j+1);%把图像中的一个3*3领域赋给B1 B2=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 for m=1:5 %利用冒泡法排序 for n=2:5

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j-1)=temp(k);%将模板的中值(k=3)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('3×3中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') X=J;k=5;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B1=g(i,j-2:j+2);%把图像中的一个5*5领域赋给B B2=g(i-2:2:i+2,j); B3=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 temp=[temp,B3(1,:)]; temp=[temp,B3(2,:)];

for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('5×5中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01

figure,subplot(1,2,1),imshow(J); title('高斯噪声干扰图像') X=J;k=3;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B1=g(i,j-1:j+1);%把图像中的一个3*3领域赋给B1 B2=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 for m=1:5 %利用冒泡法排序 for n=2:5

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j-1)=temp(k);%将模板的中值(k=3)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('3×3中值滤波图像') 结果截图

程序代码

clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01

figure,subplot(1,2,1),imshow(J); title('高斯噪声干扰图像') X=J;k=5;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B1=g(i,j-2:j+2);%把图像中的一个3*3领域赋给B1 B2=g(i-2:2:i+2,j); B3=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 temp=[temp,B3(2,:)]; temp=[temp,B3(2,:)];

for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('5×5中值滤波图像') 结果截图

程序代码 clear;

J=imread('f:00.Bmp');

subplot(1,2,1),imshow(J); title('瑞利噪声干扰图像') X=J;k=3;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B1=g(i,j-1:j+1);%把图像中的一个3*3领域赋给B1 B2=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 for m=1:5 %利用冒泡法排序 for n=2:5

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t;

end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-1,j-1)=temp(k);%将模板的中值(k=3)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('3×3中值滤波图像') 结果截图

程序代码 clear;

J=imread('f:00.Bmp');

subplot(1,2,1),imshow(J); title('瑞利噪声干扰图像') X=J;k=5;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大两圈的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B1=g(i,j-2:j+2);%把图像中的一个5*5领域赋给B1

B2=g(i-2:2:i+2,j); B3=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 temp=[temp,B3(2,:)]; temp=[temp,B3(2,:)];

for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

%tempSort=sort(temp);%对其中的像素值进行排序

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(1,2,2),imshow(Y);title('5×5中值滤波图像') 结果截图

4. 低通滤波

程序代码 clear;

I=imread('f:00.tif');

figure,imshow(I),title('原始图象'); J=imnoise(I,'salt& pepper',0.02);

figure,subplot(1,2,1),imshow(J); title('椒盐噪声干扰图像') %将灰度图像的二维不连续Frourier变换的零频率成分移到频谱的中心 s=fftshift(fft2(J));

[M,N]=size(s); %分别返回s的行数到M中,列数到N中 n=2; %对n赋初值

%GLPF滤波,d0=5,15,30(程序中以d1=30为例) d1=30; %初始化d1

n1=floor(M/2); %对M/2进行取整 n2=floor(N/2); %对N/2进行取整 fori=1:M for j=1:N

c=sqrt((i-n1)^2+(j-n2)^2); %点(i,j)到傅立叶变换中心的距离 h=1*exp(-1/2*(c^2/d1^2)); %GLPF滤波函数

s(i,j)=h*s(i,j); %GLPF滤波后的频域表示 end end

s=ifftshift(s); %对s进行反FFT移动

%对s进行二维反离散的Fourier变换后,取复数的实部转化为无符号8位整数

s=uint8(real(ifft2(s))); subplot(1,2,2),imshow(s);title('GLPF滤波(d1=30)'); 结果截图

5. 多种窗口线形组合的中值滤波

程序代码

clear;

I=imread('f:00.tif');

subplot(2,2,1),imshow(I),title('原始图象');

J=imnoise(I,'gaussian'); %默认值为零均值,方差为0.01 subplot(2,2,2),imshow(J);title('高斯噪声干扰图像'); X=J;k=5; %中值k=5

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+2; q=N+2;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=2:p-1 for j=2:q-1

g(i,j)=X(i-1,j-1);%外围为零的X矩阵 end end

for i=2:p-1 %进行中值滤波 for j=2:q-1

B=g(i-1:i+1,j-1:j+1); %把图像中的一个3*3领域赋给B temp=B(:); %把领域中的元素变成一维并赋给temp for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

y(i-1,j-1)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(2,2,3),imshow(Y);title('3×3方形模板中值滤波图像')

X=Y;k=5;

[M,N]=size(X); %求出输入图像的行数M和列数N p=M+4; q=N+4;

g=zeros(p,q); %产生一个大一圈的零矩阵 fori=3:p-2 for j=3:q-2

g(i,j)=X(i-2,j-2);%外围为零的X矩阵 end end

for i=3:p-2 %进行中值滤波 for j=3:q-2

B1=g(i,j-2:j+2);%把图像中的一个3*3领域赋给B1 B2=g(i-2:2:i+2,j); B3=g(i-1:2:i+1,j); temp=B1; %矩阵的第一行

temp=[temp,B2(1,:)]; %把B1加到第一行中 temp=[temp,B2(2,:)]; %把第B2加到上两行中 temp=[temp,B3(2,:)]; temp=[temp,B3(2,:)];

for m=1:9 %利用冒泡法排序 for n=2:9

if temp(n-1)>temp(n)

t=temp(n-1); temp(n-1)=temp(n); temp(n)=t; end end end

y(i-2,j-2)=temp(k);%将模板的中值(k=5)赋给模板中心位置的元素 end; end;

Y=uint8(y); %图像是八位灰度级,matlab读入图像的函数是uint8 subplot(2,2,4),imshow(Y);title('再用5×5十字模板中值滤波图像') 结果截图

四. 结果分析

从处理结果可以看出,中值滤波法能够非常好地将椒盐噪声去除掉,可见中值滤波方法对于椒盐噪声或脉冲式干扰具有很强的滤除作用。因为这些干扰值与其邻近像素的灰度值有很大的差异,经过排序后取中值的结果就将此干扰强制变成与其邻近的某些像素值一样,从而达到去除干扰的效果。但是由于中值滤波方法在处理过程中会带来图像模糊,所以对于细节丰富,特别是点、线和尖顶细节较多的图像不适用。

模板的像素越多,去噪的效果越好,但是滤波后的图像会越模糊。因为模板的像素越多,它失去的图像细节就越多,导致图像不清晰。

中值滤波和低通滤波对于不同的噪声有不同的效果,中值滤波所选模板的尺寸要合适,否则,滤波的效果不好,要么图像的边缘不清晰;低通滤波将所有的高频信号都滤除了,故低通滤波后的图像的轮廓和边缘更模糊。

本文来源:https://www.bwwdw.com/article/xr6p.html

Top