图像边缘是指图像局部区域亮度变化明显的部分。该区域的灰度剖面一般可视为一个阶跃,从一个小缓冲区域的灰度值急剧变化到另一个灰度差较大的灰度值。图像的边缘集中了图像的大部分信息。图像边缘的确定和提取对于识别和理解整个图像场景非常重要,也是图像分割所依赖的重要特征。边缘检测主要是测量、检测和定位图像的灰度变化。自1959年提出边缘检测以来,经过50多年的发展,有许多不同的边缘检测方法。根据作者的理解和实践,本文描述了边缘检测的原理,重点是在此基础上Canny详细介绍了检测算法的实现情况。
本文所述内容均由编程验证。在实现过程中,我们将讨论任何错误或缺点(本文不讨论无聊的理论证明和数学推导,只描述算法的实现和改进)。
1.边缘检测的原理和步骤
在之前的博客文章中,作者逐步描述了二维图像边缘检测的基本原理。结论是:实现图像边缘检测,是利用离散梯度接近函数根据二维灰度矩阵梯度向量找到图像灰度矩阵灰度跳转位置,然后连接图像中的点构成所谓的图像边缘(图像边缘是一个总称,包括边缘、角、纹理等基元图)。
在实践中,理想的灰度阶跃和线条边缘图像很少见到。同时,大多数传感器具有低频滤波特性,这将使阶跃边缘变成斜坡边缘。强度变化似乎不是瞬间的,而是跨越了一定的距离。这使得边缘检测的第一项工作是滤波器。
1)滤波器:边缘检测算法主要是基于图像强度的一级和二级导数,但导数通常对噪声非常敏感,因此必须使用滤波器来提高与噪声相关的边缘检测器的性能。常用的滤波方法主要包括高斯滤波,即利用离散高斯函数生成一组集成高斯核(见高斯滤波原理及其编程离散实现方法),然后根据高斯核函数加权图像灰度矩阵的每一点(见下文)。
2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以突出图像灰度点邻域强度值的显著变化点。在实现具体编程时,可以通过计算梯度振幅来确定。
3)检测:增强图像后,邻里很多点的梯度值往往比较大,但在特定的应用中,这些点不是我们需要找到的边缘点,所以我们应该用某种方法来选择这些点。在实际工程中,常用的方法是通过阈值检测。
2、Canny边缘检测算法原理
JohnCanny于1986年提出Canny算子,它与Marr(LoG)边缘检测方法相似,也属于先平滑后求导数的方法。根据上述边缘检测过程,本节对Canny介绍了检测算法的原理。
2.1 灰度化原始图像
Canny算法通常处理的图像是灰度图,所以如果相机获得彩色图像,则必须首先进行灰度化。灰度化彩色图是根据图像各通道的采样值加权平均值。RGB以格式彩图为例,灰度化的主要方法有:
方法1:Gray=(R G B)/3;
方法2:Gray=0.299R 0.587G 0.114B;(考虑到人眼的生理特生理特征)
注1:对于其他格式的彩色图像,可以根据相应的转换关系转换为RGB然后灰度化;
注意2:在编程时要注意图像格式中RGB顺序通常是BGR。
2.2 对图像进行高斯滤波
图像高斯滤波器的实现可以用两个一维高斯核加权两次,也可以用一个二维高斯核卷积一次。
1)高斯核实现
上式是离散化的一维高斯函数,可以通过确定参数获得一维核向量。
上式为离散化二维高斯函数,确定参数即可获得二维核向量。
注1:关于参数Sigma详见上一篇博文。
注意2:在求的高斯核后,要对整个核进行归一化处理。
2)图像高斯滤波器
对图像进行高斯滤波听起来很神秘。事实上,它是根据待滤波的像素点及其邻域点的灰度值按一定参数规则加权的平均值。这可以有效地过滤理想图像中叠加的高频噪声。
通常,滤波器和边缘检测是一个矛盾的概念,抑制噪声会使图像边缘模糊,这增加了边缘定位的不确定性;如果要提高边缘检测的灵敏度,也要提高噪声的灵敏度。实际工程经验表明,高斯函数确定的核可以在抗噪声干扰和边缘检测精确定位之间提供更好的折衷。这就是所谓的高斯图像过滤器,具体的实现代码如下。
2.3 梯度的振幅值和方向由一步偏导的有限差计算
对于图像灰度值梯度,可以使用一阶有限的差异进行近似,使图像在x和y两个方向偏差导数的矩阵。常用的梯度算子如下:
1)Roberts算子
上式为x和y方向偏导数计算模板,每个点的梯度幅值可以通过数学公式表达:
2)Sobel算子
上三个矩阵分别是该算子的x向卷积模板,y将矩阵标记在待处理点的卷积模板和邻域点上,每个点的梯度幅值可以通过数学公式来表达:
3)Prewitt算子
和Sobel同样的算子原理,理相同的卷积模板。
4)Canny算法采用的方法
本文实现的Canny算法中使用的卷积算子相对简单,表达如下:
其x向、y梯度幅值和梯度方向的数学表达式为:
找出这些矩阵后,就可以进行下一个检测过程。
2.4 非极大的梯度幅值抑制
图像梯度幅度矩阵中的元素值越大,图像中的梯度值越大,但这并不意味着点是边缘(这只是图像增强的过程)。Canny在算法中,非极大值抑制是边缘检测的重要步骤。一般来说,它是指找到局部像素点的最大值,将非极大值对应的灰度值放置为0,以消除大部分非边缘点(这是我的理解)。
图1 非极大值抑制原理
根据图1 可以看出,要抑制非极大值,首先要确定8值邻域中像素点C的灰度值是否最大。图1中的蓝线方向为C点的梯度方向,以确定其局部最大值必须分布在线上,即在C点外的梯度方向的交点dTmp1和dTmp这两点的值也可能是局部最大值。因此,通过判断C点灰度和这两点灰度的大小,我们可以判断C点是否是邻局部最大灰度点。判断后,C点灰度值小于这两点中的任何一点,说明C点不是局部极大值,所以C点可以排除为边缘。这是非极大值抑制的工作原理。
作者认为,在理解过程中应注意以下两点:
1)中非最大的抑制就是回答这样一个问题:当前梯度值是梯度方向的局部最大值吗? 因此,将当前位置的梯度值与梯度方向上两侧的梯度值进行比较;
2)梯度方向垂直于边缘方向。
但实际上,我们只能得到C点邻域的8点值,而dTmp1和dTmp2不在其中。为了获得这两个值,需要线性插入两点两端的已知灰度,即根据图1g1和g2对dTmp根据插值g3和g4对dTmp用于插值,这是上文Canny该算法要求梯度方向矩阵Thita的原因。
在完成非极大值抑制后,将得二值图像,非边缘点灰度值为0,可设置为128。根据下面的具体测试图像,这样的测试结果仍然包含了许多由噪声和其他原因引起的假边缘。因此,需要进一步处理。
2.5 用双阈值算法检测和连接边缘
Canny算法中减少假边缘数量的方法是采用双阈值法。选择两个阈值(在扩展过程中讨论阈值的选择方法),并根据高阈值获得边缘图像。这样的图像含有很少的假边缘,但由于阈值较高,图像边缘可能不闭合,另一个低阈值没有得到解决。
将边缘链接到高阈值图像的轮廓中。当到达轮廓的端点时,算法会在断点的8个邻域点中找到满足低阈值的点,然后收集新的边缘,直到整个图像边缘关闭。
以上就是全部Canny边缘检测算法的原理分析,然后我们进行VC下的算法实现和效果分析。