常用的边缘提取算子如下:
(1).罗伯特(Robert)算子Robert 算子是一种利用局部差分算子寻
找边缘的算子,该算子对具有陡峭的低噪声的图像效果较好。 (2).Sobel 算子和Prewitt 算子
为在检测边缘的同时减少噪声的影响,Prewitt 从加大边缘检测算子的模板大小出发,由2×2 扩大到3×3 来计算差分算子,如表2所示。采用Prewitt 算子不仅能检测边缘点, 而且能抑制噪声的影响。Sobel 在Prewitt 算子的基础上,采用带权的方法计算差分,该算子不仅能检测边缘点,而且能进一步抑制噪声影响,但检测的边缘较宽。 (3)Canny 算子
Canny 算了检测边缘的方法是寻找图像梯度的局部极大值,梯度是用高斯滤波器的导数计算的。该方法使用两个阈值来分别检测强边缘和弱边缘,而且仅当弱边缘与强边缘相连时,弱边缘才会包含在输出中。此方法不容易受噪声的干扰,能够检测到真正的弱边缘。因此,Canny 算子在图像处理中应用越来越广泛。它依据图像边缘检
4.4.2 几种边缘检测算子的比较
常用的边界检测算子有罗伯特(Robert)算子、Sobel 算子和canny算子。在MATLAB中,系统提供edge函数,其功能是利用各种边界检测算子来检测灰度图像的边界。 函数edge的用法有以下几种: 1.BW=edge(I);
16
2.BW=edge(I,method); 3.BW=edge(I,method,thresh); 4.BW=edge(I,method,thresh,direction) 其中:
I:输入图像;
method:提取边界的方法,共有六种可取的值,即共有六种可使
用:’sobel’,’prewitt’,’roberts’,’log’,’zerocross’,’canny’,缺省时使用’sobel’;
thresh:指定的阈值,所有不强于thresh的边都被忽略; direction:对于’sobel’和’prewitt’方法指定方向,可取为:’horizontal’
和’vertical’,’both’(缺省值)
BW:返回的二值图像,其中1代表找到的边界。
在这些方法中,canny是较为优秀的一种,该方法使用两种不同的阈值分别检测强边界和弱边界,并且仅当弱边界和强边界相连时,才将弱边界包含在输出图像中。因此,这种方法不容易被噪声干扰,更容易检测到真正的弱边界。
分别调用’sobel’,’prewitt’,’roberts’,’log’,’zerocross’和’canny’六种方法检测图像rice.tif的边界。 程序如下: I=imread('rice.tif'); BW1=edge(I,'sobel'); BW2=edge(I,'prewitt'); BW3=edge(I,'roberts'); BW4=edge(I,'log'); BW5=edge(I,'zerocross');
17
BW6=edge(I,'canny');
imshow(I);title('图1: rice.tif原图','fontsize',14,'position',[128,280,0]); figure;imshow(BW1);title('图2: sobel算子提取的边界','fontsize',14,'position',[128,280,0])
figure;imshow(BW2);title('图3: prewitt算子提取的边界','fontsize',14,'position',[128,280,0])
figure;imshow(BW3);title('图4: roberts算子提取的边界','fontsize',14,'position',[128,280,0])
figure;imshow(BW4);title('图5: log算子提取的边界','fontsize',14,'position',[128,280,0])
figure;imshow(BW5);title('图6: zerocross算子提取的边界','fontsize',14,'position',[128,280,0])
figure;imshow(BW6);title('图7: canny算子提取的边界','fontsize',14,'position',[128,280,0]) 运行结果如下:
图7 图 8 图 9
18
图 10 图 11 图 12
图 13
从上面结果我们可以看出,canny算子提取的边界较为完整。 在不用edge中第三种参数时,系统自动选择阈值,我们可以用函数的如下调用格式来看系统为我们选择的阈值是多少,我们先看如下程序为我们带来的结果:
I=imread('rice.tif');
[BW1,th1]=edge(I,'sobel'); th1str=num2str(th1) imshow(I);
title('图1: rice.tif原图','fontsize',14,'position',[128,280,0]); figure;imshow(BW1);
ti='图8: sobel算子提取的边界,阈值为'; ti=strcat(ti,th1str)
title(ti,'fontsize',12,'position',[128,280,0])
19
图 14 图 15
我们将上面的程序中第二行换成 [BW1,th1]=edge(I,'sobel',0.05);
即可得到图15的结果。我们看到,边界提取得比图14要完整,因此,我们还可以通过调整阈值来改善边界提取得结果。
4.5飞机边界的提取与叠加
通过对几种边缘检测算子的比较,我们找到哪一种最优的解决方案,并完成呢边界的提取然后运用图像的几何操作完成最终的设计任务 程序见附录,效果如下图:
图 16 图 17
20