原理

Canny边缘检测是一种常用的边缘检测算法。由 John F. Canny提出

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

1.降低噪音

由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高斯滤波器去除图像中的噪声。我们在前几章已经见过了。

2.寻找图像的强度梯度

然后对平滑后的图像进行水平方向和垂直方向的Sobel核滤波,得到水平方向(Gx)和垂直方向(Gy)的一阶导数。这两幅图像中,我们可以发现每个像素的边缘梯度和方向如下:

梯度方向总是垂直于边缘,它是四角之一,代表垂直、水平和两个对角线方向。

3.非极大值抑制

得到梯度大小和方向后,对图像进行全面扫描,去除非边界点。在每个像素处,看这个点的梯度是不是周围具有相同梯 度方向的点中最大的,查看下图:

点A在边缘上(垂直方向)。梯度方向垂直于边缘。点B和点C在梯度方向上,因此,点A与点B和点C进行检查,看它是否形成局部最大值,如果是,则将其考虑到下一阶段,否则将抑制它(使其为零)。

简而言之,您得到的结果是一个具有“细边”的二进制图像。

4.滞后阈值

现在要确定那些边界才是真正的边界,为此,我们需要两个阈值,minVal和maxVal。任何强度梯度大于maxVal的边都肯定是边,小于minVal的边肯定是非边,所以丢弃。位于这两个阈值之间的根据它们的连接性对边缘或非边缘进行分类(如果介于两者之间的话,就要看这个点是 否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是 就抛弃。如下图:

A 高于阈值 maxVal 所以是真正的边界点。C 虽然低于 maxVal 但高于minVal 并且与 A 相连,所以也被认为是真正的边界点。而 B 就会被抛弃,因 为他不仅低于 maxVal 而且不与真正的边界点相连。所以选择合适的 maxVal 和 minVal 对于能否得到好的结果非常重要。 在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些长的线段。

OpenCV中的Canny边缘检测

OpenCV将所有这些都放在一个函数cv.Canny中。第一个参数是输入图像。第二个和第三个参数分别是minVal和maxVal。第三个参数是aperture_size,它是用来寻找图像梯度的Sobel内核的大小,默认值是3。最后一个参数是L2gradient,它指定了求梯度大小的方程。

函数:

edges=cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

edges=cv.Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]])

参数:

dx

16-bit 输入图像的x导数 (CV_16SC1 or CV_16SC3).

dy

16-bit 输入图像的y导数 (和dx有相同类型).

edges

输出的边缘地图; 单通道8-bit 图像, 与输入图像有相同大小。

threshold1

第一个阈值,低阈值

threshold2

第二个阈值,高阈值

L2gradient

如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。

举例:

importnumpy as npimportcv2 as cvfrom matplotlib importpyplot as plt

img= cv.imread('4.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()

python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)相关推荐

  1. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  2. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  3. python opencv保存图片_OpenCV Python 保存图片

    By 凌顺 2019年9月12日 本示例使用的OpenCV版本是:4.1.1 运行Python的编辑器:Jupyter notebook 示例目的 通过无损和有损的方式进行图片保存. 实现代码 1,加 ...

  4. python opencv 摄像头_opencv python中摄像头参数的设置

    我正在使用Windows7 64位操作系统以及Python3和OpenCV.我的电脑连接到以下型号的两个罗技网络摄像头: 1)罗技高清网络摄像头C615 2) 罗技QuickCam Pro 9000 ...

  5. python实验题第四章_「Python」2020.03.16学习笔记 | 第四章列表、元组、字典-习题(11-13)...

    学习测试开发的Day74,真棒! 学习时间为1H 第四章列表.元组.字典-习题(11-13) 11.求两个集合的交集和并集 代码 list1=[1,2,3,4] list2=[2,3,5,5] def ...

  6. python永久保存数据_Python学习笔记(四)——文件永久存储

    文件的永久存储 pickle模块的使用 pickle的实质就是将数据对象以二进制的形式存储 存储数据 pickle.dump(data,file) data表示想要存储的数据元素,file表示要将数据 ...

  7. 重新认识错过(通向财富自由之路学习笔记十四)

    本周学习<通向财富自由之路>专栏重新认识错过的文章,在文章中作者介绍了自己是如何错过一次升级的.对于这种错过,非常有同感.比如在中学时候,需要学习生物.历史.地理等学科,而这些学科不需要计 ...

  8. 【theano-windows】学习笔记十四——堆叠去噪自编码器

    前言 前面已经学习了softmax,多层感知器,CNN,AE,dAE,接下来可以仿照多层感知器的方法去堆叠自编码器 国际惯例,参考文献: Stacked Denoising Autoencoders ...

  9. Mr.J-- jQuery学习笔记(十四)--动画显示隐藏

    eq()函数 定义和用法 :eq() 选择器选取带有指定 index 值的元素. index 值从 0 开始,所有第一个元素的 index 值是 0(不是 1). 经常与其他元素/选择器一起使用,来选 ...

  10. 【神经网络】学习笔记十四——Seq2Seq模型

    本文简要介绍seq2seq,即序列到序列的基本知识,是深度学习和NLP中一个重要的知识. 从三部分来说,seq2seq基本简介,应用场景和原理解析. 一.什么是Seq2Seq 所谓Seq2Seq(Se ...

最新文章

  1. 强烈推荐——PQDT Open-ProQuest学位论文全文开放数据库
  2. TCP/IP / 如何保证数据包传输的有序可靠?
  3. Android 全局悬浮按钮,悬浮按钮点击事件
  4. 电商视觉:焦点图的万能构图模板
  5. 硬盘主引导扇区汇编代码
  6. 如果股市出现震荡行情,投资者应如何应对?
  7. linux 5.5 外接usb2.0硬盘,RHEL5 使用pam_usb
  8. TF2—tf.keras.layers.BatchNormalization
  9. datax 不识别字段过滤_初效空气过滤器种类
  10. python用cartopy包画地图_利用Cartopy绘制带有地图投影的图形
  11. IMEI修改(IMEI第十五位验证码的计算)
  12. java while 死循环_java while (true) 死循环
  13. Java标准教程:Java 2D绘图--第4章 使用Text API
  14. Linux与windows共享文件的神器:Samba
  15. MFC中资源视图不能打开
  16. 《决战大数据》读书笔记(二) cookie识别用户行为已经过时
  17. 三次插值ClampedB样条曲线Matlab代码实现
  18. 计算机应用基础教程在线阅读,计算机应用基础教程
  19. 少儿编程微课程7:星际飞行单机版
  20. 泰山OFFICE技术讲座:标点关系穷举研究-05

热门文章

  1. 服务器怎么打开数据库文件夹,服务器怎么打开数据库文件夹下
  2. java批量事物管理_[疯狂Java]JDBC:事务管理、中间点、批量更新
  3. 复杂个人信息输出程序python_Python高级技巧:用一行代码减少一半内存占用
  4. 存储过程mysql into select into_mysql 存储过程select into select into select的搜索结果-阿里云开发者社区...
  5. Nginx基于TCP的四层负载均衡介绍
  6. 怎么画正五边形步骤_每个药店必备三伏贴的POP海报,我教你画
  7. java group类_浅析Java中线程组(ThreadGroup类)
  8. mysql分库主键_分库主键设计-Mysql
  9. 计算机事业单位专技岗考什么区别,事业单位管理和专技岗位有什么区别?哪个有前途?...
  10. python内置的读取文件函数_Python函数篇(3)-内置函数、文件处理(已更新)