一、边缘检测

二、边缘检测流程

三、Canny边缘检测


前言

边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。有许多方法用于边缘检测,它们的绝大部分可以划分为两类:

  • 基于一阶导数
    首先计算边缘强度, 通常用一阶导数表示, 例如梯度模,然后,用计算估计边缘的局部方向, 通常采用梯度的方向,并利用此方向找到局部梯度模的最大值。即:图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。
    一阶:Roberts Cross算子,Prewitt算子,Sobel算子, Kirsch算子,罗盘算子;
    基于 零穿越/零交叉 的一类:二阶导数
    基于零穿越的方法通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点。
  • 基于二阶导数: Marr-Hildreth,在梯度方向的二阶导数过零点,Canny算子,Laplacian算子。

一、边缘检测

为什么要进行边缘检测呢?因为这是稳定的视觉特征,是人类经验的结果。边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。主要包括:

  • 深度上的不连续(物体处在不同的物平面上);
  • 表面方向不连续(如正方体的不同的两个面)
  • 物质属性变化(会导致光的反射系数不同)
  • 场景照明变化(阴影)

那么,对于下面这张图像进行边缘检测时,沿着这条红色的水平线,得到其每个像素点上的强度(也就是灰度值),由此可知边缘就是在像素值发生突变的地方。那么如果从一个信号中找到突变的地方呢?

显然,根据数学知识,对信号曲线进行求一阶导数,对于边缘来说,并不需要关注方向,只需要关注极值即可,所以可以通过求导得到边缘所在位置。由此将这跟红色的水平线从上至下滑动即可得到整个图像的竖直方向上的边缘。

对于一个二元函数

,响应的的求导公式:

在图像处理过程中,对于像素值的位置的最小单位是

px,因此令
,使用这种近似来作为点前位置的导数,则有:

其实由这个公式可以看出,就是右面一个像素减去左面一个像素,作为当前位置的导数,这样简化之后其实就可以把这个过程使用卷积代替,即卷积核为:这就是检测竖直方向上边缘的卷积核。同理也可以得到水平方向上边缘的卷积核。

那么接下来举个例子,下面这两个边缘检测结果哪个是水平方向卷积核检测到的?哪个是竖直方向卷积核检测到的?因为只有水平卷积核检测的是左右差异较大的像素值,自然而然连成线之后就是竖直方向的线条。

接下来,解释一下梯度(一维叫导数,高维叫梯度),对于一副图像的一个像素点

对于夹角的计算方式

,而梯度的幅值:

这个幅值越大说面这点附近像素值变化越剧烈,就越有可能是边缘。

其实梯度对于一副图像来说就是图像变化剧烈的方向。而且梯度方向与边缘是垂直的。

二、边缘检测流程

由于在实际应用过程中信号的采集往往伴随着噪声的出现,假设有下面这么一个一维信号,很显然边缘就在突变的地方。但是由于真实点附近存在噪声,如果直接使用边缘滤波器(边缘卷积)得到的结果会是什么样?

显然,通过边缘检测器之后得到导数(梯度)是无法确定极大值极小值的,因此无法判断边缘位置。所以,往往在进行边缘检测前首先要进行滤波。这是因为边缘检测算子主要是基于图像强度的一阶导数和二阶导数,但是通常情况下导数对噪声十分敏感,因此必须使用滤波器来进行平滑噪声。

因此对于一维图像

使用高斯卷积核
进行滤波, 通过将
(卷积)得到的结果可以看出,最左边和最右面为什么没了呢?这就是因为卷积过程中如果不对边界补充的话,卷积结果相比原来图像会小一圈。经过高斯卷积之后的图像就相对平滑很多,在这个基础上再进行边缘检测,得到结果如下。很显然求极值就十分简单了。

因此,我们在对图像进行边缘检测前首先用高斯卷积对图像进行平滑就是了,因为我们也无法确定图像是否包含噪声。虽然上面这个过程实现了边缘检测,但是在这个过程中使用了两次卷积,首先是滤波过程的卷积,然后是求导过程的卷积,显然卷积是十分耗时的,那么能否使用一次卷积完成这个操作呢?

这个公式成立是因此卷积是满足交换律,结合律和分配率的。所以使用右面的公式,先对高斯卷积核进行求导,这个模板一般比较小,求导也相对简单,然后再进行卷积。 这样就能加速运算过程了。

