基于matlab的图像高斯噪声和椒盐噪声的滤除_第1页
基于matlab的图像高斯噪声和椒盐噪声的滤除_第2页
基于matlab的图像高斯噪声和椒盐噪声的滤除_第3页
基于matlab的图像高斯噪声和椒盐噪声的滤除_第4页
基于matlab的图像高斯噪声和椒盐噪声的滤除_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于matlab的图像高斯噪声和椒盐噪声的滤除目录摘 要第一章 高斯平滑滤波的原理第二章 试验要求及试验步骤设计2.1试验要求2.2试验步骤设计2.3 结论参考文献摘 要 图像信号在产生、传输和记录的过程中,经常会受到各种噪声的干扰,噪声可以理解为妨碍人的视觉器官或系统传感器对所接收图像源信息进行理解或分析的各种元素。噪声对图像的输入、采集、处理的各个环节以及最终输出结果都会产生一定影响。图像去噪是数字图像处理中的重要环节和步骤。去噪效果的好坏直接影响到后续的图像处理工作如图像分割、边缘检测等。一般数字图像系统中的常见噪声主要有:高斯噪声(主要由阻性元器件内部产生)、椒盐噪声(主要是图像切割引

2、起的黑图像上的白点噪声或光电转换过程中产生的泊松噪声)等。我们平常使用的滤波方法一般有均值滤波、中值滤波和维纳滤波,他们分别对某种噪声的滤除有较好的效果,但对于同时存在高斯噪声和椒盐噪声的图像处理的效果可能不会太好,在这里我们分别用多种方法对图像噪声进行处理,对比使用效果。关键词:图像去噪、常见噪声、多种方法、使用效果。绪论20世纪20年代,图像处理首次得到应用。上个世纪60年代中期,随着计算机科学的发展和计算机的普及,图像处理得到广泛的应用。60年代末期,图像处理技术不断完善,逐渐成为一个新兴的学科。图像处理中输入的是质量低的图像,输出的是改善质量后的图像。为了改善图像质量,从图像中提取有效

3、信息,必须对图像进行去噪预处理。根据噪声频谱分布的规律和统计特征以及图像的特点,出现了多种多样的去噪方法。经典的去噪方法有:空域合成法,频域合成法和最优合成法等,与之适应的出现了许多应用方法,如均值滤波器,中值滤波器,低通滤波器,维纳滤波器,最小失真法等。这些方法的广泛应用,促进数字信号处理的极大发展,显著提高了图像质量。一幅原始图像在获取和传输过程中会受到各种噪声的干扰,使图像质量下降,对分析图像不利。反映到图像画面上,主要有两种典型的噪声。一种是幅值基本相同,但出现的位置随机的椒盐噪声,另一种则每一点都存在,但幅值随机分布的随机噪声。为了抑制噪声、改善图像质量,要对图像进行平滑处理。图像平

4、滑处理的方法多种多样,有邻域平均、中值滤波,高斯滤波、灰度最小方差的均值滤波等。第一章 高斯平滑滤波的原理高斯滤波是根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对去除服从正态分布的噪声是很有效果的。一维零均值高斯函数为 。其中,高斯分布参数 决定了高斯滤波器的宽度。对图像来说,常用二维零均值离散高斯函数作平滑滤波器,函数表达式如下: 式(1) 高斯函数具有5个重要性质: (1)二维高斯函数具有旋转对称性,即滤波器在各个方向上的平滑程度是相同的。一般来说一幅图像的边缘方向是不知道的。因此,在滤波之前是无法确定一个方向比另一个方向上要更多的平滑的。旋转对称性意味着高斯滤波器在后续的

5、图像处理中不会偏向任一方向。 (2)高斯函数是单值函数。这表明,高斯滤波器用像素邻域的加权均值来代替该点的像素值,而每一邻域像素点的权值是随着该点与中心点距离单调递减的。这一性质是很重要的,因为边缘是一种图像局部特征。如果平滑运算对离算子中心很远的像素点仍然有很大的作用,则平滑运算会使图像失真。 (3)高斯函数的傅立叶变换频谱是单瓣的。这一性质是高斯函数傅立叶变换等于高斯函数本身这一事实的直接推论。图像常被不希望的高频信号所污染,而所希望的图像特征,既含有低频分量,又含有高频分量。高斯函数傅立叶变换的单瓣意味着平滑图像不会被不需要的高频信号所污染,同时保留了大部分所需要的信号。 (4)高斯滤波

