简单3步,轻松学会图象边缘检测

一、边缘检测的概念

边缘检测是图像处理与计算机视觉中极为重要的一种分析图像的方法,至少在我做图像分析与识别时,边缘是我最喜欢的图像特征。边缘检测的目的就是找到图像中亮度变化剧烈的像素点构成的集合,表现出来往往是轮廓。如果图像中边缘能够精确的测量和定位,那么,就意味着实际的物体能够被定位和测量,包括物体的面积、物体的直径、物体的形状等就能被测量。在对现实世界的图像采集中,有下面4种情况会表现在图像中时形成一个边缘。

  1. 深度的不连续(物体处在不同的物平面上);
  2. 表面方向的不连续(如正方体的不同的两个面);
  3. 物体材料不同(这样会导致光的反射系数不同);
  4. 场景中光照不同(如被树萌投向的地面);

上面的图像是图像中水平方向7个像素点的灰度值显示效果,我们很容易地判断在第4和第5个像素之间有一个边缘,因为它俩之间发生了强烈的灰度跳变。在实际的边缘检测中,边缘远没有上图这样简单明显,我们需要取对应的阈值来区分出它们。

原图

Roberts边缘

Prewitt边缘

Sobel边缘

Log边缘

Canny边缘

二、边缘检测的基本方法2.1 一阶微分边缘算子

一阶微分边缘算子也称为梯度边缘算子,它是利用图像在边缘处的阶跃性,即图像梯度在边缘取得极大值的特性进行边缘检测。梯度是

一个矢量,它具有方向θ 和模| Δ I | :

梯度的方向提供了边缘的趋势信息,因为梯度方向始终是垂直于边缘方向,梯度的模值大小提供了边缘的强度信息。

在实际使用中,通常利用有限差分进行梯度近似。对于上面的公式,我们有如下的近似:

2.2 Roberts边缘检测算子

1963年,Roberts提出了这种寻找边缘的算子。Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。从图像处理的实际效果来看,边缘定位较准,对噪声敏感。在Roberts检测算子中:

可以导出Roberts在点( i + 1 / 2 , j + 1 / 2 ) 处的水平与竖直边缘检测卷积核为:

2.3 Prewitt边缘检测算子

Prewitt利用周围邻域8个点的灰度值来估计中心的梯度,它的梯度计算公式如下:

所以,Prewitt的卷积核为:

2.4 Sobel边缘检测算子

比起Prewitt算子,Sobel也是用周围8个像素来估计中心像素的梯度,但是Sobel算子认为靠近中心像素的点应该给予更高的权重,所以Sobel算子把与中心像素4邻接的像素的权重设置为2或-2。

Sobel边缘检测算子的卷积核为:

Sobel进行边缘检测的实现可以参考我原来写的一篇博文:图像特征检测:sobel边缘检测,重要的是梯度图像计算后的阈值的确定与边缘的非极大值抑制算法,Roberts与Prewitt原理与sobel一致。

Sobel边缘检测的C++实现:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/sobel.cpp

三、二阶微分算子

学过微积分我们都知道,边缘即是图像的一阶导数局部最大值的地方,那么也意味着该点的二阶导数为零。二阶微分边缘检测算子就是利用图像在边缘处的阶跃性导致图像二阶微分在边缘处出现零值这一特性进行边缘检测的。

‍‍对于图像的二阶微分可以用拉普拉斯算子来表示:

我们在像素点 ( i , j ) 的3 × 3 的邻域内,可以有如下的近似:

对应的二阶微分卷积核为:

所以二阶微分检测边缘的方法就分两步:1)用上面的Laplace核与图像进行卷积;2)对卷积后的图像,取得那些卷积结果为0的点。

虽然上述使用二阶微分检测边缘的方法简单,但它的缺点是对噪声十分敏感,同时也没有能够提供边缘的方向信息。为了实现对噪声的抑制,Marr等提出了LOG的方法。

为了减少噪声对边缘的影响,首先图像要进行低通滤波,LOG采用了高斯函数作为低通滤波器。高斯函数为:

上面的公式中σ 决定了对图像的平滑程度。高斯函数生成的滤波模板尺寸一般设定为6 σ + 1 (加1是会了使滤波器的尺寸为奇数)。使用高斯函数对图像进行滤波并对图像滤波结果进行二阶微分运算的过程,可以转换为先对高斯函数进行二阶微分,再利用高斯函数的二阶微分结果对图像进行卷积运算:

关于LOG算子的计算在上一篇文章:图像特征提取:斑点检测中有实现的代码。

四、 Canny边缘检测

canny边缘检测实际上是一种一阶微分算子检测算法,但为什么这里拿出来说呢,因为它几乎是边缘检测算子中最为常用的一种,也是个人认为现在最优秀的边缘检测算子。Canny提出了边缘检测算子优劣评判的三条标准:

  • 高的检测率。边缘检测算子应该只对边缘进行响应,检测算子不漏检任何边缘,也不应该将非边缘标记为边缘。
  • 精确定位。检测到的边缘与实际边缘之间的距离要尽可能的小。
  • 明确的响应。对每一条边缘只有一次响应,只得到一个点。

