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

3cff4c318bf4c7b660fc8d31c8c02eaf.png

一、边缘检测

二、边缘检测流程

三、Canny边缘检测


前言

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

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

一、边缘检测

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

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

8f15aa8374bb8cbb2ce67898e6e4bc17.png

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

66c3df836bc4520865a33765b3b83d49.png

637cba8ce00c6b9db654253df0c71a7d.png

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

9f23875fa3f3d7edbffca743ce4eea73.png

对于一个二元函数

,响应的的求导公式:

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

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

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

5ad44913c89694d8c52f7702d710ef91.png

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

0ac8aea1dcba015da93db1ac332a0898.png

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

fea1d16286fad30f88430c2bd65c4624.png

对于夹角的计算方式

,而梯度的幅值:

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

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

二、边缘检测流程

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

388bdacb71bc5d879f40dd9c608753de.png

6d8dbcd79f15363068f551547aa06868.png

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

ff642d421cebc8e2ffb09085406e6e34.png

因此对于一维图像

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

7c436fabe75232d7932330cc1ea2ef35.png

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

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

0a3df4c3badab6111ce154e92a60a3fd.png

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

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

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

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

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

d6984cb1eae44df0163af9538178b1ed.png
  • 高斯一阶导数核(derivative filters):滤波器模板中的数值一定有负数,而且这些相加为0。

cac2fcdc1d2422414e65861d7f853446.png

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

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

三、Canny边缘检测

9cc65aad773a683da54a8360b7f2e9f9.png

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

71e36bb98182ea74469858ee60b27826.png

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

cda0ee5747b3713e680f17c3534abdd8.png

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

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

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

e9b52f578562ffd8209ee99d0d82aa96.png

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

2759abab35f3b3d5216881d93920eb7f.png

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

9bfa61f5ed8d4ec34863aa0cd26ee05c.png
左边是高阈值,中间是低阈值,右边是双阈值

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

我是尾巴~

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

615aad58572b88d09cf657e642e44cbd.png

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

Fliqlo​fliqlo.en.softonic.com
363f8b14fe0871385e62b4ee68af03d9.png

继续加油~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bindresult必须在哪个位置_手机视频剪辑工具哪个好?清爽视频编辑APP有人推荐吗?...

作为一个非常喜欢旅游的人,每次出门在外都喜欢发各种照片,以前发照片觉得就能够表达自己的状态和心情,但是随着时间的变化发现,身边的人都开始喜欢发视频了。此前在飞机上拍摄了一段觉得不错的天空视频,想要制作成短片…

无法访问你试图使用的功能所在的网络位置_[steam实用工具]解决无法访问商店/社区/好友列表的问题...

[steam实用工具]解决无法访问商店/社区/好友列表的问题在我们使用steam的过程中,由于某些原因,在访问商店/社区/好友列表时会被受到限制。针对这种情况,国内的大神些开发出了以下工具来解决我们访问的难题。本文章中的软件由“羽翼诚"大…

(转)用Java获得当前性能信息

(转)用Java获得当前性能信息 http://www.blogjava.net/amigoxie/archive/2008/04/30/197564.html在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,本例讲解如何取得这些信息,并且获得在Windows下的内存使…

docker wsl2启动不了_Docker学习笔记

在笔记本上主要还是想以轻量、方便为主,所以采用的是在WSL2中使用docker的这么一个方案。WSL2我笔记本原来是预装的是WIN10家庭版,需要先升级为专业版,并加入windows预览体验计划。更新完之后,安装WSL,我选择的是Ubunt…

网易马进:DDB从分布式数据库到结构化数据中心的架构变迁

导语: 本文根据马进老师在2018年5月10日【第九届中国数据库技术大会(DTCC)】现场演讲内容整理而成。马进 网易 DDB项目负责人来自网易杭研大数据平台组,入职以来先后参与了分布式数据库DDB,缓存NKV,网易数据运河NDC等项目&#xf…

element label动态赋值_浅析 vuerouter 源码和动态路由权限分配

背景上月立过一个 flag,看完 vue-router 的源码,可到后面逐渐发现 vue-router 的源码并不是像很多总结的文章那么容易理解,阅读过你就会发现里面的很多地方都会有多层的函数调用关系,还有大量的 this 指向问题,而且会有…

世界领先的界面设计公司:The Skins Factory

