使用sobel、prewitt和roberts算子对图像进行分割实验。
sobel(gv)sobel(gb)sobel(g45)
prewitt(gv)prewitt(gb)prewitt(g45)roberts(gv)roberts(gb)roberts(g45)
图8. 全部结果
四、实验中遇到问题及解决方法
1. 评价一下Roberts 算子、Prewitt 算子、Sobel 算子对于噪声条件下边界检测的性能。 答:Roberts算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感。
Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
Prewitt算子利用像素点上下、左右邻点灰度差,在边缘处达到极值检测边缘。对噪声具有平滑作用,定位精度不够高。
2. 实验中所使用的四种算子所得到的边界有什么异同?
答:算子的存在就是对这种导数分割原理进行的实例化计算,是为了在计算过程中直接使用的一种计算单位。
Roberts算子:边缘定位准,但是对噪声敏感。适用于边缘明显且噪声较少的图像分割。Roberts边缘检测算子是一种利用局部差分算子寻找边缘的算子,Robert算子图像处理后结果
第 6 页 共 11 页
边缘不是很平滑。经分析,由于Robert算子通常会在图像边缘附近的区域内产生较宽的响应,故采用上述算子检测的边缘图像常需做细化处理,边缘定位的精度不是很高。
Prewitt算子:对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子。
Sobel算子:Sobel算子和Prewitt算子都是加权平均,但是Sobel算子认为,邻域的像素对当前像素产生的影响不是等价的,所以距离不同的像素具有不同的权值,对算子结果产生的影响也不同。一般来说,距离越远,产生的影响越小。
Isotropic Sobel算子:加权平均算子,权值反比于邻点与中心点的距离,当沿不同方向检测边缘时梯度幅度一致,就是通常所说的各向同性。
Laplacian算子:这是二阶微分算子。其具有各向同性,即与坐标轴方向无关,坐标轴旋转后梯度结果不变。但是,其对噪声比较敏感,所以,图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。
Laplacian算子一般不以其原始形式用于边缘检测,因为其作为一个二阶导数,Laplacian算子对噪声具有无法接受的敏感性;同时其幅值产生算边缘,这是复杂的分割不希望有的结果;最后Laplacian算子不能检测边缘的方向;所以Laplacian在分割中所起的作用包括:(1)利用它的零交叉性质进行边缘定位;(2)确定一个像素是在一条边缘暗的一面还是亮的一面;一般使用的是高斯型拉普拉斯算子(Laplacian of a Gaussian,LoG),由于二阶导数是线性运算,利用LoG卷积一幅图像与首先使用高斯型平滑函数卷积改图像,然后计算所得结果的拉普拉斯是一样的。所以在LoG公式中使用高斯函数的目的就是对图像进行平滑处理,使用Laplacian算子的目的是提供一幅用零交叉确定边缘位置的图像;图像的平滑处理减少了噪声的影响并且它的主要作用还是抵消由Laplacian算子的二阶导数引起的逐渐增加的噪声影响。 五、实验心得体会
通过这个实验,我熟练学会了利用MatLab 软件进行图像的分割。在通过实验体会到了一些主要的分割算子对图像处理的效果,以及各种因素对分割效果的影响。在评价各主要算子在无噪声条件下和噪声条件下的分割性能下,掌握分割条件(阈值等)的选择。完成规定图像的处理并评价处理结果。 六、源程序清单 %%
%1.使用Roberts 算子的图像分割实验 I=imread('room.tif'); rh=[-1 0; 0 1]; rv=[0 -1; 1 0];
g45=imfilter(double(I),rh,'replicate'); g135=imfilter(double(I),rv,'replicate'); subplot(3,2,1);
第 7 页 共 11 页
imshow(g45,[]); title('g45'); subplot(322); imshow(g135,[]); title('g135'); %计算梯度模
%(1)欧几里得距离计算梯度模 OD=sqrt(g45.^2+g135.^2); subplot(323); imshow(OD,[]);
title('(1)欧几里得距离计算梯度模');
T=0.1*max(OD(:)); BWOD=OD>T; subplot(324); imshow(BWOD);
title('(1)欧几里得距离计算梯度模二值化'); %(2)街区距离计算梯度摸 JD=abs(g45)+abs(g135); subplot(325); imshow(JD,[]);
title('(2)街区距离计算梯度模'); T=0.1*max(JD(:)); BWOD=OD>T; subplot(326); imshow(BWOD);
title('(2)街区距离计算梯度模二值化'); %%
%2.使用Prewitt 算子的图像分割实验 I=imread('room.tif'); rh=[-1 -1 -1;0 0 0;1 1 1]; rv=[-1 0 1 ;-1 0 1;-1 0 1];
g45=imfilter(double(I),rh,'replicate'); g135=imfilter(double(I),rv,'replicate'); subplot(3,2,1); imshow(g45,[]); title('g45'); subplot(322); imshow(g135,[]); title('g135'); %计算梯度模
%(1)欧几里得距离计算梯度模
OD=sqrt(g45.^2+g135.^2); subplot(323);
第 8 页 共 11 页
imshow(OD,[]);
title('(1)欧几里得距离计算梯度模');
T=0.1*max(OD(:)); BWOD=OD>T; subplot(324); imshow(BWOD);
title('(1)欧几里得距离计算梯度模二值化');
%(2)街区距离计算梯度模 JD=abs(g45)+abs(g135); subplot(325); imshow(JD,[]);
title('(2)街区距离计算梯度模'); T=0.1*max(JD(:)); BWOD=OD>T; subplot(326); imshow(BWOD);
title('(2)街区距离计算梯度模二值化'); %%
%3.使用Sobel 算子的图像分割实验 I=imread('room.tif'); rh=[-1 -2 -1;0 0 0;1 2 1]; rv=[-1 0 1 ;-2 0 2;-1 0 1];
g45=imfilter(double(I),rh,'replicate'); g135=imfilter(double(I),rv,'replicate'); subplot(3,2,1); imshow(g45,[]); title('g45'); subplot(322); imshow(g135,[]); title('g135'); %计算梯度模
%(1)欧几里得距离计算梯度模 OD=sqrt(g45.^2+g135.^2); subplot(323); imshow(OD,[]);
title('(1)欧几里得距离计算梯度模');
T=0.1*max(OD(:)); BWOD=OD>T; subplot(324); imshow(BWOD);
title('(1)欧几里得距离计算梯度模二值化'); %(2)街区距离计算梯度摸 JD=abs(g45)+abs(g135); subplot(325);
第 9 页 共 11 页
imshow(JD,[]);
title('(2)街区距离计算梯度模'); T=0.1*max(JD(:)); BWOD=OD>T; subplot(326); imshow(BWOD);
title('(2)街区距离计算梯度模二值化'); %%
%4.使用LoG (拉普拉斯-高斯)算子的图像分割实验 f=imread('room.tif');
[gv,t1]=edge(f,'log','vertical');%使用edge函数对图像f提取垂直边缘 subplot(1,3,1);imshow(gv);title('gv');
[gb,t2]=edge(f,'log','horizontal');%使用edge函数对图像f提取水平边缘 subplot(1,3,2);imshow(gb);title('gb');
w45=[-2 -1 0;-1 0 1;0 1 2];%指定模版使用imfilter计算45度方向的边缘 g45=imfilter(double(f),w45,'replicate'); T=0.3*max(abs(g45(:))); %设定阈值 g45=g45>=T; %进行阈值处理
subplot(1,3,3);imshow(g45);title('g45'); %%
%5打印全部结果并进行讨论。
%使用sobel、prewitt和roberts算子对图像进行分割实验。 f=imread('room.tif');
[gv,t1]=edge(f,'sobel','vertical');%使用edge函数对图像f提取垂直边缘 subplot(1,3,1);imshow(gv);title('sobel(gv)');
[gb,t2]=edge(f,'sobel','horizontal');%使用edge函数对图像f提取水平边缘 subplot(1,3,2);imshow(gb);title('sobel(gb)');
w45=[-2 -1 0;-1 0 1;0 1 2];%指定模版使用imfilter计算45度方向的边缘 g45=imfilter(double(f),w45,'replicate'); T=0.3*max(abs(g45(:))); %设定阈值
g45=g45>=T; %进行阈值处理
subplot(1,3,3);imshow(g45);title('sobel(g45)'); %%
%使用prewitt算子对图像进行分割实验。 f=imread('room.tif');
[gv2,t3]=edge(f,'prewitt','vertical');%使用edge函数对图像f提取垂直边缘 subplot(1,3,1);imshow(gv2);title('prewitt(gv)');
[gb2,t4]=edge(f,'prewitt','horizontal');%使用edge函数对图像f提取水平边缘 subplot(1,3,2);imshow(gb2);title('prewitt(gb)');
w45=[-2 -1 0;-1 0 1;0 1 2];%指定模版使用imfilter计算45度方向的边缘 g45=imfilter(double(f),w45,'replicate'); T=0.3*max(abs(g45(:))); %设定阈值
g45=g45>=T; %进行阈值处理
subplot(1,3,3);imshow(g45);title('prewitt(g45)');
第 10 页 共 11 页
%%
%使用roberts算子对图像进行分割实验。 f=imread('room.tif');
[gv3,t5]=edge(f,'roberts','vertical');%使用edge函数对图像f提取垂直边缘 subplot(1,3,1);imshow(gv3);title('roberts(gv)');
[gb3,t6]=edge(f,'roberts','horizontal');%使用edge函数对图像f提取水平边缘 subplot(1,3,2);imshow(gb3);title('roberts(gb)');
w45=[-2 -1 0;-1 0 1;0 1 2];%指定模版使用imfilter计算45度方向的边缘 g45=imfilter(double(f),w45,'replicate'); T=0.3*max(abs(g45(:))); %设定阈值
g45=g45>=T; %进行阈值处理
subplot(1,3,3);imshow(g45);title('roberts(g45)'); %%
%图像像素值的标定
I=imread('room.tif'); rh=[-1 0; 0 1]; rv=[0 -1; 1 0];
g45=imfilter(double(I),rh,'replicate'); subplot(121); imshow(g45);
title('未标定');
cg45=(g45-min(g45(:)))/(max(g45(:))-min(g45(:))); subplot(122); imshow(cg45); title('已标定');
第 11 页 共 11 页