6、器的宽度(决定着平滑程度)是由参数表证的,而且和平滑程度的关系是非常简单的。越大,高斯滤波器的频带就越宽,平滑程度就越好。通过调节平滑程度参数,可在图像特征分量模糊(过平滑)与平滑图像中由于噪声和细纹理所引起的过多的不希望突变量(欠平滑)之间取得折衷。 (5)由于高斯函数的可分离性,大高斯滤波器可以有效实现。通过二维高斯函数的卷积可以分两步来进行,首先将图像与一维高斯函数进行卷积,然后将卷积的结果与方向垂直的相同一维高斯函数进行卷积。因此,二维高斯滤波的计算量随滤波模板宽度成线性增长而不是成平方增长。这些性质使得它在早期的图像处理中特别有用,表明高斯平滑滤波器无论在空间域还是在频率域都是十分有

7、效的低通滤波器。 高斯函数的可分离性很容易表示: 式(2) 式(3) 式(4)在图像滤波中,常用的方法是线性滤波技术和非线性滤波技术,线性滤波以其完美的理论基础,数学处理简单、易于采用和硬件实现等优点,一直在图像滤波领域中占有重要地位。第二章 试验要求及试验步骤设计2.1试验要求高斯滤波实验结果,分析与总结以下即为本课题研究的主要内容及要求:使用imread()读入原始的彩色图像。用imnoise()在灰度图像中加入椒盐噪声。利用高斯滤波 A1=fspecial(gaussian,k,n3)%生成高斯序列Y1=filter2(A2,g)/255用生成的高斯序列进行滤波。显示滤波后的图像。在MA

