3.4fspecial函数
功能:
产生预定义滤波器
格式:
H=fspecial(type)
H=fspecial('gaussian',n,sigma) 高斯低通滤波器
H=fspecial('sobel') Sobel水平边缘增强滤波器
H=fspecial('prewitt') Prewitt水平边缘增强滤波器
H=fspecial('laplacian',alpha) 近似二维拉普拉斯运算滤波器
H=fspecial('log',n,sigma) 高斯拉普拉斯(LoG)运算滤波器
H=fspecial('average',n) 均值滤波器
H=fspecial('unsharp',alpha) 模糊对比增强滤波器
说明:
对于形式H=fspecial(type),fspecial函数产生一个由type指定的二维滤波器H,返回的H常与其它滤波器搭配使用。
4.滤波
4.1目的
运用中值滤波克服线性滤波器所带来的图像细节模糊。
4.2使用设备
PC兼容机一台,操作系统为Windows2000(或Windows98,WindowsXP,以下默认为Windows2000)
4.3使用滤波对图像进行增强
4.3.1线性滤波(邻域平均)
线性低通滤波器最常用的是线性平滑滤波器,这种滤波器的所有系数都是正的,也称邻域平均。
邻域平均减弱或消除了傅立叶变换的高频分量,对噪声的消除有所增强,但是由于平均而使图像变得更为模糊,细节的锐化程度逐渐减弱。
下面使用不同的平滑模板对图像进行滤波:
(二维线性滤波fliter2)
程序代码:
I=imread('cameraman.tif');
imshow(I)
title('原始图像')
J=imnoise(I,'salt&pepper'); %添加盐椒噪声,噪声密度为默认值0.05
figure,imshow(J)
title('添加盐椒噪声后的图像')
K1=filter2(fspecial('average',3),J)/255; %应用3×3邻域窗口法
figure,imshow(K1)
title('3×3窗的邻域平均滤波图像')
K2=filter2(fspecial('average',7),J)/255; %应用7×7邻域窗口法
figure,imshow(K2)
title('7×7窗的邻域平均滤波图像')
K3=filter2(fspecial('average',9),J)/255; %应用9×9邻域窗口法
figure,imshow(K3)
title('9×9窗的邻域平均滤波图像')
K4=filter2(fspecial('average',11),J)/255; %应用11×11邻域窗口法
figure,imshow(K4)
title('11×11窗的邻域平均滤波图像')
4.3.2中值滤波
中值滤波可以保留目标边缘,这是中值滤波器相对于均值滤波器的最大优势。
中值滤波具有去噪的性能,可以消除孤立的噪声点,可以用来减弱随机干扰和脉冲干扰,但是边缘不模糊。
程序代码:
I=imread('cameraman.tif');
imshow(I)
title('原始图像')
J=imnoise(I,'salt&pepper',0.02); %添加盐椒噪声,噪声密度为0.02
figure,imshow(J)
title('添加盐椒噪声后的图像')
K1=medfilt2(J); %在默认的3×3的邻域窗中进行中值滤波
figure,imshow(K1)
title('默认的3×3的邻域窗的中值滤波图像')
K2=medfilt2(J,[55]); %在5×5的邻域窗中进行中值滤波
figure,imshow(K2)
title('5×5的邻域窗的中值滤波图像')
从上可见,中值滤波的效果要比邻域平均的低通滤波效果好,中值滤波以后的图像的轮廓比较清晰,而且使用较小的模板得到的视觉效果反而好一些。
4.3.3锐化滤波
图像锐化处理的目的是使模糊图像变得清晰,锐化滤波器减弱或消除了傅立叶空间的低频分量,保留高频分量,从而加强了图像的轮廓,使图像看起来比较清晰。
下面应用Laplacian算子对图像进行锐化处理:
Laplacian算子是线性二次微分算子,其格式为:
h=fspecial('laplacian',alpha),返回一个3×3的滤波器来近似二维Laplacian算子的形状,参数alpha决定了Laplacian算子的形状,alpha的取值范围为0.0~1.0,默认的值为0.2。
程序代码:
%应用Laplacian算子对图像进行锐化
I=imread('cameraman.tif');
imshow(I)
title('原始图像')
H=fspecial('laplacian');
%应用laplacian算子滤波锐化图像
laplacianH=filter2(H,I);
figure,imshow(laplacianH)
title('laplacian算子锐化后的图像')
分析:
由图可以看出,应用了Laplacian算子对图像锐化以后,将图像区域的边缘轮廓勾划了出来,因此Laplacian算子对于边缘检测也具有很好的功效。
5.边缘检测
下面利用sobel算子对图像进行边缘检测:
使用edge函数实现图像的边缘检测,其调用格式为:
BW=edge(I,'sobel',thresh,direction) 根据指定的敏感阈值thresh用Sobel算子对图像进行边缘检测,edge函数忽略了所有小于阈值的边缘,如果没有指定阈值thresh或为空,函数自动选择参数值,direction指定Sobel算子边缘检测的方向,其参数值为'horizontal','vertical'或'both'(默认)。
程序代码:
I=imread('cameraman.tif');
imshow(I)
title('原始图像')
BW=edge(I,'sobel');
%以自动域值选择法对图像进行Sobel算子边缘检测
figure,imshow(BW);
title('自动域值的Sobel算子边缘检测')
[BW,thresh]=edge(I,'sobel');
%返回当前Sobel算子边缘检测的阈值
disp('sobel算子自动选择的阈值为:
')
disp(thresh)
BW1=edge(I,'sobel',0.02,'horizontal');
%以域值为0.02水平方向对图像进行Sobel算子边缘检测
figure,imshow(BW1)
title('域值为0.02的水平方向的sobel算子检测')
BW2=edge(I,'sobel',0.02,'vertical');
%以域值为0.02垂直方向对图像进行Sobel算子边缘检测
figure,imshow(BW2)
title('域值为0.02的垂直方向的sobel算子检测')
BW3=edge(I,'sobel',0.05,'horizontal');
%以域值为0.05水平方向对图像进行Sobel算子边缘检测
figure,imshow(BW3)
title('域值为0.05的水平方向的sobel算子检测')
BW4=edge(I,'sobel',0.05,'vertical');
%以域值为0.05垂直方向对图像进行Sobel算子边缘检测
figure,imshow(BW4)
title('域值为0.05的垂直方向的sobel算子检测')
测试结果图:
sobel算子自动选择的阈值为:
0.1433
由图可以看出,在采用水平和垂直方向的Sobel算子对图像进行边缘检测时,分别对应的水平和垂直方向上的边缘有较强的响应,阈值越小,检测的图像的边缘细节数越多,而增大阈值时,有些轮廓则未能检测出。
其用法和Sobel算子类似。
其调用格式为:
BW=edge(I,'prewitt',thresh,direction)根据指定的敏感阈值thresh用Prewitt算子对图像进行边缘检测。
程序代码:
I=imread('cameraman.tif');
imshow(I)
title('原始图像')
BW=edge(I,'prewitt');
%以自动域值选择法对图像进行Prewitt算子边缘检测
figure,imshow(BW);
title('自动域值的prewitt算子边缘检测')
[BW,thresh]=edge(I,'prewitt');
%返回当前Prewitt算子边缘检测的阈值
disp('prewitt算子自动选择的阈值为:
')
disp(thresh)
BW1=edge(I,'prewitt',0.02,'horizontal');
%以域值为0.02水平方向对图像进行Prewitt算子边缘检测
figure,imshow(BW1)
title('域值为0.02的水平方向的prewitt算子检测')
BW2=edge(I,'prewitt',0.02,'vertical');
%以域值为0.02垂直方向对图像进行Prewitt算子边缘检测
figure,imshow(BW2)
title('域值为0.02的垂直方向的prewitt算子检测')
BW3=edge(I,'prewitt',0.05,'horizontal');
%以域值为0.05水平方向对图像进行Prewitt算子边缘检测
figure,imshow(BW3)
title('域值为0.05的水平方向的prewitt算子检测')
BW4=edge(I,'prewitt',0.05,'vertical');
%以域值为0.05垂直方向对图像进行Prewitt算子边缘检测
figure,imshow(BW4)
title('域值为0.05的垂直方向的prewitt算子检测')
测试结果:
prewitt算子自动选择的阈值为:
0.1399