在本章中,我们将学习

  • Canny边缘检测的概念

  • OpenCV函数: cv.Canny()

理论

Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明

1.这是一个多阶段算法,我们将经历每个阶段。

2.降噪

由于边缘检测容易受到图像中噪声的影响,因此第一步是使用5x5高斯滤波器消除图像中的噪声。我们已经在前面的章节中看到了这一点。

3.查找图像的强度梯度

然后使用Sobel核在水平和垂直方向上对平滑的图像进行滤波,以在水平方向(Gx)和垂直方向(Gy)上获得一阶导数。从这两张图片中,我们可以找到每个像素的边缘渐变和方向,如下所示:

$$
Edge\_Gradient \; (G) = \sqrt{G_x^2 + G_y^2} \\ Angle \; (\theta) = \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg)
$$

渐变方向始终垂直于边缘。将其舍入为代表垂直,水平和两个对角线方向的四个角度之一。

4.非极大值抑制
在获得梯度大小和方向后,将对图像进行全面扫描,以去除可能不构成边缘的所有不需要的像素。为此,在每个像素处,检查像素是否是其在梯度方向上附近的局部最大值。查看下面的图片:

点A在边缘(垂直方向)上。渐变方向垂直于边缘。点B和C在梯度方向上。因此,将A点与B点和C点进行检查,看是否形成局部最大值。如果是这样,则考虑将其用于下一阶段,否则将其抑制(置为零)。
简而言之,你得到的结果是带有“细边”的二进制图像。

5.磁滞阈值

该阶段确定哪些边缘全部是真正的边缘,哪些不是。为此,我们需要两个阈值minValmaxVal。强度梯度大于maxVal的任何边缘必定是边缘,而小于minVal的那些边缘必定是非边缘,因此将其丢弃。介于这两个阈值之间的对象根据其连通性被分类为边缘或非边缘。如果将它们连接到“边缘”像素,则将它们视为边缘的一部分。否则,它们也将被丢弃。见下图:

边缘A在maxVal之上,因此被视为“确定边缘”。尽管边C低于maxVal,但它连接到边A,因此也被视为有效边,我们得到了完整的曲线。但是边缘B尽管在minVal之上并且与边缘C处于同一区域,但是它没有连接到任何“确保边缘”,因此被丢弃。因此,非常重要的一点是我们必须相应地选择minValmaxVal以获得正确的结果。

在边缘为长线的假设下,该阶段还消除了小像素噪声。

因此,我们最终得到的是图像中的强边缘。

OpenCV中的Canny Edge检测

OpenCV将以上所有内容放在单个函数cv.Canny()中。我们将看到如何使用它。第一个参数是我们的输入图像。第二个和第三个参数分别是我们的minValmaxVal。第三个参数是perture_size。它是用于查找图像渐变的Sobel内核的大小。默认情况下为3。最后一个参数是L2gradient,它指定用于查找梯度幅度的方程式。如果为True,则使用上面提到的更精确的公式,否则使用以下函数:。默认情况下,它为False

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

附加资源

1.Canny edge detector at Wikipedia:http://en.wikipedia.org/wiki/Canny_edge_detector

2.Canny Edge Detection Tutorial:http://dasl.unlv.edu/daslDrexel/alumni/bGreen/www.pages.drexel.edu/_weg22/can_tut.html by Bill Green, 2002.

练习

1.编写一个小应用程序以找到Canny边缘检测,该检测的阈值可以使用两个跟踪栏进行更改。这样,您可以了解阈值的影响。

☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:

或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。

不断更新资源

获取更多精彩

长按二维码扫码关注