这就是高斯卷积核求导之后的三维图像

虽然,使用平滑对图像进行去噪,但是它也会模糊图像,因此我们可以考虑在不同的scale下进行边缘检测。也就是选择响应的窗宽和标准差即可对图像进行平滑并边缘检测,由于窗宽一般默认经验值

,因此只需要指定参数
即可执行这两个过程。所以可以考虑使用不用的
在不同的scale下进行边缘检测。

因此,接下来对比重新认识一下高斯卷积核与高斯一阶导数核的区别:

  • 高斯卷积核(smoothing filters):高斯卷积实际上是滤除高频信号,是低通滤波器,滤波器模板中的数值没有负数,而且这些值相加和为1。
  • 高斯一阶导数核(derivative filters):滤波器模板中的数值一定有负数,而且这些相加为0。

总结一下,对于一副图像进行边缘检测的流程

  • 滤波
  • 增强,增强算法可以将图像灰度点邻阈强度值有显著变化的点凸显出来。
  • 边缘检测,经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定应用中,这些点并不是要找的边缘点,所以应该采用某些方法对这些点进行取舍。实际工程中,常用的方法是通过阈值化的方法进行检测。

三、Canny边缘检测

对于这样一张图像进行边缘检测时,首先第一步,对图像进行滤波处理,然后计算两个方向的梯度,先计算每个像素点的梯度,然后计算幅值,得到下面这张图像。

在进行梯度计算时,梯度较大的地方可能是边缘也有可能是噪声,虽然已经进行过一次平滑滤波,但是仍然还会有一些高强度的噪声无法滤除,因此在这里选择使用阈值对其进行第二次过滤,去除一些梯度相对较小的点。

然而经过阈值处理后,还是会有一些小问题,就是图像中的边缘会很宽,这是由于图像中的边缘像素值都是缓慢变化的,不会是一个垂直的突变,即使原始图像中的边缘是一个垂直的突变,经过高斯平滑之后它就会变得不那么垂直了,所以这就是为什么边会那么宽。那如何解决呢?

接下来就介绍了一个著名的算法:NMS非极大值抑制。它的一个主要思想就是,首先确定边上的一个点,然后沿着边的梯度方向比较跟相邻点的梯度进行比较,也即是右图中的

进行比较。如果
最大则保留,如果不是则舍去。

经过抑制以后:显然这就细化了很多,但是也会存在一定的问题,比如脖子下面的边缘消失了,出现了断断续续的情况,出现这种情况的原因是什么呢?这是因为设置的阈值太高了,导致这部分梯度被滤除掉了,但是如果阈值设置的较低又会出现很多“假边”,因此这里需要对刚刚设置阈值过滤这一步进行改进。

改进的思路:就是使用双阈值法,首先使用一个较高的阈值去将那些确定度较高的边检测出来,称为“强边”,然后再使用一个较小的阈值显露更多的边,称为“弱边”,此时选择保留那些跟强边有连接关系的边。这个想法就很巧妙。

左边是高阈值,中间是低阈值,右边是双阈值

关于Canny边缘检测是有严格意义上的数学推导的,这个后续补充一下!

我是尾巴~

每日一句毒鸡汤:小时候,虽然穷,但是很快乐,现在不同啦,不仅穷,还不快乐。

本次推荐:fliqlo一款屏保,兼具美观和使用(看时间):

Fliqlo​fliqlo.en.softonic.com

继续加油~

