恰逢培训及前一段时间利用边缘方面知识开发项目,整理了相关知识作为培训材料,很久没写博了,知识还是需要梳理。

一、边缘的重要性

边缘在图像处理中的重要性不言而喻。当前AI最高端技术莫过于深度学习,而图像方面的深度学习建模所需要的特征,很多是从边缘为起点,不断向上构成更高层次的特征描述。我们来看下例子,此例摘自zouxy09关于深度学习的一篇文章( Deep Learning(深度学习)学习笔记整理系列):

1995 年前后,Bruno Olshausen和 David Field 两位学者任职 Cornell University,他们试图同时用生理学和计算机的手段,双管齐下,研究视觉问题。

他们收集了很多黑白风景照片,从这些照片中,提取出400个小碎片,每个照片碎片的尺寸均为 16x16 像素,不妨把这400个碎片标记为 S[i], i = 0,.. 399。接下来,再从这些黑白风景照片中,随机提取另一个碎片,尺寸也是 16x16 像素,不妨把这个碎片标记为 T。

他们提出的问题是,如何从这400个碎片中,选取一组碎片,S[k], 通过叠加的办法,合成出一个新的碎片,而这个新的碎片,应当与随机选择的目标碎片 T,尽可能相似,同时,S[k] 的数量尽可能少。用数学的语言来描述,就是:

Sum_k (a[k] * S[k]) --> T,     其中 a[k] 是在叠加碎片 S[k] 时的权重系数。

为解决这个问题,Bruno Olshausen和 David Field 发明了一个算法,稀疏编码(Sparse Coding)。

稀疏编码是一个重复迭代的过程,每次迭代分两步:

1)选择一组 S[k],然后调整 a[k],使得Sum_k (a[k] * S[k]) 最接近 T。

2)固定住 a[k],在 400 个碎片中,选择其它更合适的碎片S’[k],替代原先的 S[k],使得Sum_k (a[k] * S’[k]) 最接近 T。

经过几次迭代后,最佳的 S[k] 组合,被遴选出来了。令人惊奇的是,被选中的 S[k],基本上都是照片上不同物体的边缘线,这些线段形状相似,区别在于方向。

Bruno Olshausen和 David Field 的算法结果,与 David Hubel 和Torsten Wiesel 的生理发现,不谋而合!

也就是说,复杂图形,往往由一些基本结构组成。比如下图:一个图可以通过用64种正交的edges(可以理解成正交的基本结构)来线性表示。比如样例的x可以用1-64个edges中的三个按照0.8,0.3,0.5的权重调和而成。而其他基本edge没有贡献,因此均为0 。

图 1

上面的例子只是说明了边缘特征的重要性(是不是扯远了)。接着扯。。。

二、边缘定义及类型

定义:边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性。这个不是绝对的定义,主要记住边缘是局部特征以及周围像素显著变化产生边缘。

tips:轮廓和边缘的关系,一般认为轮廓是对物体的完整边界的描述,边缘点一个个连接起来构成轮廓。边缘可以是一段边缘,而轮廓一般是完整的。人眼视觉特性,看物体时一般是先获取物体的轮廓信息,再获取物体中的细节信息,比如看到几个人站在那,我们一眼看过去马上能知道的是每个人的高矮胖瘦,然后才获取脸和衣着等信息。

类型:简单分为4种类型,阶跃型、屋脊型、斜坡型、脉冲型,其中阶跃型和斜坡型是类似的,只是变化的快慢不同,同样,屋脊型和脉冲型也是如此。见图2,(a)和(b)可认为是阶跃或斜坡型,(c)脉冲型,(d)屋脊型,阶跃与屋脊的不同在于阶跃上升或下降到某个值后持续下去,而屋脊则是先上升后下降。

图 2 边缘类型

三、图像边缘描述

我们更多关注的是阶跃和屋脊型边缘,边缘用微分算子来刻画,见图3

图 3

在数学中,函数的变化率由导数来刻画,图像我们看成二维函数,其上面的像素值变化,当然也可以用导数来刻画,当然图像是离散的,那我们换成像素的差分来实现。对于阶跃型边缘,图3中显示其一阶导数具有极大值,极大值点对应二阶导数的过零点,也就是,准确的边缘的位置是对应于一阶导数的极大值点,或者二阶导数的过零点(注意不仅仅是二阶导数为0值的位置,而且是正负值过渡的零点)。故边缘检测算子的类型当然就存在一阶和二阶微分算子。

四、边缘检测算子类别

常见边缘检测算子:Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia

一阶微分算子:Roberts 、Sobel 、Prewitt

Robert算子是第一个边缘检测算子,提出者Lawrence Roberts in 1963。

Sobel边缘算子,当年作者并没有公开发表过论文,仅仅是在一次博士生课题讨论会(1968)上提出("A 3x3 Isotropic Gradient Operator for Image Processing"),后在1973年出版的一本专著("Pattern Classification and Scene Analysis")的脚注里作为注释出现和公开的。提出者Irwin Sobel。

