热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

边缘检测canny算法

Canny边缘算法边缘检测的核心思想就是因为一幅图像的边缘往往是灰度值剧烈变化的地方,通过确定这些地方来确定边缘。第一步:去噪理所当然的࿰
Canny边缘算法

边缘检测的核心思想就是因为一幅图像的边缘往往是灰度值剧烈变化的地方,通过确定这些地方来确定边缘。

第一步:去噪

理所当然的,除了边缘会产生灰度值剧变,出现噪声的地方同样会发生灰度值剧烈变化。我们往往采用高斯滤波来处理噪声,使得图像更平滑。

第二步:求导求梯度

通过求导来表示灰度值的变化程度,应该是一个很理所当然的想法。因为图像中的坐标是离散的,所以对于图像的求导是通过求差分。求导的选择有很多,例如经典的Sobel,Laplacian

我们仅仅使用Sobel,Laplacian一样能够检测出边缘,各有优缺点。需要根据各自的特点来选择。

Sobel之后的边缘会变粗,或者说边缘扩大了一圈

sobel.png

Laplacian因为是一个二阶导数算子,在边缘处会产生双边缘响应

双边缘响应.png

上面的是原理,下面是一张实验图

双边缘.png
4.png

显而易见的在边缘处产生了双边缘,所以只能通过零交叉点(在逻辑上来说本例的零交叉点就是105.5)来粗略的确认边缘位置,不过这都是很微观的操作,尽管不是十分精确,对于肉眼来说其实完全没有区别。

Canny算法应该是Sobel的一种加强版。他的求导使用Sobel掩模。

第三步:非极大值抑制

这一步就是Canny算法的优化了,书上说的简直不是人话。我们在第二步的时候会产生2个矩阵。一个是导数矩阵记录对应位置上该像素点的导数,一个是梯度矩阵记录对应位置上该像素点的梯度方向。梯度方向会近似为0°,45°,90°,135°0°,45°,90°,135°0°,45°,90°,135°这4个方向

1.png

如果梯度方向近似为45°45°45°那么就会比较3-5-7,如果5在不是这3个中的极大值则灰度值设为0,这就是非极大值抑制。非极大值抑制应该是为了边缘瘦身,因为Sobel会让边缘变粗。

而如果追求精度的话,则需要用到线性插值来估计**gn**灰度值后,再进行比较。

线性插值.png

第四步:阈值处理

设置2个阈值maxValminVal

3.png

如果梯度值>>>maxVal那么这个点被确定为边缘点&#xff0c;如果梯度值<<<minVal那么这个点就被认为不是边缘。如果

minVal<<<梯度值<<<maxVal&#xff0c;那么这个点就需要进行确认。同样的按照上面的9宫格&#xff0c;在5周围的8邻域如果存在一个超过了maxVal&#xff0c;那么就认为该点与边缘相关&#xff0c;标记为边缘点。如果8邻域内没有一个超过maxVal&#xff0c;那么该点就被舍弃了。最后剩下的结果就是边缘了。


推荐阅读
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 探讨如何高效使用FastJSON进行JSON数据解析,特别是从复杂嵌套结构中提取特定字段值的方法。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
author-avatar
猪猪爱tai旸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有