Canny算法
图像的边缘检测算法
前段时间通过《OpenCV 4 快速入门》一书学习opencv,在漫长的学习过程中,我获知了很多opencv的知识,在此特别感谢《OpenCV 4 快速入门》作者和csdn上的一些博主。今天,我想和大家简单聊一聊非常强悍的图像边缘检测算法Canny。
参考文献:canny算法_百度百科 (baidu.com) 、
《OpenCV 4 快速入门》、canny算法原理_jialeheyeshu的博客-CSDN博客_canny算子的原理
-
Canny算法 简介:
Canny算子 是 John F. Canny 于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论 解释这项技术如何工作。
Canny算法 不容易受到噪声的影响,能够识别图像中的弱边缘和强边缘,并结合强弱边缘的位置关系,综合给出图像整体的边缘信息。Canny边缘检测算法 是目前最优越的边缘检测算法之一。
-
Canny算法 步骤:
① 图像滤波降噪:
图像滤波降噪操作可谓是所有边缘检测算法的必备第一步,在Canny算法 中也不例外:使用高斯滤波平滑图像,减少图像噪声。
② 像素梯度计算:
根据高等数学知识可知,梯度方向即方向导数取最大值的方向,而图像的边缘指的是图像中像素灰度值函数的导函数取最大值的区域,二者相互对应。因此,Canny算法 通过Sobel算子 分别检测图像 X 方向和 Y 方向的边缘,检测到边缘后,我们会发现表示边缘区域的线条通常会很粗,难以标定边缘的确切位置,故而还应该记录梯度的方向。总而言之,在像素梯度计算时,我们应当记录两份数据:一是梯度的大小,二是梯度的方向。以下分别展示梯度的大小和方向计算公式 以及X方向一阶Sobel边缘检测算子 (图10-12 b)和 Y方向一阶Sobel边缘检测算子 (图10-12 a)
G = s q r t ( G x 2 + G y 2 ) G=sqrt(Gx^2 + Gy^2) G=sqrt(Gx2+Gy2)
θ = a r c t a n ( G y / G x ) θ=arctan(Gy/Gx) θ=arctan(Gy/Gx)

③ 消除杂散响应:
图像梯度幅值矩阵中的元素值越大,只能说明图像中该点的梯度值越大,但这并不能说明该点就是边缘。因此,Canny算法 运用第 ②步所得的梯度方向,将当前像素的梯度大小与沿正负梯度方向上的两个像素进行比较,如果当前像素的梯度大于另外两个像素的梯度 ,就将该像素点保留为边缘点,否则该像素点将被抑制。
以上内容可能会比较抽象,我当时学习的过程中也有些困惑,下面分享一位大佬的理解:
canny算法原理_jialeheyeshu的博客-CSDN博客_canny算子的原理
http://hi.csdn.net/attachment/201110/20/0_1319119291xBLz.gif
根据图1(可由上一个链接查看)可知,要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。
总而言之,我认为非极大值抑制算法就是一种选择算法,选择的标准是:像素灰度值是否为局部最大值,若为局部最大值,则保留该边缘点,否则将其像素灰度值置为0,即将其抑制。
④ 划分强弱边缘:
在实际操作的过程中,我们会发现经过非极大值抑制处理后的图像会存在噪声,Canny算法 运用双阈值法(即设定一个阈值上界和阈值下界),然后将边缘处的梯度值与两个阈值作比较,如果大于阈值上界则标记为强边缘,小于阈值下界则去除,两者之间的则标记为弱边缘,需要做进一步检测。
⑤ 消除孤立弱边缘:
在弱边缘的 8-领域 范围内寻找强边缘,能找到则保留该弱边缘,否则将删除该弱边缘。我认为:孤立弱边缘可能是一些未被消除的噪声点,或者是图像的一些孤立区域,这些边缘不具有提取价值,应当被消除。另外,补充 8-领域 的定义:点P(x,y)的 8-领域 共有8个像素点,分别是(x-1,y+1)、(x,y+1) 、(x+1,y+1)、(x-1,y)、(x+1,y)、(x-1,y-1)、(x,y-1)、(x+1,y-1)。
-
总结:
以上就是身为CV入门小白的我对 Canny算法 的一些理解和归纳,如果有讲得不好的地方,欢迎各位大佬指导纠正。
Canny算法是一种1986年由John F. Canny提出的多级边缘检测算法,以其抗噪声能力强和能准确识别图像边缘而著名。算法主要包括图像滤波降噪、像素梯度计算、消除杂散响应、划分强弱边缘和消除孤立弱边缘五个步骤。通过高斯滤波减少噪声,使用Sobel算子计算梯度,然后进行非极大值抑制和双阈值法来确定边缘。最后,通过8-领域查找保留边缘,确保边缘的连贯性。
2万+

被折叠的 条评论
为什么被折叠?