c#用canny算子做边缘提取_机器视觉学习(三)边缘检测相关推荐

  1. c#用canny算子做边缘提取_【图像处理】边缘检测

    边缘检测 sobel sobel是最常见也是最常用的边缘检测算子.一般来说,当我们想要获取图像的边缘时,首先想到的就是像素值发生突变的位置,而如何用数学表达来刻画"突变",一个很好 ...

  2. c#用canny算子做边缘提取_干货 | 边缘检测

    最近小可爱们有没有等我们的技术推等到望穿秋水啊?大家日思夜想的技术推来啦.今天我们来一起学习一下opencv里面一个重要方面:边缘检测. 01.什么是边缘检测 边缘检测是图像处理和计算机视觉中的基本问 ...

  3. canny算子的边缘提取算法

    canny算子边缘提取分为四个步骤 1.去噪: 利用高斯滤波对图像卷积进行去噪处理: 2.求梯度: 采用梯度滤波模板对图像进行卷积,求取图像X方向和Y方向的梯度,以及对应的夹角: 3.非极大值抑制: ...

  4. 机器学习与知识发现_机器视觉学习之工业镜头--硬件知识扫盲学习

    今天我来介绍一下工业镜头的相关知识.在前些章节,我介绍了关于光源的知识,没看的同学可以前往观看 机器视觉学习之光源--硬件知识扫盲必看 如果工业相机没有镜头,那么Sensor感光就是一片噪点,聚焦不在 ...

  5. 神经网络算法未来_“深度学习三巨头”来了俩,Hinton、LeCun预言深度学习的未来...

    当地时间 6 月 23 日,今年的 ACM 图灵奖得主."深度学习三巨头"中的 Geoffrey Hinton.Yann LeCun 在 ACM FCRC 2019上发表演讲,分享 ...

  6. 圆形标定板_机器视觉学习笔记(2)--如何检测圆点标定板

    摄像机标定常用的标定板除了棋盘格,还有圆点标定板,圆点标定板如图1所示. 图1:圆点标定板 众所周知的是,OpenCV和Matlab没有现成的圆点标定板的检测算法,只有Halcon有该检测算子,遗憾的 ...

  7. 用lstm模型做预测_深度学习模型 CNN+LSTM 预测收盘价

    -- 本篇文章 by HeartBearting 上一篇浏览量很大,感谢各位的关注! 能够在这里分享一些实验,一起领略 数据科学之美,也很开心. 以后,这个实验的模型会不断深化. 之后,也会分享一些 ...

  8. python怎么做项目_...内学习python和django,并做出一个项目需要怎么准备,可以做什么......

    匿名用户 1级 2016-05-18 回答 Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GN ...

  9. MATLAB中canny算子边缘检测

    今天来介绍一下关于canny算子做边缘检测的过程: Canny的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 好的检测- 算法能够尽可能多地标识出图像中的实际边缘. 好的定位- 标识出的边 ...

最新文章

  1. iOS UI 12 block传值
  2. C++ leetcode 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外
  3. gdb 调试java进程_使用GDB调试JNI代码
  4. php程序如何保证3秒作出响应,这个留言本的响应时间总是在3秒左右,如何优化?...
  5. Using Delegates with Data Readers to Control DAL Responsibility[转]
  6. 初学者的SDN学习之路
  7. Quartus破解步骤及常见错误解决方法
  8. maven项目打包命令
  9. JAVA中文件下载和文件批量下载方法
  10. BLDC无刷直流电机之电机驱动的控制原理示意
  11. 使用费马小定理和欧拉定理计算余数
  12. Java .class文件是什么?
  13. python:savgol_filter的简单使用
  14. 重返设计模式--状态模式
  15. RPC(1)HttpClient详细使用(含例子)
  16. 基于51单片机的多路多点温度检测两种供电方式proteus仿真原理图PCB
  17. extjs 让人老火的事情
  18. 关于网站搜索引擎优化技巧,杭州SEO公司清法网络有话说
  19. ResNet论文翻译——中英文对照+标注总结
  20. unity 解决乱码_unity3d 中文乱码解决方法——cs代码文件格式批量转化UTF8

热门文章

  1. 【翻译】How-To: Using the N* Stack, part 3
  2. oracle数据库扩展目录,Oracle 扩充磁盘空间
  3. mysql周报内容范文_Mysql各种报表查询含实例,日报,周报,月报,时间差自动计算...
  4. 判断同构数 c语言,基于visual Studio2013解决C语言竞赛题之0413同构数
  5. 道闸系统服务器价格,小区道闸系统价格服务客户
  6. 学材分析计算机一体化,计算机一体化教学的体会
  7. 微软更新服务器win7,[技巧]绕过微软限制:让基于新处理器的Win7/8.1系统继续接收更新...
  8. 网络布线工程师科普铜缆光纤损耗那点事!
  9. 后端技术:SpringBoot 中实现跨域的5种方式
  10. 写给新入行程序员的10条建议