Canny边缘检测之所以优秀是因为它在一阶微分算子的基础上,增加了非最大值抑制和双阈值两项改进。利用非极大值抑制不仅可以有效地抑制多响应边缘,而且还可以提高边缘的定位精度;利用双阈值可以有效减少边缘的漏检率。

Canny边缘检测主要分四步进行:

  1. 去噪声;
  2. 计算梯度与方向角;
  3. 非最大值抑制;
  4. 滞后阈值化;

其中前两步很简单,先用一个高斯滤波器对图像进行滤波,然后用Sobel水平和竖直检测子与图像卷积,来计算梯度和方向角。

非极大值抑制

图像梯度幅值矩阵中的元素值越大,说明图像中该点的梯度值越大,但这不不能说明该点就是边缘(这仅仅是属于图像增强的过程)。在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,通俗意义上是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点。

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

在理解的过程中需要注意以下两点:

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

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

滞后阈值化

由于噪声的影响,经常会在本应该连续的边缘出现断裂的问题。滞后阈值化设定两个阈值:一个为高阈值T h ,一个为低阈值T l 。如果任何像素边缘算子的影响超过高阈值,将这些像素标记为边缘;响应超过低阈值(高低阈值之间)的像素,如果与已经标记为边缘的像素4-邻接或8-邻接,则将这些像素也标记为边缘。所以不整个过程描述如下:

  1. 如果该像素的梯度值小于 T l ,则该像素为非边缘像素;
  2. 如果该像素的梯度值大于 T h ,则该像素为边缘像素;
  3. 如果该像素的梯度值介于 T l 与 T h 之间,需要进一步检测该像素的 3 × 3 邻域内的8个点,如果这8个点内有一个或以上的点梯度超过了 T h ,则该像素为边缘像素,否则不是边缘像素。

Canny边缘检测的实现

https://github.com/RonnyYoung/ImageFeatures/blob/master/source/canny.cpp

原文发布于微信公众号 - BestSDK(bestsdk)

原文发表时间:2018-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SIGAI学习与实践平台

Large scale GAN training for high fidelity natural image synthesis解读

尽管最近几年在生成式图像建模上取得了进步,但从ImageNet这样的复杂数据集生成高分辨率、多样化的图像仍然是一个具有挑战性的工作。为了达到这一目标,本文作者训...

1883
来自专栏AI科技评论

从LeNet到SENet——卷积神经网络回顾

AI 科技评论按:本文为浙江大学范星为 AI 科技评论撰写的独家稿件,未经许可不得转载。 从 1998 年经典的 LeNet,到 2012 年历史性的 Alex...

4424
来自专栏机器之心

卷积神经网络「失陷」,CoordConv来填坑

Uber 利用卷积神经网络解决许多方面的问题,其中就包括坐标变换。从自动驾驶汽车的设计到路标的自动检测、再到地图的绘制,Uber 都需要使用卷积网络完成坐标变换...

1333
来自专栏专知

【专知-PyTorch手把手深度学习教程04】GAN快速理解与PyTorch实现: 图文+代码

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

59911
来自专栏AI科技评论

开发 | 深度学习中的“深度”究竟怎么理解?

AI科技评论按:本文原作者 YJango,本文原载于其知乎专栏——超智能体。AI科技评论已获得原作者授权。 介绍 为了研究神经网络,我们必须要对什么网络是什么有...

3067
来自专栏AI研习社

深度神经网络中的对抗样本与学习

概述 最近大半年,人工智能领域成为科技领域提到的最多的名词之一。在kdnuggets此前发布的文章 (Deep Learning’s Deep Flaws)...

38112
来自专栏算法channel

爱(AI)与你同行系列"(1):从哪三个方面入手做好特征选择工程?

今天我们聊一聊特征工程方面的知识,随着大数据时代的到来,特征工程发挥着越来越重要的作用。当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行...

1012
来自专栏机器之心

专栏 | 后RCNN时代的物体检测及实例分割进展

6008
来自专栏WD学习记录

牛客网 机器学习题目

SVM核函数:线性核函数、多项式核函数、径向基核函数、高斯核函数、幂指数核函数、拉普拉斯核函数、ANOVA核函数、二次有理核函数、多元二次核函数、逆多元二次核函...

1703
来自专栏AI深度学习求索

想不想让你拍的照片秒变宫崎骏风格漫画,一起来看看CartoonGAN

让我们观察一下上面这张图片,仔细看一看,两张图片有什么不同,看出来了吧?右边这幅图明显不像现实中的车辆嘛,是不是很像漫画呢?有了这个CartoonGAN,漫画家...

3733

扫码关注云+社区

领取腾讯云代金券