该公司的网站: http://www.theskinsfactory.com/skinsfactory/ 该公司诞生于2000年,由一群狂热的界面爱好者,带着对GUI的热情和大胆的洞察力创立。很快,皮肤工厂便成长为世界领先的、真正的、革命性界面解决方案提供商。 更多的精…

HDU 1253 胜利大逃亡 题解

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 44540 Accepted Submission(s): 15483 Problem DescriptionIgnatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡…

lstm需要优化的参数_使用PyTorch手写代码从头构建LSTM,更深入的理解其工作原理...

这是一个造轮子的过程,但是从头构建LSTM能够使我们对体系结构进行更加了解,并将我们的研究带入下一个层次。LSTM单元是递归神经网络深度学习研究领域中最有趣的结构之一:它不仅使模型能够从长序列中学习,而且还为长、短期记忆创建…

有哪些漂亮的中国风 LOGO 设计?

提到中国风的logo,我觉得首先登场的应该是北京故宫博物院的logo,铛!故宫博物院的logo,从颜色,到外形,到元素,无一例外,充满了中国风的味道,可谓是中国风中的典型。同一风…

python3常用模块_Python3 常用模块

一、time与datetime模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。 格式…

地方政府不愿房价下跌 救市或化解房地产调控

地方政府不愿房价下跌 "救市"或化解房地产调控 2008年05月09日 07:29:38  来源:上海证券报 漫画 刘道伟 由于房地产业与地方政府利益攸关,地方政府最不愿意看到房价下跌。中央房地产调控政策刚刚导致部分城市的房价步入调整,一些…

App移动端性能工具调研

使用GT的差异化场景平台描述release版本development版本Android在Android平台上,如果希望使用GT的高级功能,如“插桩”等,就必须将GT的SDK嵌入到被调测的应用的工程里,再配合安装好的GT使用。支持AndroidiOS在iOS平台上&#xff0…

UITabBar Contoller

。UITabBar中的UIViewController获得控制权:在TabBar文件中添加:IBOutlet UITabBar *myTabBar; //在xib中连接tabBar;(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:      (UIViewControlle…

python3.5安装pip_win10上python3.5.2第三方库安装(运用pip)

1 首先在python官网下载并安装python。我这儿用的是python3.5.2,其自带了pip。如果你选择的版本没有自带pip,那么请查找其他的安装教程。 2 python安装好以后,我在其自带的命令提示符窗口中输入了pip,结果尴尬了,提示我…

语法上的小trick

语法上的小trick 构造函数 虽然不写构造函数也是可以的,但是可能会开翻车,所以还是写上吧。: 提供三种写法: ​ 使用的时候只用: 注意,这里的A[i]gg(3,3,3)的“gg”不能打括号,否则就是强制转换…

Ubuntu18.04如何让桌面软件默认root权限运行?

什么是gksu? 什么是gksu:Linxu中的gksu是系统中的su/sudo工具,如果安装了gksu,在终端中键入gksu会弹出一个对话框. 安装gksu: 在Ubuntu之前的版本中是继承gksu工具的,但是在Ubutu18.04中并没有集成, 在Elementary OS中连gksu的APT源都没有. Ubuntu18.04 安装和使用gksu: seven…

win10诊断启动后联网_小技巧:win10网络共享文件夹出现错误无法访问如何解决?...

win10系统共享文件夹时在资源管理器中的网络里能够看到所共享的文件夹,但在打开文件夹时却出现 Windows无法访问 Desktop-r8ceh55新建文件夹 请检查名称的拼写。否则,网络可能有问题。要尝试识别并解决网络问题,请单击“诊断”的错误提示&…

两段关于统计日期的sql语句

统计月份:selectleft(convert(char(10),[Article_TimeDate],102),7) as月份, count(*) as数量from[hdsource].[dbo].[article]groupbyleft(convert(char(10),[Article_TimeDate],102),7)orderby1统计年份: selectleft(convert(char(10),[Article_TimeDat…

sklearn 安装_sklearn-classification_report

原型sklearn.metrics.classification_report(y_true, y_pred, labelsNone, target_namesNone, sample_weightNone, digits2)参数y_true:1维数组或标签指示数组/离散矩阵,样本实际类别值列表y_pred:1维数组或标签指示数组/离散矩阵&#xff0c…