Prewitt算子来自J.M.S. Prewitt "Object Enhancement and Extraction" in "Picture processing and Psychopictorics", Academic Press,1970。

我们看这三种边缘检测算子模板及写成差分的形式

Roberts算子

Sobel算子

Prewitt算子

图 4 一阶微分算子

如何计算边缘幅值与方向?以Sobel算子为例。3*3 Sobel两个方向的算子在图像上滑动,模板与其覆盖的图像3*3区域9个像素进行卷积,求和后得到此方向的边缘检测幅值。

f(x,y)为图像,Gx和Gy分别是水平和竖直方向算子的卷积结果,G则是最终得到的边缘幅值,θ值则是边缘方向。当然G的计算有时简化为

或者

求幅值时是有多种选择的,一般根据具体应用选择用水平还是竖直或是两个方向同时检测。

另外,需要说明的是,Sobel算子还有一种变种,是各向同性Sobel算子,其模板为

图 5 各向同性Sobel算子

Sobel各向同性算子的权值比普通Sobel算子的权值更准确。为什么?模板的权值是离中心位置越远则权值(看绝对值)影响越小,如上图,把模板看成是9个小正方形,小正方形边长为1,则虚线三角形的斜边长为,下直角边长为1,则如果(0,0)位置权值绝对值大小为1,则按照距离关系,位置(1,0)处的权值绝对值大小应该为才是准确的。

二阶微分算子:Laplacian、Log/Marr

拉普拉斯算子来自拉普拉斯变换,而Log算子又称Marr算子,由David Courtnay Marr和Ellen Hildreth(1980)共同提出,计算神经学创始人Marr在1980年正式发表论文时,因换白血病早逝,后面设立Marr奖以此纪念其贡献,现在每两年的ICCV(与ECCV,CVPR并称计算机视觉三大顶级会议)会评出一个Marr奖。这两种算子模板如下:

Laplacian算子(两种模板)

Log算子

图 6 二阶微分算子

拉普拉斯算子数学公式是

写成差分形式为

Log边缘检测则是先进行高斯滤波再进行拉普拉斯算子检测,然后找过零点来确定边缘位置,很多时候我们只是知道Log 5*5模板如上图所示,但是具体是怎么得到的?下面进行推导。

二维高斯公式是

按拉普拉斯算子公式求x,y方向的二阶偏导后为

这里x,y不能看成模板位置,应看成是模板其他位置到中心位置的距离。那么写成

这里x0,y0就是模板中心位置,x,y是模板其他位置,对于5*5模板,则x0=2,y0 = 2,那对于模板中(0,0)位置的权值,即把x= 0,y= 0,x0= 2,y0 = 2带入上式,另= 1,得到约等于0.0175,这样得到

通过取整变符号,且模板总和为0,得到图6所示的模板。

另外,这里模板大小是如何取的?通常高斯分布中,在(-3,3)的范围内就覆盖了绝大部分区域,所以模板大小一般取dim = 1 + 6(在SIFT特征中,其中的高斯模糊也是这样取),dim如果为小数,则取不小于dim的最小整数,当然实际使用时没有这么严格,如上面我们取=1时,模板大小取5*5。那同一个尺寸的模板中的权值调整就是的变化得到的,变化到一定程度,模板尺寸大小改变(这个是个人理解,欢迎拍砖)。

非微分边缘检测算子:Canny

Canny边缘检测大家应该很熟悉,这里列出步骤,并给出一个详细介绍的链接Canny算子。

1.      彩色图像转换为灰度图像
    2.      对图像进行高斯模糊
    3.      计算图像梯度,根据梯度计算图像边缘幅值与角度(这里其实用到了微分边缘检测算子来计算梯度幅值方向)
    4.      非最大信号压制处理(边缘细化)
    5.      双阈值边缘连接处理
    6.      二值化图像输出结果

方向算子Kirsch(8个3*3模板),Nevitia (12个5*5模板)

这两个算子是利用多个方向的子模板进行分别计算,最后取幅值最大的那个为最终边缘幅值,方向即最大幅值对应的那个方向

五、各边缘检测算子对比

opencv直接调用的Roberts和Prewitt边缘检测

自己写的Sobel算子,分别进行竖直和水平边缘检测,最后取竖直和水平边缘最大幅值

opencv直接调用的Laplacian和Canny边缘检测

Log 5*5模板,可以看出Log检测出的边缘很多并不是真正的边缘位置,下图没有经过过零点排除一些边缘点,噪声被充分检测出来。

当然,有很多关于以上边缘检测算子的理论解释及特性等可以参考以下几篇博文:

1、http://blog.csdn.net/xiaojiegege123456/article/details/7714863

2、http://blog.csdn.net/yanmy2012/article/details/8110316

3、http://blog.csdn.net/langb2014/article/details/45667921