8、TLAB里运行程序:ClearClose allA1=imread(F:/1.bmp);A2=imnoise(A1,salt & pepper,0.05);n=input(请输入高斯滤波器的均值n);k=input(请输入高斯滤波器的方差n);A3=fspecial(gaussian,k,n3);%生成高斯序列Y1=filter2(A3,g)/255;%用生成的高斯序列进行滤波2.2试验步骤设计1均值滤波对同时含有高斯和椒盐噪声的图像的处理:I1=imread(Miss.bmp);subplot(2,2,1);imshow(I1);title(原图);k1=imnoise(I1,salt &

9、pepper,0.01);I=imnoise(k1,gaussian,0.01);subplot(2,2,2);imshow(I)title(加入高斯和椒盐噪声以后);a,b=size(I);I2=zeros(a+2,b+2);I3=zeros(a,b);for n=1:a for m=1:b I2(n+1,m+1)=I(n,m); end;end;for n=2:a for m=2:b I3(n-1,m-1)=I2(n-1,m-1)+I2(n-1,m)+I2(n-1,m+1)+I2(n,m-1)+I2(n,m)+I2(n,m+1)+I 2(n+1,m-1)+I2(n+1,m)+I2(n+1,

10、m+1)/9; end;end;subplot(2,2,3);imshow(uint8(I3);title(3*3均值滤波以后);a,b=size(I);I4=zeros(a+4,b+4);I5=zeros(a,b);for n=1:a for m=1:b I4(n+2,m+2)=I(n,m); end;end;for n=3:a for m=3:b I5(n-2,m-2)=I4(n-2,m-2)+I4(n-2,m-1)+I4(n-2,m)+I4(n-2,m+1)+I4(n-2,m+2)+I4(n-1,m-2)+I4(n-1,m-1)+I4(n-1,m)+I4(n-1,m+1)+I4(n-1,

11、m+2)+I4(n,m-2)+I4(n,m-1)+I4(n,m)+I4(n,m+1)+I4(n,m+2)+I4(n+1,m-2)+I4(n+1,m-1)+I4(n+1,m)+I4(n+1,m+1)+I4(n+1,m+2)+I4(n+2,m-2)+I4(n+2,m-1)+I4(n+2,m)+I4(n+2,m+1)+I4(n+2,m+2)/25; end;end;subplot(2,2,4);imshow(uint8(I5);title(5*5均值滤波以后);图一: 加入椒盐噪声处理前后的图像图二:高斯噪声处理前后的图像2.3 结论在图像处理过程中,消除图像的噪声干扰是一个非常重要的问题,本文利用

12、matlab软件,采用高斯滤波的方式,对带有椒盐噪声的图像进行处理,经过滤波后的图像既适合人眼的视觉感觉又能够消除图像中的干扰影响。通过本次试验我们可以看到高斯滤波对于滤除图像的“椒盐”噪声非常有效,它可以做到既去除噪声又能保护图像的边缘,从而获得较满意的复原效果,尤其在滤除叠加白噪声和长尾叠加噪声方面显出极好的性能。一、对于椒盐噪声,中值滤波效果比均值滤波效果好。原因:1、椒盐噪声是幅值近似相等但随机分布在不同的位置上,图像中有干净点也有污染点。2、中值滤波是选择适当的点来代替污染点的值,所以处理效果好。3、因为噪声的均值不为零,所以均值滤波不能很好地去除噪声点。二、对于高斯噪声,均值滤波效

13、果比中值滤波效果好。原因:1、高斯噪声是幅值近似正态分布,但分布在每点像素上。2、因为图像中的每点都是污染点,所以中值滤波选不到合适的干净点。3、因为正态分布的均值为零,所以均值滤波可以削弱噪声。参考文献:1 张志涌 精通MATLAB 6.5版教程,北京航天航空大学出版社.2003(56) 2 胡鹏,徐会燕.基于matlab的图像去噪算法的研究与实现福建电脑.2009(12)3 李彦军,苏红旗等.改进的中值滤波图像去噪方法研究计算机工程与设计.2009(12)4 孙宏琦,施维颖,巨永峰.利用中值滤波进行图像处理长安大学学报(自然科学版) .2003(2)5 周建兴,MATLAB从入门到精通.

14、人民邮电出版社 . 2008(60)总结与体会起初收到课题时感到很无措,通过临时抱佛脚对matlab中的运用有了一些基本的的认识。由于现在大家都已经是大四的了,都在各自的忙着找工作或者考研,所以这次课程设计的时间也比较仓促,也未能做一些深入的了解,只是在老师的指导下和同学们的相互帮助之下,借助书籍和去网络上搜索的一些相关的文章才克服了很多困难最后完成课程。与此同时我也了解到自己所学的知识只不过是一些非常基本的东西,完成的设计也不过是一些最基础的而已。明白自己以后应该更加丰富自己。开阔自己的视野。经过本次课程设计,我不仅仅在书上学到的知识得到了巩固,而且还在设计过程中拓展了其他没有学过的知识。这

15、次的课程设计从查找资料,到确定方案,最后再到用软件仿真,我们组都团结协作,互相帮助,并且得到老师的关怀。我们以前学习的知识都渐渐离我们远去,甚至不知道、不清楚哪些知识该用到哪些地方,什么时候用。这次课程设计,通过小组的积极交流学习终于完成任务,也感觉到只有把所学的东西运用到实际时才会发现真心很难,也只有这样才真正理解所学知识。附录资料:不需要的可以自行删除c语言典型问题处理方法小结循环问题(1)、数论问题1、求素数 for(i=2;i1,如果它仅有平凡约数1和a,则我们称a为素数(或质数)。整数 1 被称为基数,它既不是质数也不是合数。整数 0 和所有负整数既不是素数,也不是合数。 2、求最大

16、公约数和最小公倍数a、 if(ab) t=a; a=b; b=t; for(i=a;i=1;i-) if(a%i=0&b%i=0) break; printf(largest common divisor:%dn,i); printf(least common multiple:%dn,(a*b)/is);b、辗转相除法求解 a1=a; b1=b; while(a%b!=0) t=a%b; a=b; b=t; printf(largest common divisor:%dnleast common multiple:%d,b,a1*b1/b);3、求完数 一个数如果恰好等于它的因子之和,这个

17、数就称为“完数”。 例如:6的因子为1、2、3,而6123,因此6是“完数”。for(a=1;a=1000;a+) s=0; for(i=1;i=a) break; if(s=a) printf(%dt,a);注意S=0所放的位置 4、分解质因数 将一个整数写成几个质因数的连乘积,如: 输入36,则程序输出36=2*2*3*3 。解一、看似简单,但要自己完整地写出来还真不容易!竟然还动用了goto语句,正好可以熟悉一下goto语句的用法!main() int a,z,i; clrscr(); scanf(%d,&a);判断下一个数开始有要重新从2开始了。所以用loop语句回到for语句,这是f

18、or语句仍从2初始化。从2开始的原则不变,变的是a的值。 loop: for(z=2;z=a;z+)判断是否为质数for(i=2;i=z;i+) if(z%i=0) break;判断是否为a的质因数 if(z=i) if(a%z=0) k+; if(k=1) printf(%d=%d,a1,z);用计数器来解决每行输入不同的问题。 else printf(*%d,z); a/=z; goto loop; 解二:main() int n, k=2, isfirst=1; printf(Input n=); scanf(%d,&n); while(k=n) if(n%k=0) if(isfirst

19、) printf(%d=%d, n, k); isfirst=0; else printf(*%d,k); n/=k; else k+; printf(n);5、从键盘输入两个整数,输出这两个整数的商的小数点后所有1000位整数 for(i=1;i=2;i-) if(fm%i=0&fz%i=0) fz/=i; fm/=i; z=fz/fm; fzx=fz%fm; if(fzx=0) printf(%d%d/%d-%d%d/%d=%dn,z1,fz1,fm1,z2,fz2,fm2,z); else if(z=0) printf(%d%d/%d-%d%d/%d=%d/%dn,z1,fz1,fm1,

20、z2,fz2,fm2,fzx,fm); else printf(%d%d/%d-%d%d/%d=%d%d/%dn,z1,fz1,fm1,z2,fz2,fm2,z,fzx,fm);(2)近似问题1、书P122习题4-6注意千万不要忘记添加#include “math.h”#include math.hmain() float x,j=1,k,s,so; int n; scanf(%f,&x); s=x; so=x+1; for(n=1;fabs(s-so)1e-6;n+) for(k=1;k1e-6) x=(x1+x2)/2; f=x*x*x+4*x*x-10;可以用/*if(f*f10) x2

21、=x; else x1=x; printf(%fn,x);(3)枚举法(4)数列问题二、数组问题(1)排序问题1、从小到大排序main() int a10,i,j,t; for(i=0;i10;i+) scanf(%d,&ai); for(i=1;i10;i+) for(j=0;jaj+1) t=aj+1;aj+1=aj;aj=t; for(i=0;i10;i+) printf(%d ,ai); printf(n);注意排序问题:1、须迅速,熟练,无差错经常插入在程序中间2、现使用最大数下沉冒泡法还可以使用最小数上浮冒泡法3、j控制前面一个数和后面一个数一一比较。由于是最大数下沉,i+1后j仍

22、要从0开始。4、i控制这样的操作一共要做多少次5、注意i j的控制次数2、从大到小排序main()现使用最大数上浮冒泡法还可使用最小数下沉冒泡法 int a10,i,j,t; for(i=0;i10;i+) scanf(%d,&ai); for(i=1;i=i;j-) if(ajaj-1) t=aj-1; aj-1=aj; aj=t; for(i=0;i10;i+) printf(%d ,ai);(2)二维数组三、字符或字符串输入输出问题(1)字符打印1、打印*此类题的溯源为书P122 4.11(1),其他题都是它的拓展 for (i=1;i=n;i+) 一共要输出的行数 for(j=1;j=

23、i;j+) 每行要打印的*数 printf(*); printf(n); a、*解题要点:此类题关键在于找到每行要打印的个数和行数的关系。此题j=i j=n-i+1b、* for(i=1;i=n;i+) 一共要输出的行数 for(j=1;j=n-i;j+) 控制空格数 printf( ); for(k=1;k=i;k+) 每行要打印的*数 printf(*); printf(n); c、 * * *解题要点:在出现空格的时候,在找到每行要打印的*个数和行数的关系后,还应找到空格和行数的关系,分不同的参数进行循环。此题k=i j=n-i j=i-1k=n-i+1d、* * for(i=1;i=n

24、;i+) for(j=1;j=n-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n); * *e、 * * * for(i=1;i=n-1;i+) for(j=1;j=i;j+) printf( ); for(k=1;k=2*(n-1-i)+1;k+) printf(*); printf(n); for(i=1;i=n;i+) for(j=1;j=n-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n); * * * * * *2、打印9*9乘法表解题要点:注意寻找行与

25、列的规律。i*ji代表列j代表行for(i=1;i=9;i+) for(j=1;j=9;j+) printf(%-3d ,i*j); 注意输出格式的控制 printf(n); 3、九九乘法表1 2 3 4 5 6 7 8 92 4 6 8 10 12 14 16 183 6 9 12 15 18 21 24 27 9 18 27 36 45 54 63 72 814、杨晖三角形11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 1(2)字符串打印问题for(i=1;i=7;i+) ai1=1; aii=1; for(i=3;i=7;i+)

26、for(j=2;j=i-1;j+) aij=ai-1j-1+ai-1j; gets(a); puts(a); for(i=1;i0;j-) aj=aj-1; a0=t; for(k=0;k=a&ai=z) ai-=32; puts (a);3、逆序输出gets (a); c=strlen(a); for(i=0;i=0;i-) 蓝色部分可以简写为绿色部分coutai-1;4、如输入:ab1 3,;z 输出:ab1注意点:1、= =2、while语句的使用处体会3、全面考虑问题 3,;zgets(a); while(a0= ) for(i=0;ai!=0;i+) ai=ai+1; for(i=0

27、;ai!=0;i+)if(ai= &ai+1!= ) printf(n); else if(ai= &ai+1= ) for(k=i;ak!=0;k+) ak+1=ak+2; i-; elseprintf(%c,ai);5、输入3个字符串,按从小到大排序输出这3个字符串。 使用一个两维数组贮存多个字符串char a8181;注意:如何使用一个两维数组贮存多个字符串 int i,j; for(i=0;i3;i+) gets(ai); for(i=0;i3;i+) puts(ai);注意:1、scanf(%d%s,&n,str) 其中%s为字符串格式2、逐个给字符串赋值的方法见书140页。 不可f

28、or(i=0;ai!=0;i+)3、stri=stri-A+10;4、pow函数5、任何进制转为十进制的方法6、输入一个整数n和一个字符串str,计算并输出n进制数str的值。 如输入:7 16则输出:13(16)7=(13)10如输入:16 3A则输出:58(3A)16=(58)10#include stdio.h#include math.hmain() char str81; int n,i,s=0,t; clrscr(); scanf(%d%s,&n,str); for(i=0;stri!=0;i+) if(stri=A) stri=stri-A+10; else stri=stri-

29、0; t=strlen(str); for(i=0;stri!=0;i+) s+=strt-i-1*pow(n,i); printf(%d,s);编写程序,将一个十进制正整数转换成十六进制数。 注意类比#include main()char a20;int x,i=0,j;clrscr();scanf(%d,&x);while(x) if(x%16=10&x%16=0;j-)printf(%c,aj);printf(n);7、输入一个字符串,将其中的缩写形式展开,并输出展开后的该字符串。所谓展开缩写形式就是将其中由大小写字母或数字构成的形如a-f、U-Z、3-8 的形式展开成为 abcdef

30、、UVWXYZ 、345678,若出现f-a、A-7、9-5等形式则不予理睬。例如: 输入:qwe246e-hA-d$-%4-7A-Dz-xp-R4-0输出:qwr246efghA-d$-%4567ABCDz-xp-R4-0main() char a81; int i,c,s,k,t; gets(a); for(i=0;ai!=0;i+) if(ai=-) if(ai-1=A&ai+1=a&ai+1=0&ai+1i;k-)ak+c-2=ak;as-1+c-2+1=0; for(;i=t;i+) ai=ai-1+1; puts(a);补充:循环:求:a+aa+aaa+.的值#includevoi

31、d main()int a,n,i=1,sn=0,tn=0;coutinput a and nan;while(i=n)tn=tn+a;sn+=tn;a*=10;i+;coutthe answer is snendl;两个乒乓球队进行比赛,各出3人。甲队为A,B,C;已对是X,Y,Z;已经抽签决定比赛名单。有人向队员大厅比赛的名单。A说他不和X比,C说他不和X,Z比。请编程序找出3对赛手的名单。#includevoid main()char i,j,k;for(i=X;i=Z;i+)for(j=X;j=Z;j+)if(i!=j)for (k=X;k=Z;k+)if(i!=k&j!=k)if(i

32、!=X&k!=X&k!=Z)coutA-i B-j C-kendl;枚举口袋中有红,黄,蓝,白,黑5种颜色的球若干。每次从口袋中任意取出3歌,问得到3种不同颜色球的可能取法,输出每种排列的情况。#include#include /在C语言中不用加这句void main()enum colorred ,yellow ,blue,white, black;color pri;int i,j,k,n=0,loop;for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for (k=red;k=black;k+)if(k!=i)&(k!=j)n+;cout

33、setw(3)n; /setw是输出格式的限定for(loop=1;loop=3;loop+)switch(loop)case 1:pri=color(i);break;case 2:pri=color(j);break;case 3:pri=color(k);break;default:break;switch(pri)case red:coutsetw(8)red;break;case yellow:coutsetw(8)yellow;break;case blue:coutsetw(8)blue;break;case white:coutsetw(8)white;break;case b

34、lack:coutsetw(8)black;break;default:break;coutendl;couttotal:nendl;数组:不用strcat函数,编写程序,将两个字符串串接起来。#includeusing namespace std;void main()int i=0;char a20,b10;gets(a);gets(b);for(i=0;i10;i+)if(ai=0)break;for(int j=0;j10;j+)ai=bj;i+;if(bj=0)break;coutaendl;输入一行字符,统计其中有多少个单词,单词之间用空格分开。#includeusing namespace std;void ma

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论