OpenCV系列之Canny边缘检测 | 十九相关推荐

  1. canny边缘检测算法 opencv_OpenCV-Python Canny边缘检测 | 十九

    目标 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法.它由John F. Canny发 ...

  2. OpenCV C++案例实战二十九《遥感图像分割》

    OpenCV C++案例实战二十九<遥感图像分割> 前言 一.准备数据 二.K-Means分类 三.效果显示 四.源码 总结 前言 本案例基于k-means机器学习算法进行遥感图像分割.主 ...

  3. 【缅怀妈妈系列诗歌】之十九:妈妈,祝您生日快乐

    [缅怀妈妈系列诗歌]之十九:妈妈,祝您生日快乐 题记:在妈妈生日之际,祝福我在天堂里的妈妈生日快乐. 谨以这一系列文章和诗歌缅怀我病逝的妈妈,祈祷她老人家在天能得以安息! --代腾飞   2009年8 ...

  4. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  5. OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,转载请注明出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107837715 各位读者,知识无穷而人力有穷,要 ...

  6. Opencv中的Canny边缘检测

    文章目录 1.Canny引入 2.Canny算法实现步骤 (1)去噪 (2)计算梯度和梯度方向 (3)过滤非最大值 (4)使用阈值检测边缘 3.Canny函数实现 4.实例代码测试 (1)图片测试代码 ...

  7. OpenCV系列之傅里叶变换 | 三十

    目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换 利用Numpy中可用的FFT函数 傅立叶变换的某些应用程序 我们将看到以下函数:cv.dft(),cv.idft()等 理论 傅立叶变 ...

  8. OpenCV系列之高动态范围 | 六十

    目标 在本章中,我们将 了解如何根据曝光顺序生成和显示HDR图像. 使用曝光融合来合并曝光序列. 理论 高动态范围成像(HDRI或HDR)是一种用于成像和摄影的技术,可以比标准数字成像或摄影技术重现更 ...

  9. OpenCV系列之图像去噪 | 五十八

    目标 在本章中, 你将学习用于去除图像中噪声的非局部均值去噪算法. 你将看到不同的函数,例如cv.fastNlMeansDenoising(),cv.fastNlMeansDenoisingColor ...

最新文章

  1. 适配iOS 13 tabbar 标题字体不显示以及返回变蓝色的为问题
  2. 支付宝人脸数据被共享?李开复道歉
  3. 记事本 换行符_30年后终更新!新一代Win10记事本详细体验
  4. 不同表主键能相等吗_视频 |【搞机实验室】测血氧有啥,你见过能“开车”的表吗?...
  5. 本程序主要实现了一个方阵的求逆与实现了逆矩阵和原矩阵的乘积为单位矩阵
  6. python 关闭窗口事件_python在Linux平台下捕获窗体关闭事件
  7. 深度学习之循环神经网络(3)梯度传播
  8. 简单 fibonacci 函数
  9. python脚本画pie饼图_小白学Python(11)——pyecharts,绘制饼图 Pie
  10. 关于 nektar 连接电脑使用的一些问题说明, nektar Impact GX61/GX49/SE25
  11. python垃圾分类程序_如何利用Python进行垃圾分类
  12. Jupyter notebook 打开网页无法显示
  13. 苏格拉底的最后日子――柏拉图对话集
  14. 大数据:一张图让你明白什么是大数据
  15. 在论文开题报告中,研究目的和研究意义两者之间有什么区别吗?
  16. 2022年国庆红旗头像制作微信小程序源码
  17. mysql 月度账单汇总_MySQL按年度、季度、月度、周、日SQL统计查询
  18. android 开关机动画
  19. 高中计算机专业满分多少,高中各科满分是多少
  20. 关于Jmeter中的函数和变量用法

热门文章

  1. 高速串行总线系列(3)GTX/GTH 物理层结构分析
  2. 如何删除MacOS的搜狗输入法的自造词(MacOS Windows)
  3. ProgressBar进度条
  4. Ebay买家号注册流程
  5. WebGL编程指南03-在javaScript程序通过uniform变量向片元着色器传值
  6. 词云--《红楼梦》--jieba库--wordcloud库
  7. ActiveX自动化在AutoCAD中的应用_94方便下载站
  8. python二进制程序_python中的二进制加法程序
  9. 【kaldi】chain-model在线解码(以aishell数据集为例)
  10. 一款不用手动打卡,自动调起钉钉上班打卡的App