1 引言
1.1MATLAB介绍
MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连 接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。 MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++ ,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
1.2MATLAB图像处理工具箱函数介绍
1. imread
imread函数用于读入各种图像文件,如:a=imread('E:\1.jpg)
注:计算机E盘上要有1相应的.jpg文件。
2. imfinfo
imfinfo函数用于读取图像文件的有关信息,如:imfinfo('E:\1.jpg)
3. rgb2grad
rgb2grad()函数用于把真彩图转换为灰度图
4. imshow
imshow函数用于灰度图像文件的显示,如:
i=imread('E:\1.jpg);
imshow(i);
5. imnoise
imnoise函数用于对图像生成模拟噪声,如:
i=imread('E:\1.jpg);
j=imnoise(i,'gaussian',0,0.02);%模拟高斯噪声
5. fspecial
fspecial函数用于产生预定义滤波器,如:
h=fspecial('sobel');%sobel水平边缘增强滤波器
h=fspecial('gaussian');%高斯低通滤波器
h=fspecial('laplacian');%拉普拉斯滤波器
h=fspecial('log');%高斯拉普拉斯(LoG)滤波器
h=fspecial('average');%均值滤波器
6. 中值滤波
medfilt2函数用于图像的中值滤波,如:
i=imread('e:\w01.tif');
j=medfilt2(i);
2 图像的采集
图像以数字形式进入计算机是进行数字图像处理的第一步。一幅黑白图像可以看成是一个二维函数f(x,y),其亮度是位置(x,y)的连续函数。计算机中的数字图像是以矩阵形式[f(m,n)]表示的,不同的处理就是用不同的算法对这一图像矩阵进行运算。从二维连续函数到矩阵,涉及在不同空间位置上取出函数值作为样本,并用一组整数值来表示这些样本的两个过程,前者称为取样,后者称为量化,二者统称为数字化。
根据要求,数据来源于电脑上的图片,将这幅图片保存在路径“F:\CF\1.jpg”,图片命名为1,原始的图片如图1-1所示:
图1 原彩色图像
3 图像的加噪
3.1加入乘性噪声
3.1.1噪声分析与函数使用
现实中,图像在被获取和被传输时常常会受到各种各样的噪声的干扰,按其影响可分为加性噪声和乘性噪声。MATLAB中为图片加乘性噪声的语句是
(1)J = imnoise(I, 'speckle'); (1)
(2)J = imnoise(I, 'speckle',parameters); (2)
其中I为原图象的灰度矩阵,J为加噪声后图象的灰度矩阵;一般情况下用(1)表示即可,(2)中表示是允许修改参数,而(1)中使用缺省参数。
3.1.2代码及其注释
A=imread('F:\CF\1.jpg');
%图像的读入,并将图像数据存入A
B=rgb2gray(A);
%将原彩色图像变成灰度图像,并将图像数据存入B
subplot(2,2,1);
%分割显示窗口,将其分为2X2,将图像放入第一个位置
%给图像加入乘性噪声,并存入Bspeckle
subplot(2,2,2);
%分割显示窗口,将其分为2X2,将图像放入第二个位置
imshow(Bspeckle);title('灰度图像加入乘性噪声后');
%显示加入乘性噪声的图像B,并为其加标题
3.1.3图像仿真
图2 灰度图像与加入乘性噪声后的图像
3.2加入椒盐噪声
3.2.1噪声分析与函数使用
椒盐噪声是一种比较典型的噪声,由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声往往由图像切割引起。MATLAB中为图片加椒盐噪声的语句是
(1)J = imnoise(I, 'salt & pepper'); (3)
(2)J = imnoise(I, 'salt & pepper',parameters); (4)
其中I为原图象的灰度矩阵,J为加噪声后图象的灰度矩阵;一般情况下用(3)表示即可,(4)中表示是允许修改参数,而(式3-4)中使用缺省参数。
3.2.2代码及其注释
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
subplot(2,2,1);
imshow(B);title('原灰度图像');
3.2.3图像仿真
图3 灰度图像与加入椒盐噪声后的图像
3.3加入高斯噪声
3.3.1噪声分析与函数使用
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。MATLAB中为图片加高斯噪声的语句是
(1)J = imnoise(I, 'gaussian'); (5)
(2)J = imnoise(I, 'gaussian',parameters); (6)
(3)J=imnoise(I, 'gaussian',m,v); (7)
其中I为原图象的灰度矩阵,J为加噪声后图象的灰度矩阵一般情况下用(5)表示即可,(6)中表示是允许修改参数,而(5)中使用缺省参数;(7)中对图像I加高斯噪声,均值为m,方差为v。本次课程设计选择的加噪方式为第二种。
3.3.2代码及其注释
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
subplot(2,2,1);
imshow(B);title('原灰度图像');
Bgauss=imnoise(B,'gaussian',0.16);
subplot(2,2,2);
imshow(Bgauss);title('灰度图像加入高斯噪声后');
3.3.3图像仿真
图4 灰度图像与加入高斯噪声后的图像
4图像的去噪
4.1滤波器的介绍
一种较好的图像去噪方法应该既可以消掉噪声影响又不使图像的边缘轮廓和线条变模糊。图像去噪处理方法有空域法和频域法2类。在空间域里一类方法是噪声去除,即先判定某点是否为噪声点,若是,重新赋值,若不是按原值输出;另一类方法是平均,即不依赖于噪声点的识别和去除,而对整个图像进行平均运算。在频率域里是对图像频谱进行修正,一般采用低通滤波方法,而不像在空间域里直接对图像像素灰度级值进行运算,即首先将图像从空间域变换到频率域,然后进行各种各样的处理,再将所得到的结果进行反变换,从而达到图像处理的目的。小波变换是全局变换,在时域或频域中均可从混有强噪声的信号中提取原始信号。本研究对空间域中的均值滤波、中值滤波和自适应滤波3种去噪技术进行分析比较,以下为3种技术的各自去噪原理。
4.1.1均值滤波
也称线性滤波,主要思想为邻域平均法,对图像的任一像素点以其为中心取M×M窗口(M一般取3,5,7,9等奇数) ,即用几个像素灰度的平均值来代替每个像素的灰度。有效抑制加性噪声,但容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理。该方法运算简单,对高斯噪声具有良好的去噪能力。均值滤波法可归结为矩形窗加权的有限冲击响应线性滤波器。第一个“旁瓣”比主峰大约低13分贝。因此,均值滤波器相当于低通滤波器。这种低通性能在平滑噪声的同时也会对图像的高频细节成分造成破坏和损失,使图像模糊。
4.1.2中值滤波
基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,一般为方形邻域,也可以为圆形、十字形等等,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值,这里领域被称为窗口,当窗口移动时,利用中值滤波可以对图像进行平滑处理。其算法简单,时间复杂度低,但其对点、线和尖顶多的图像不宜采用中值滤波。很容易自适应化。中值滤波可以克服线性滤波器给图像带来的模糊,在有效清除颗粒噪声的同时,又能保持良好的边缘特性,从而获得较满意的滤波效果,特别适合于去除图像的椒盐噪声。利用中值滤波算法可以很好地对图像进行平滑处理。对于椒盐噪声密度较小时,尤其是孤立噪声点,用中值滤波的效果非常好,但在椒盐噪声密度增加时,其去噪能力将降低,可能残留下部分噪声像素。虽然可以采用多轮迭代方式对滤波后的图像再次使用中值滤波进行处理,但将造成更大的细节损失。
4.1.3维纳滤波
维纳滤波(N Wiener最早在1942年提出的方法)是一种对退化图像进行恢复处理的一种常用算法,也是最早也最为人们熟知的线性图像复原方法。其设计思想是使输入信号乘响应后的输出,与期望输出的均方误差为最小,是一种自适应滤波器,根据局部方差来调整滤波器效果。对于去除高斯噪声效果明显。其数学形式比较复杂:F(u,v)=[(1/H(u,v))*(|H(u,v)|2)/(|H(u,v)|2+s*[Sn(u,v)/Sf(u,v)])]*G(u,v) (8)
其中Sn(u ,V)表示噪声的功率谱,Sf(u ,V)表示未退化图像的功率谱。在进行实际处理时,往往不知道噪声函数Sn(u,v)和Sf(u,v)的分布情况,因此在实际应用时多用:
F(u,v)=[(1/H(u,v))×(|H(u,v)|2)/(|H(u,v)|2+K)]×G(u,v) (9)
进行近似处理,其中K是一个预先设定的常数。
维纳滤波对高斯噪声、乘性噪声都有明显的抑制作用,相对与均值滤波和中值滤波,维纳滤波对这两种噪声的抑制效果更好,缺点就是容易失去图像的边缘信息。维纳滤波对椒盐噪声几乎没有抑制作用。
4.2去除乘性噪声
4.2.1代码及其注释
A=imread('F:\CF\1.jpg');
%读入图像
B=rgb2gray(A);
%把彩色图像变成灰度图像
Bspeckle=imnoise(B,'speckle');
%加入乘性噪声
h=fspecial('average',3);
%fspecial用于产生预定义滤波器
Bjunzhi=uint8(round(filter2(h,Bspeckle)));
%均值滤波,uin8为变量类型,round为取整,h为滤波参数即均值,h后的变量为要处理的图像
subplot(2,3,1);imshow(B);title('原灰度图像');
subplot(2,3,2);imshow(Bspeckle);title('加入乘性噪声后');
subplot(2,3,3);imshow(Bjunzhi);title('均值滤波后');
subplot(2,3,4);imshow(Bzhongzhi);title('中值滤波后');
subplot(2,3,5);imshow(Bwiener1);title('一次维纳滤波后');
subplot(2,3,6);imshow(Bwiener2);title('二次维纳滤波后');
4.2.2图像仿真
图4 灰度图像,加入乘性噪声后的图像,三种方式滤波后的图像
4.2.3效果分析
对于去除乘性噪声,均值滤波残留的噪声较多,中值滤波虽然效果不错但是处理后较为模糊,维纳滤波效果最好但图像会稍微变暗。
4.3去除椒盐噪声
4.3.1代码及其注释
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
Bsalt=imnoise(B,'salt & pepper');
h=fspecial('average',3);
Bjunzhi=uint8(round(filter2(h,Bsalt)));
Bzhongzhi=medfilt2(Bgauss,[7,7]);
Bwiener1=wiener2(Bgauss,[7,7]);
Bwiener2=wiener2(Bwiener1,[7,7]);
subplot(2,3,1);imshow(B);title('原灰度图像');
subplot(2,3,2);imshow(Bsalt);title('加入椒盐噪声后');
subplot(2,3,3);imshow(Bjunzhi);title('均值滤波后');
subplot(2,3,4);imshow(Bzhongzhi);title('中值滤波后');
subplot(2,3,5);imshow(Bwiener1);title('一次维纳滤波后');
subplot(2,3,6);imshow(Bwiener2);title('二次维纳滤波后');
4.3.2图像仿真
图5 灰度图像,加入椒盐噪声后的图像,三种方式滤波后的图像
4.3.3效果分析
由滤波效果可以看出,以局部中值法为代表的非线性滤波器对滤除椒盐噪声非常有效,但是非线性滤波器对于随机分布强度的噪声及其滤波效果明显变坏。
4.4去除高斯噪声
4.4.1代码及其注释
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
Bgauss=imnoise(B,'gaussian');
h=fspecial('average',3);
Bjunzhi=uint8(round(filter2(h,B)));
Bzhongzhi=medfilt2(Bgauss,[7,7]);
Bwiener1=wiener2(Bgauss,[7,7]);
Bwiener2=wiener2(Bwiener1,[7,7]);
subplot(2,3,1);imshow(B);title('原灰度图像');
subplot(2,3,2);imshow(Bgauss);title('加入高斯噪声后');
subplot(2,3,3);imshow(Bjunzhi);title('均值滤波后');
subplot(2,3,4);imshow(Bzhongzhi);title('中值滤波后');
subplot(2,3,5);imshow(Bwiener1);title('一次维纳滤波后');
subplot(2,3,6);imshow(Bwiener2);title('二次维纳滤波后');
4.4.2图像仿真
图5 灰度图像,加入高斯噪声后的图像,三种方式滤波后的图像
4.4.3效果分析
由滤波结果可以看出,以局部均值法为代表的线性滤波器对滤除高斯噪声非常有效而且窗口越大处理效果越明显,但图像会越来越模糊,7×7的窗口比较合适。然而线性滤波易于破坏图像的边缘及细节信息,且无法滤除颗粒噪声。
附件:MATLAB程序
加入乘性噪声
A=imread('F:\CF\1.jpg');
%图像的读入,并将图像数据存入A
B=rgb2gray(A);
%将原彩色图像变成灰度图像,并将图像数据存入B
subplot(2,2,1);
%分割显示窗口,将其分为2X2,将图像放入第一个位置
imshow(B);title('原灰度图像');
%显示灰度图像B,并为其加标题
Bspeckle=imnoise(B,'speckle');
%给图像加入乘性噪声,并存入Bspeckle
subplot(2,2,2);
%分割显示窗口,将其分为2X2,将图像放入第二个位置
imshow(Bspeckle);title('灰度图像加入乘性噪声后');
%显示加入乘性噪声的图像B,并为其加标题
加入椒盐噪声
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
subplot(2,2,1);
imshow(B);title('原灰度图像');
Bsalt=imnoise(B,'salt & pepper');
subplot(2,2,2);
imshow(Bgauss);title('灰度图像加入椒盐噪声后');
加入高斯噪声
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
subplot(2,2,1);
imshow(B);title('原灰度图像');
Bgauss=imnoise(B,'gaussian',0.16);
subplot(2,2,2);
imshow(Bgauss);title('灰度图像加入高斯噪声后');
去除乘性噪声
A=imread('F:\CF\1.jpg');
%读入图像
B=rgb2gray(A);
%把彩色图像变成灰度图像
Bspeckle=imnoise(B,'speckle');
%加入乘性噪声
h=fspecial('average',3);
%fspecial用于产生预定义滤波器
Bjunzhi=uint8(round(filter2(h,Bspeckle)));
%均值滤波,uin8为变量类型,round为取整,h为滤波参数即均值,h后
的变量为要处理的图像
Bzhongzhi=medfilt2(Bgauss,[7,7]);
%中值滤波
Bwiener1=wiener2(Bgauss,[7,7]);
%第一次维纳滤波
Bwiener2=wiener2(Bwiener1,[7,7]);
%第二次维纳滤波
subplot(2,3,1);imshow(B);title('原灰度图像');
subplot(2,3,2);imshow(Bspeckle);title('加入乘性噪声后');
subplot(2,3,3);imshow(Bjunzhi);title('均值滤波后');
subplot(2,3,4);imshow(Bzhongzhi);title('中值滤波后');
subplot(2,3,5);imshow(Bwiener1);title('一次维纳滤波后');
subplot(2,3,6);imshow(Bwiener2);title('二次维纳滤波后');
去除椒盐噪声
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
Bsalt=imnoise(B,'salt & pepper');
h=fspecial('average',3);
Bjunzhi=uint8(round(filter2(h,Bsalt)));
Bzhongzhi=medfilt2(Bgauss,[7,7]);
Bwiener1=wiener2(Bgauss,[7,7]);
Bwiener2=wiener2(Bwiener1,[7,7]);
subplot(2,3,1);imshow(B);title('原灰度图像');
subplot(2,3,2);imshow(Bsalt);title('加入椒盐噪声后');
subplot(2,3,3);imshow(Bjunzhi);title('均值滤波后');
subplot(2,3,4);imshow(Bzhongzhi);title('中值滤波后');
subplot(2,3,5);imshow(Bwiener1);title('一次维纳滤波后');
subplot(2,3,6);imshow(Bwiener2);title('二次维纳滤波后');
去除高斯噪声
A=imread('F:\CF\1.jpg');
B=rgb2gray(A);
Bgauss=imnoise(B,'gaussian');
h=fspecial('average',3);
Bjunzhi=uint8(round(filter2(h,B)));
Bzhongzhi=medfilt2(Bgauss,[7,7]);
Bwiener1=wiener2(Bgauss,[7,7]);
Bwiener2=wiener2(Bwiener1,[7,7]);
subplot(2,3,1);imshow(B);title('原灰度图像');
subplot(2,3,2);imshow(Bgauss);title('加入高斯噪声后');
subplot(2,3,3);imshow(Bjunzhi);title('均值滤波后');
subplot(2,3,4);imshow(Bzhongzhi);title('中值滤波后');
subplot(2,3,5);imshow(Bwiener1);title('一次维纳滤波后');
subplot(2,3,6);imshow(Bwiener2);title('二次维纳滤波后');