首页 > 编程知识 正文

sobel边缘检测算法步骤,canny边缘检测原理

时间:2023-05-03 21:47:40 阅读:12494 作者:2311

图像边缘是图像的局部区域的亮度变化明显的部分,该区域的灰度剖面一般可认为是从一个灰度值在小的缓冲区域中急剧变化,然后向另一灰度值变化较大不同的灰度值的步骤。 图像边缘部分聚集了图像的大部分信息,图像边缘的确定和提取对整个图像场景的识别和理解非常重要,同时也是图像分割依赖的重要特征。 边缘检测主要是图像灰度变化的测量、检测和定位,自1959年提出边缘检测以来经过50多年的发展,在许多中存在着不同的边缘检测方法。 基于作者的理解和实践,本文在阐述边缘检测原理的基础上,重点阐述Canny检测算法的实现。

本文所述的内容都是经过编程验证的,在实现过程中,无论有什么错误和不足,大家都会讨论(本文没有论述枯燥的理论证明和数学推导,只从算法的实现和改进来进行原理和工程的描述)。

1、边缘检测原理及步骤

在以往的博文中,作者从一维函数的跳跃检测入手,逐步通俗化地描述了二维图像边缘检测的基本原理。 总之,为了实现图像的边缘检测,使用离散化梯度近似函数从二维灰度矩阵的梯度矢量中寻找图像灰度矩阵的灰度跳跃位置,在图像中连接这些位置的点构成所谓的图像边缘(在这里是图像边缘)

实际上,理想的灰度步长及其线的边缘图像并不常见,但许多传感器器件具有低频滤波特性,从而使步长边缘成为斜坡状边缘,其强度变化看起来不是瞬时的,而是超过了一定的距离。 因此,边缘检测中首先要做的工作是过滤。

1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声敏感,需要采用滤波器来改善与噪声相关的边缘检测器的性能。常见的滤波方法主要有精明的自行车滤波,即采用离散化的精明的自行车函数产生一组归一化的精明的自行车核(具体见《无漏洞自行车滤波原理及其编程离散化实现方法》一文)然后根据无漏洞自行车核函数对图像灰度矩阵的各点进行加权相加(具体程序

2)增强:强调边缘的基础是确定图像各点附近强度的变化值。 增强算法可以增强图像灰度点附近的强度值明显变化的点。在具体编程实现时,可通过计算梯度幅值来确定。

3)检测:在增强的图像中,附近许多点的梯度值往往较大,但在特定的APP应用中,这些点不是我们要找的边缘点,因此必须以某种方式取舍这些点实际工程中,常用的方法是通过阈值化方法来检测。

2、Canny边缘检测算法原理JohnCanny在1986年提出了Canny算子。 这与孝顺画板(LoG )边缘检测方法相似,也是一种先平滑后求导数的方法。 本节介绍上述基于边缘检测过程的Canny检测算法的原理。

2.1 对原始图像进行灰度化Canny算法通常处理灰度图像,如果照相机获取了彩色图像,首先要进行灰度化。 灰度颜色贴图是基于图像中每个通道的采样值进行加权平均。 以RGB格式的彩色图表为例,通常灰度主要采用以下方法:

方法1 ) gray=(rgb )/3;

方法2 )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 可知,要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图1中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。

        作者认为,在理解的过程中需要注意以下两点:

        1)中非最大抑制是回答这样一个问题:“当前的梯度值在梯度方向上是一个局部最大值吗?” 所以,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较;

        2)梯度方向垂直于边缘方向。

        但实际上,我们只能得到C点邻域的8个点的值,而dTmp1和dTmp2并不在其中,要得到这两个值就需要对该两个点两端的已知灰度进行线性插值,也即根据图1中的g1和g2对dTmp1进行插值,根据g3和g4对dTmp2进行插值,这要用到其梯度方向,这是上文Canny算法中要求解梯度方向矩阵Thita的原因。

        完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。
2.5 用双阈值算法检测和连接边缘

        Canny算法中减少假边缘数量的方法是采用双阈值法。选择两个阈值(关于阈值的选取方法在扩展中进行讨论),根据高阈值得到一个边缘图像,这样一个图像含有很少的假边缘,但是由于阈值较高,产生的图像边缘可能不闭合,未解决这样一个问题采用了另外一个低阈值。

        在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像边缘闭合。

        以上即为整个Canny边缘检测算法的原理分析,接下来我们进行VC下的算法实现和效果分析。



版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。