参考资料:

1、张丽.《经典边缘检测算子比较》.南京信息工程大学.

2、百度百科“Sobel算子”

3、http://blog.csdn.net/a361251388leaning/article/details/50288479

4、http://blog.csdn.net/zouxy09/article/details/8775488
————————————————
版权声明:本文为CSDN博主「小魔大树哥」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tigerda/article/details/61192943

边缘检测 从Roberts到Canny算子相关推荐

  1. C++ Canny算子进行边缘检测

    C++实现Canny算子 进行边缘检测 文章目录 C++实现Canny算子 进行边缘检测 前言 一.Canny算子原理 二.C++实现Canny算子 1.步骤 2.C++代码如下 三.Canny算子运 ...

  2. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

  3. Matlab图像边缘检测Roberts\Sobel\Prewitt\Canny算子

    确定图像中的物体边界的一种方法是先检测每个像素和其直接淋雨的状态已决定该像素是否确实处于一个物体的边界上.具有这种特性的像素被标记为边缘点.当图像中各个像素的灰度级用来反映各像素要求的程度时,这种图像 ...

  4. 边缘检测,Roberts 算子,Sobel算子,Canny 算子

    边缘检测 在图像中,边缘是图像局部强度变化最明显的地方,它主要存在于目标与目标.目标与背景.区域与区域之间.边缘表明一个特征区域的终结和另一特征区域的开始.边缘所分开区域的内部特征或属性是一致的,而不 ...

  5. c#用canny算子做边缘提取_机器视觉学习(三)边缘检测

    一.边缘检测 二.边缘检测流程 三.Canny边缘检测 前言 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域.有许多方法用于边缘检测,它们的绝大部分可以划分为两类: 基于一阶导数 首 ...

  6. canny算子_Canny边缘检测算法

    PS:计算机视觉课程的一项大作业,作为门外汉,在网上查找资料学习和复现时踩了一些坑,在完成作业后分享一下,希望后面的小白同学少走弯路. 1.问题描述 在计算机视觉/机器视觉领域,图像分割的应用十分普遍 ...

  7. 图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割

    1.我们主要学习以下四种差分算子 Roberts算子 Sobel算子 Prewitt算子 canny算子 % Matlab图像边缘检测梯度算子–Roberts.Prewitt.Sobel.LOG.Ca ...

  8. Halcon边缘检测Sobel、Laplace和Canny算子

    提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者. 文章目录 前言 一.像素级边缘提取 1.经典的边缘检测算子 2.边缘检测的一般流程 3.sobel_amp 算子 参考文献 ...

  9. OpenCV(十七)边缘检测3 -- Canny算子(最优边缘检测)

    目录 一.基础理论 1.作用及介绍 1.原理 2.过程 3.Canny函数 二.回调函数及总代码 效果 参考资料 ​​​​​​​ 一.基础理论 1.作用及介绍 Canny边缘检测是非常流行的边缘检测算 ...

最新文章

  1. 近期Freecodecamp问题总结
  2. python检查URL是否能正常访问
  3. #Apache Spark系列技术直播# 第六讲【 What's New in Apache Spark 2.4? 】
  4. python爬取b站粉丝数_【python爬虫】每天统计一遍up主粉丝数!
  5. 人中急救穴 也可通过辨别疾病
  6. 专业的软件安装包可以这样做!
  7. Java 8的功能基础
  8. 一行命令快速安装Kubernetes(V1.18)高可用集群
  9. Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
  10. docsify,文档生成利器!
  11. DCMTK3.6.5+cmake3.7.1+VS2017配置过程
  12. matlab表示开方,在MATLAB内置功能中,‘sqrt(a)’表示() 答案:对a开方
  13. 达摩达兰论估价pdf_应用公司理财PDF下载_(美)阿斯瓦斯・达摩达兰_机械工业出版社_会计_管理_零度图书网...
  14. 判断101到200之间的素数
  15. 阿里云 root ssh远程登录 及 普通非root用户 ssh远程登录 Ubuntu1604
  16. java solr group by_solr高级查询——group和facet
  17. 实现选择文本时选中整个元素文本
  18. 看了阿里找数据分析师的新规则,真让人头皮发麻!
  19. 《无名之辈》小人物的自我证明
  20. C - Social Distance CodeForces - 1367C

热门文章

  1. 大b和小b的区别是什么
  2. 如何安装ruby、rails
  3. 打破墨守成规的思维模式,你才能挣到钱
  4. android模拟打印机服务,Android下的POS打印机调用的简单实现
  5. 数据库课程设计——学生信息管理系统
  6. object.key
  7. 如何运用python画名字_[原创]如何使用Python在好友画我上画一个标准的汉字震惊朋友圈...
  8. TopCoder简介
  9. html vh和百分比,css 100vh等于多少?
  10. No constructor found in com.kuang.springcloud.pojo.Dept matching [java.lang.Long, java.lang.String