实验一图像的滤波处理
一、实验目的
使用MATLAB处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响。
二、实验内容
使用n=3,5,9的正方形均值滤波器和加权均值滤波器对图像Fig1的滤波处理。观察处理前后图像效果,分析实验结果和算法特点。
三、实验原理
1、均值滤波器(平滑线性滤波器):其响应是包含模板内像素平均值,低通滤波器。
R = (领域内所有点的值*对应点的掩模系数之和)/(掩模系数之和)
g(x,y)=1/n∑f(x,y) n为该模板中包含当前像素在内的像素总个数
2、加权均值滤波器:加权均值滤波算法是一种有效的去除高斯噪声的算法。
如果领域内掩模系数不等,则这个掩模叫加权平均。从权值上看每个像素的重要性不等,权值越大表明这个像素越重要。
R=(权值*对应像素灰度值所有之和)/(权值之和)
g(x,y)=∑w(s,t)∑f(x,y)/(∑∑w(s,t)) w为权值
四、实验步骤
1、n=3正方形均值滤波处理图像Fig1,使用MATLAB自带的均值滤波器函数进行图像的滤波处理
(1)MATLAB自带均值滤波器函数
>> clear,close all %清除所有
>> I=imread(\'C:\Users\xyxx\Desktop\image\Fig1.jpg\'); %读取图像
>> imshow(I); %显示图像
>> K1=filter2(fspecial(\'average\',3),I)/255; %使用均值滤波器处理
>> figure,imshow(K1); %显示处理结果
2、n=5正方形均值滤波处理图像Fig1,使用MATLAB自带的均值滤波器函数进行图像的滤波处理
(1)MATLAB自带均值滤波器函数
>> clear,close all %清除所有
>> I=imread(\'C:\Users\xyxx\Desktop\image\Fig1.jpg\'); %读取图像
>> imshow(I); %显示图像
>> K1=filter2(fspecial(\'average\',5),I)/255; %使用均值滤波器处理
>> figure,imshow(K1); %显示处理结果
3、n=9正方形均值滤波处理图像Fig1,使用MATLAB自带的均值滤波器函数进行图像的滤波处理
(1)MATLAB自带均值滤波器函数
>> clear,close all %清除所有
>> I=imread(\'C:\Users\xyxx\Desktop\image\Fig1.jpg\'); %读取图像
>> imshow(I); %显示图像
>> K1=filter2(fspecial(\'average\',9),I)/255; %使用均值滤波器处理
>> figure,imshow(K1); %显示处理结果
4、使用自定义均值滤波函数处理
源代码:
% x是需要滤波的图像,n是模板大小(即n×n)
function d=avg_filter(x,n)
a(1:n,1:n)=1; %a即n×n模板,元素全是1
[height, width]=size(x); %输入图像是height,width的,且height>n,width>n
x1=double(x);
x2=x1;
for i=1:height-n+1 %等价于for i=n:height
for j=1:width-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);
5、使用加权均值滤波器对图像Fig1的滤波处理
若 I=[f(i,j)]M×N 表示输入图像, 其中 f(i,j)表示图像灰度 值矩阵中(i,j)点处像素的灰度值。H3(i,j)代表像素中心在(i,j)大小为 3×3 的一个窗口 ,如下所示 :
加权滤波器的输出:
该滤波器的具体实现步骤如下 :
(1)将模板H3(i,j)在图像 I=[f(i,j)]M × N中从左到右、从上到下漫游,而模板中各位置点会与图像中的某个像素点重合;
(2)读取模板 H3(i,j)下各对应像素的灰度值 f(i,j);
(3)将这些灰度值 f(i,j)存储在一维矩阵中,并进行比较,按升序排成一列;
(4)对这9个灰度从小到大依次与 w1、w2、w3、w4、w5、w6、w7、w8、w9相乘后相加得 A, 令 A 与各权重之和的倒数相乘,得列权值矩阵。
(6)将构成的权值矩阵与它所重合的像素灰度值相乘,把所有的乘积求和,将这个值赋给对应模板中心位置的像素。使灰度相近的邻点参与平均的比重大,对模板中心 和较近的元素可以赋予大的加权值。
源代码:
% x是需要滤波的图像,n是模板大小(即n×n)
function d=wavg_filter(x,n)
[height, width]=size(x); %输入图像是height,width的,且height>n,width>n
x1=double(x);
new_image=ones(size(x1));
x2=x1;
for i=2:height-n+1 %从2开始,不能从1开始,因为这样i-1=0了,x(0,1)这样不可以的
for j=2:width-n+1
%如果w1,w2……w9取相同的值的时候就是均值滤波器 n=3 3*3
%H3[i,j]=[(i-1,j-1),(i-1,j),(i-1,j+1);(i,j-1),(i,j),(i,j+1);(i+1,j-1),(i+1,j),(i+1,j+1)]
%x2(i,j)坐标
%为了去除噪声更多一些,w1-w9取值更均匀一些
%f1,f2,f3,f4,f5,f6,f7,f8,f9分别表示(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)的权值
%f=f1+f2+f3+f4+f5+f6+f7+f8+f9 表示权值之和
%w1=f1/f,w2=f2/f,w3=f3/f,w4=f4/f,w5=f5/f,w6=f6/f,w7=f7/f,w8=f8/f,w9=f9/f表示权重
%w=w1+w2+w3+w4+w5+w6+w7+w8+w9; %权重之和为1;
%加权均值滤波器 想要什么就把谁的权值加重 w1=0.1;w2=0.1;w3=0.1;w4=0.2;w5=0.1;w6=0.1;w7=0.1;w8=0.1;w9=0.1;
A=x2(i-1,j-1)*w1 +x2(i-1,j)*w2 +x2(i-1,j+1)*w3 +x2(i,j-1)*w4+x2(i,j)*w5+x2(i,j+1)*w6+x2(i+1,j-1)*w7+x2(i+1,j)*w8+x2(i+1,j+1)*w9;
new_image(i,j)=A;
x2(i+(n-1)/2,j+(n-1)/2)=new_image(i,j); %将与模板运算后的各元素的均值赋给模板中心位置的元素
end
end
%未被赋值的元素取原值
五、实验结果和分析
1、实验结果:
(1)n=3均值滤波器
(2)n=5均值滤波器
(3)n=9均值滤波器
(4)自定义均值滤波器
(5)加权均值滤波器
2、结果分析:
(1)均值滤波器,平滑的效果和所采用领域的半径(模板)有关,半径越大,则图像的模糊程度越大。
(2)加权均值滤波,需要提前设置权值,想要哪个像素点,就把哪个的权值加重。此外加权均值滤波器不能去掉噪声,只能只是模糊和锐化。
(3)自定义的滤波器函数比系统自带的函数性能高一些,这是经过多次试验得出的结论。
六、实验心得
刚开始接触MATLAB,那就是一头雾水,找不到方向不知道从何处入手,后来查了一些资料和身边一些从事这方面的同学朋友,才发现它原来是处理图像的最好的工具。MATLAB中的函数的写法类似C,但是和C还是不一样的,比如在MATLAB中是从第1个开始的,没有第0个的概念,如果你取值f(0,1),运行就会提示索引应该为正整数或者逻辑数。对于加权均值滤波器,权值不好取,需要根据一些计算和误差分析等,需要大量实验才能取得合适的值。接触了几天后,慢慢熟悉了,感觉MATLAB是一个好的工具,对于数学建模,数学中的一些计算,各种公式和函数的计算都很方便,最重要的是对处理图像非常的好。现在图像处理在人工智能,地理测绘,医学成像等各个领域研究应用非常广泛,使用它非常方便的,非常精细专业。 在我们现实生活中,我们了解了一个图像实际上就是一个矩阵,每个像素点就是一个坐标,想让某个模糊的地方复原就是让它和它附件的区域取值一样,把不同地方设置一样的值就可以,对于彩色的照片我们可以设置灰度值变成黑白的。我们了解这些原理之后,可以对自己的照片进行处理,修复受损的照片和将彩色的照片变成黑白的,比PS好用多了。
实验二多种滤波器的比较
一、实验目的
使用MATLAB处理图像,掌握各种滤波器的使用(例如:均值滤波器、加权均值滤波器、中值滤波器、高斯滤波器),对比各种滤波器对图像处理结果,找出它们对各种噪声(例如:椒盐噪声、高斯噪声、脉冲噪声)处理最佳。
二、实验内容
使用均值滤波器、加权均值滤波器、中值滤波器、高斯滤波器对图像Fig2的进行去除脉冲噪音处理。观察对比这几种滤波器对该图像的结果,分析实验结果和算法特点,找出一种最好的处理脉冲噪声的滤波器或者算法。
三、实验原理
1、均值滤波器(平滑线性滤波器):其响应是包含模板内像素平均值,低通滤波器。
R = (领域内所有点的值*对应点的掩模系数之和)/(掩模系数之和)
g(x,y)=1/n∑f(x,y) n为该模板中包含当前像素在内的像素总个数
2、加权均值滤波器:加权均值滤波算法是一种有效的去除高 斯噪声的算法。
如果领域内掩模系数不等,则这个掩模叫加权平均。从权值上看每个像素的重要性不等,权值越大表明这个像素越重要。
R=(权值*对应像素灰度值所有之和)/(权值之和)
g(x,y)=∑w(s,t)∑f(x,y)/(∑∑w(s,t)) w为权值
3、中值滤波器:用该像素邻域内像素灰度的中值代替该像素的值。
F(x,y)=mid{g(s,t)}
中值滤波器对处理脉冲噪声(黑白点)非常有效。
4、高斯滤波器:一种线性平滑滤波,适用于消除高斯噪声,用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
5、涉及到系统函数:
Imread()读取图像,imshow()显示图像,double和unit8用来处理图像转换为矩阵之后数据和显示,size输出图像高和宽,floor()计算中心点,fspecial()生成系统滤波,filter2()
均值滤波,medfilt2()中值滤波
filter_avg_3x3 = [1 1 1;
1 1 1;
1 1 1];
filter_avg_5x5 = [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];
filter_avg_9x9 = [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 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 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 1 1 1 1 1 1 ];
filter_w_avg_3x3 = [1 2 1;
2 4 2;
1 2 1];
filter_w_avg_5x5 = [1 2 4 2 1;
2 4 16 4 2;
4 16 256 16 2;
2 4 16 6 2;
1 2 4 2 1];
四、实验步骤
1、使用均值滤波器处理图像Fig2
源代码:根据算法自定义函数
% x是需要滤波的图像,n是模板大小(即n×n)
function d=avg_filter(x,n)
a(1:n,1:n)=1; %a即n×n模板,元素全是1
[height, width]=size(x); %输入图像是height,width的,且height>n,width>n
x1=double(x);
x2=x1;
for i=1:height-n+1 %等价于for i=n:height
for j=1:width-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);
2、使用加权均值滤波器处理图像Fig2
源代码:根据算法自定义函数
% x是需要滤波的图像,n是模板大小(即n×n)
function d=wavg_filter(x,n)
[height, width]=size(x); %输入图像是height,width的,且height>n,width>n
x1=double(x);
new_image=ones(size(x1));
x2=x1;
for i=2:height-n+1 %从2开始,不能从1开始,因为这样i-1=0了,x(0,1)这样不可以的
for j=2:width-n+1
%如果w1,w2……w9取相同的值的时候就是均值滤波器 n=3 3*3
%H3[i,j]=[(i-1,j-1),(i-1,j),(i-1,j+1);(i,j-1),(i,j),(i,j+1);(i+1,j-1),(i+1,j),(i+1,j+1)]
%为了去除噪声更多一些,w1-w9取值更均匀一些
%f1,f2,f3,f4,f5,f6,f7,f8,f9分别表示(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)的权值
%f=f1+f2+f3+f4+f5+f6+f7+f8+f9 表示权值之和
%w1=f1/f,w2=f2/f,w3=f3/f,w4=f4/f,w5=f5/f,w6=f6/f,w7=f7/f,w8=f8/f,w9=f9/f表示权重
%w=w1+w2+w3+w4+w5+w6+w7+w8+w9; %权重之和为1;
%加权均值滤波器 想要什么就把谁的权值加重
w1=0.1;w2=0.1;w3=0.1;w4=0.2;w5=0.1;w6=0.1;w7=0.1;w8=0.1;w9=0.1;
A=x2(i-1,j-1)*w1 +x2(i-1,j)*w2 +x2(i-1,j+1)*w3 +x2(i,j-1)*w4+x2(i,j)*w5+x2(i,j+1)*w6+x2(i+1,j-1)*w7+x2(i+1,j)*w8+x2(i+1,j+1)*w9;
new_image(i,j)=A;
x2(i+(n-1)/2,j+(n-1)/2)=new_image(i,j); %将与模板运算后的各元素的均值赋给模板中心位置的元素
end
end
%未被赋值的元素取原值
d=uint8(x2);
3、使用中值滤波器处理图像Fig2
源代码:根据算法自定义函数
%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n)
function d=mid_filter(x,n)
[height, width]=size(x); %输入图像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
for i=1:height-n+1
for j=1:height-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; %将模板各元素的中值赋给模板中心位置的元素
end
end
%未被赋值的元素取原值
d=uint8(x2);
4、使用高斯滤波器处理图像Fig2
源代码:根据算法自定义函数
%自编的高斯滤波函数,S是需要滤波的图象,n是均值,k是方差
function d=gaussfilt(k,n,s)
Img = double(s);
n1=floor((n+1)/2);%计算图象中心
for i=1:n
for j=1:n
b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*k))/(4*pi*k);
end
end
%生成高斯序列b。
Img1=conv2(Img,b,\'same\'); %用生成的高斯序列卷积运算,进行高斯滤波
d=uint8(Img1);
五、实验结果和分析
该图像对应的直方图和转换为矩阵的部分片段:
1、实验结果:
(1)均值滤波器处理结果:
(2)加权均值滤波器处理结果:
(3)中值滤波器处理结果:
(4)高斯滤波器处理结果:
2、结果分析:
(1)模板越大,处理越模糊;
(2)几种滤波器处理结果对比,中值滤波器对处理脉冲噪声(黑白点)非常有效;
(3)线性滤波器对处理高斯噪声效果很好,但是对椒盐噪声、脉冲噪声效果一般,它的主要问题是有可能模糊图像中的尖锐,不连续的部分。非线性滤波器,对滤出脉冲噪声的效果最好。
六、实验心得
处理图像,MATLAB中给的函数处理不能满足需求,需要对已有的算法进行修改,找到一个适合的最佳的算法。很多算法都是需要进行多次试验,记录每次试验的结果,对结果进行分析,找到合适的方法。