5.3.3 复杂的边缘检测算子
复杂的边缘检测算子有Canny算子。Canny边缘检测算子是John F.Canny于1986年开发出来的一个多级边缘检测算法。Canny算子检测边缘的方法是寻找图像梯度的局部极大值,梯度是用高斯滤波器的导数计算的。Canny方法使用两个阈值来分别检测强边缘和弱边缘,而且仅当弱边缘与强边缘相连时,弱边缘才会包含在输出中。因此,此方法不容易受噪声的干扰,能够检测到真正的弱边缘。
Canny算子检测边缘的步骤是:①降噪。任何边缘检测算法都不可能在未经处理的原始数据上很好地工作,所以第一步是对原始数据与高斯作卷积操作,得到的图像与原始图像相比有些轻微的模糊。这样,单独的一个像素噪声在经过高斯平滑的图像上变得几乎没有影响。②寻找图像中的亮度梯度。用一阶微分算子(比如Roberts交叉算子、Prewitt算子、Sobel算子)的有限差分来计算梯度的幅值和方向,对于每个点都标识在这个点上的最大值以及生成的边缘的方向。③在图像中跟踪边缘。对梯度幅值进行非极大值抑制,遍历图像,若某个像素的灰度值与其梯度方向上前后两个像素的灰度值相比不是最大,那么这个像素值为0,即不是边缘;使用双阈值算法检测和连接边缘,使用累计直方图计算两个阈值,凡是大于高阈值的一定是边缘;凡是小于低阈值的一定不是边缘;如果检测结果大于低阈值但又小于高阈值,那就要看这个像素的邻接像素中有没有超过高阈值的边缘像素,如果有,则该像素就是边缘,否则就不是边缘。
Canny算子包含许多可以调整的参数,它们将影响到算法的计算的时间与实效。①高斯滤波器的大小。第一步所有的平滑滤波器将会直接影响Canny算子的结果。较小的滤波器产生的模糊效果也较少,这样就可以检测较小、变化明显的细线。较大的滤波器产生的模糊效果也较多,将较大的一块图像区域涂成一个特定点的颜色值。这样带来的结果就是对于检测较大、平滑的边缘更加有用,例如彩虹的边缘。②阈值。使用两个阈值比使用一个阈值更加灵活,但是它还是有阈值存在的共性问题。设置的阈值过高,可能会漏掉重要信息;阈值过低,将会把枝节信息看得很重要。很难给出一个适用于所有图像的通用阈值,目前还没有一个经过验证的实现方法。
为了比较Canny算子和其他边缘算子的相关性能,利用MATLAB图像处理工具箱中提供的边界分割函数edge(),对灰度图像图5-14分别进行Roberts交叉算子、Prewitt算子、Sobel算子、LoG算子、零交叉算子边缘检测,得到图5-15、图5-16、图5-17、图5-18、图5-19,最后用Canny算子得到图5-20的边缘检测结果,可以发现,Canny算子检测产生了最清晰的映射。程序代码如下:
f=imread('boat.jpg');
imshow(f);
g1=edge(f,'roberts');
figure,imshow(g1);
g2=edge(f,'prewitt');
figure,imshow(g2);
g3=edge(f,'sobel');
figure,imshow(g3);
g4=edge(f,'log');
figure,imshow(g4);
g5=edge(f,'zerocross');
figure,imshow(g5);
g6=edge(f,'canny');
figure,imshow(g6)。
图5-14
图5-15
图5-16
图5-17
图5-18
图5-19
图5-20
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。