Canny算子

https://zhuanlan.zhihu.com/p/42122107

Canny边缘检测算法

提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算法都是上个世纪的,OpenCV的使用的算法是Canny边缘检测算法,大概是1986年提出了,似乎说明边缘检测算法的研究已经到达了瓶颈期。跟人眼系统相比,边缘检测算法仍然逊色不少。

Canny边缘检测算法是比较出色的算法,它包含以下四个步骤:

  1. 高斯滤波

滤波的主要目的是降噪,一般的图像处理算法都需要先进行降噪。而高斯滤波主要使图像变得平滑(模糊),同时也有可能增大了边缘的宽度。

高斯函数是一个类似与正态分布的中间大两边小的函数。

对于一个位置(m,n)的像素点,其灰度值(这里只考虑二值图)为f(m,n)。

那么经过高斯滤波后的灰度值将变为:

[公式]

简单说就是用一个高斯矩阵乘以每一个像素点及其邻域,取其带权重的平均值作为最后的灰度值。

2. 计算梯度值和梯度方向

边缘是什么?边缘就是灰度值变化较大的的像素点的集合。一道黑边一道白边中间就是边缘,它的灰度值变化是最大的,在图像中,用梯度来表示灰度值的变化程度和方向。

它可以通过点乘一个sobel或其它算子得到不同方向的梯度值 [公式] , [公式] 。

sobel算子:https://blog.csdn.net/qq_37124237/article/details/82183177

综合梯度通过以下公式计算梯度值和梯度方向:

[公式]

[公式]

3. 过滤非最大值

在高斯滤波过程中,边缘有可能被放大了。这个步骤使用一个规则来过滤不是边缘的点,使边缘的宽度尽可能为1个像素点:如果一个像素点属于边缘,那么这个像素点在梯度方向上的梯度值是最大的。否则不是边缘,将灰度值设为0。

4. 使用上下阀值来检测边缘

一般情况下,使用一个阀值来检测边缘,但是这样做未免太武断了。如果能够使用启发式的方法确定一个上阀值和下阀值,位于下阀值之上的都可以作为边缘,这样就可能提高准确度。

它的步骤是这样的。

它设置两个阀值(threshold),分别为maxVal和minVal。其中大于maxVal的都被检测为边缘,而低于minval的都被检测为非边缘。对于中间的像素点,如果与确定为边缘的像素点邻接,则判定为边缘;否则为非边缘。

参考链接:

1.canny edge detector tutorial

2.canny edge detection

3.fundamental of computer vision(p45-p48)

4.edge detection

原文地址:https://www.cnblogs.com/Manuel/p/14602101.html