实验一图像的滤波处理

一、实验目的

使用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

%未被赋值的元素取原值

d=uint8(x2);

五、实验结果和分析

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中给的函数处理不能满足需求,需要对已有的算法进行修改,找到一个适合的最佳的算法。很多算法都是需要进行多次试验,记录每次试验的结果,对结果进行分析,找到合适的方法。

使用MATLAB对图像处理的几种方法(上)的更多相关文章

  1. 使用MATLAB对图像处理的几种方法(下)

     试验报告 一.试验原理: 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对 ...

  2. (转)C#进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)

    转自 http://blog.sina.com.cn/s/blog_628821950100wh9w.html C#进行图像处理的几种方法 本文讨论了C#图像处理中Bitmap类.BitmapData ...

  3. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  4. C#数字图像处理的3种方法

    本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类.BitmapData类和Graphics类是C#处理图像的的3个重要的类. Bitmap只要用于处理由像素数据定义的图像的对 ...

  5. 两种方法上传本地文件到github

    https://www.jianshu.com/p/c70ca3a02087 自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的 ...

  6. 两种方法上传本地文件到github(转)

    自从使用github以来,一直都是在github网站在线上传文件到仓库中,但是有时因为网络或者电脑的原因上传失败.最重要的原因是我习惯本地编辑,完成以后再一起上传github.看过了几个教程,总结出最 ...

  7. 使用C#进行图像处理的几种方法(转)

    本文讨论了C#图像处理中Bitmap类.BitmapData类和unsafe代码的使用以及字节对齐问题. Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像 ...

  8. 【数值分析】误差的分析与减少及Matlab解线性方程的四种方法

    1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 ...

  9. [转]使用C#进行图像处理的几种方法

    最近做监控图像由彩色变灰处理的时候发现图像处理过程中,很慢很慢代码如下: int Height = this.picInfo.Image.Height;                    int ...

随机推荐

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  4. Hawk 6. 高级话题:子流程系统

    子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...

  5. javascript 判断参数类型大全

    js 判断类型的在开发中是很常用的,因为js 是弱类型的语言,var 可以接受任何形式的类型,但是在真正的开发中,我们需要根据不同类型做不同的处理,所以这个是必须的精通. 首先需要知道 typeof这 ...

  6. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  7. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  8. Android中Fragment和ViewPager那点事儿(仿微信APP)

    在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragm ...

  9. Openfire集群源码分析

    如果用户量增加后为了解决吞吐量问题,需要引入集群,在openfire中提供了集群的支持,另外也实现了两个集群插件:hazelcast和clustering.为了了解情况集群的工作原理,我就沿着open ...

  10. 学习笔记:URL Protocol在浏览器中打开本地应用程序

    看到阿里的网站上可以通过点击卖家的旺旺图标从而调用本地的阿里旺旺程序,而且还可以传递当前浏览者需要咨询的商品.这是怎么实现的呢?是通过URLProtocol来完成. 原理还没有太清楚,即在系统里注册一 ...