文章目录

  • 1.Canny引入
  • 2.Canny算法实现步骤
    • (1)去噪
    • (2)计算梯度和梯度方向
    • (3)过滤非最大值
    • (4)使用阈值检测边缘
  • 3.Canny函数实现
  • 4.实例代码测试
    • (1)图片测试代码
      • (1)调节阈值大小
      • (2)使用L2gradient=True
      • (3)设置apertureSize中的Sobel算子大小
    • (2)实时检测代码
  • 5.Canny的实际应用

1.Canny引入

(1)Canny边缘检测算子是John.F.Canny与1986年开发出来的一个多级边缘检测算法;边缘检测是计算机视觉中一个非常古老的问题,它涉及到检测图像中的边缘来确定目标的边界,从而分离感兴趣的目标。最流行的边缘检测技术之一是Canny边缘检测。
(2)对最优边缘检测算法评价
a.好的检测:算法能够尽可能多的标识出图片中的实际边缘;
b.好的定位:标识出的边缘要与实际图片中的实际边缘尽可能的接近;
c.最小响应:图像中的边缘只能标识一次,并且可能存在的图像噪声不应该标识为边缘。

https://wenku.baidu.com/view/54a32be6d6bbfd0a79563c1ec5da50e2524dd1da.html


2.Canny算法实现步骤

(1)去噪

:因为原始的图片具有很多随机的噪声,那么在进行边缘处理的时候很容易将这些噪声视为图像的边缘,可以使用5x5的高斯滤波器对图像进行平滑(模糊)。

(2)计算梯度和梯度方向

:使用4个mask检测水平,垂直以及对角线方向的边缘;原始图像和每个mask进行卷积并且保存起来,对于每个点都标识这个点上的最大值以及生成的边缘的方向:

(3)过滤非最大值

:在高斯滤波过程中,边缘可能别被放大,因为在真实的图片中,梯度值最大有可能比较多,所以需要对边缘进行过滤,使边缘的宽度尽可能为一个像素点;如果一个像素点属于边缘,那么这个像素点在梯度方向上梯度值最大;否则不是边缘,将像素值设置为0;

(4)使用阈值检测边缘

:使用一个阈值检测边缘不太合理,使用上下阈值来检测边缘;我们选择valueMax作为高阈值,valueMin作为低阈值;任何梯度值大于高阈值(valueMax)的一定为边缘;任何小于低阈值(valueMin)的一定不是边缘;而对高阈值和低阈值之间的值进行检查,如果边缘相连,则视为边缘;否则不是边缘。


3.Canny函数实现

(5)python中的Canny函数
Canny(InputArray image, double threshold1,double threshold2,OutputArray edges=None, int apertureSize=None,bool  L2gradient=None)
参数解释:
Image:输入图像(源图像),单通道为8bit;
Threshold1:第一个滞后性阈值;
Threshold2:第二个滞后性阈值;
Edges:输出边缘图,需要和一样的尺寸和数据类型;
apertureSize:应用Sobel算子的孔径大小,默认值为3;
L2gradient:计算图像梯度幅度值的情况,默认值为False;如果为 True,则使用更精确的 L2 范数进行计算
边缘检测算子:https://blog.csdn.net/wsp_1138886114/article/details/81368890

4.实例代码测试

(1)图片测试代码

import os
import cv2
import numpy as npdef handl_Canny(pic_path='images/lenna.jpg'):#读取图像img=cv2.imread(pic_path)#缩放图像的大小img=cv2.resize(src=img,dsize=(512,512))#对图像进行边缘检测,低阈值=50 高阈值=200img_canny=cv2.Canny(img,threshold1=50,threshold2=200)#显示检测之后的图像cv2.imshow('image',img_canny)#显示原图像cv2.imshow('src',img)cv2.waitKey(0)#销毁所有的窗口
cv2.destroyAllWindows()
if __name__ == '__main__':print('PyCharm')handl_Canny()

(1)调节阈值大小

threshold1=80,threshold2=200

threshold1=130,threshold2=200

threshold1=50,threshold2=220

threshold1=30,threshold2=100

threshold1=30,threshold2=80

总结:可以发现随着threshold1和threshold2的差距变大,检测出的边缘越来越少。因为他们之间的阈值间距越大,那么出现在阈值之间的梯度值就越多,出现不连续的边缘也就越多,导致很多都被过滤掉,所以最后检测出的边缘较少;但是比如threshold1=30,threshold2=100之间相差70,而threshold1=100,threshold2=170之间也是相差70,但是前面一种检测出的边缘又比后面的多,因为梯度值大多数集中在了100以下,所以前面一种检测出的边缘更多。

(2)使用L2gradient=True

如果为 True,则使用更精确的 L2 范数进行计算

上比于上面,threshold1=30,threshold2=80,检测出的边缘越来越少了;

(3)设置apertureSize中的Sobel算子大小

Canny(img,threshold1=50,threshold2=200,apertureSize=5)

和上面的threshold1=50,threshold2=200,比较,细节要多了很多。
https://blog.csdn.net/wsp_1138886114/article/details/81368890

(2)实时检测代码

import os
import cv2
import numpy as np
def detect_Canny():cap=cv2.VideoCapture(0)while cap.isOpened():OK,frame=cap.read()# 缩放图像的大小img = cv2.resize(src=frame, dsize=(512, 512))# 对图像进行边缘检测,低阈值=50 高阈值=200img_canny = cv2.Canny(img, threshold1=30, threshold2=100)# 显示检测之后的图像cv2.imshow('image', img_canny)if cv2.waitKey(1)&0XFF==27:breakcap.release()cv2.destroyAllWindows()#销毁所有的窗口
cv2.destroyAllWindows()
if __name__ == '__main__':print('PyCharm')detect_Canny()


5.Canny的实际应用

如视觉显著性检测,目标检测,跟踪和运动分析,结构从运动,3D重建,自动驾驶,图像到文本分析等等

Opencv中的Canny边缘检测相关推荐

  1. OpenCV系列之Canny边缘检测 | 十九

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

  2. opencv+Recorder︱OpenCV 中的 Canny 边界检测+轮廓、拉普拉斯变换

    本文来自于段力辉 译<OpenCV-Python 中文教程> 边缘检测是图像处理和计算机视觉中的基本问题,通过标识数字图像中亮度变化明显的点,来捕捉图像属性中的显著变化,包括深度上的不连续 ...

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

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

  4. candy算子python_Python-计算机视觉中的Canny边缘检测方法

    今天的想法是用Canny边缘检测算法,建立一种可以勾画出图像上任何物体的边缘的算法. 首先,我们来描述一下Canny边缘检测器:Canny边缘检测算子是一种边缘检测算子,它采用多级算法检测图像中广泛的 ...

  5. python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)

    原理 Canny边缘检测是一种常用的边缘检测算法.由 John F. Canny提出 这是一个多阶段的算法,我们将经历每个阶段. 1.降低噪音 由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高 ...

  6. 【图像处理】OpenCV中的边缘检测

    [图像处理]OpenCV中的边缘检测 部分参考来源 边缘检测的算子 边缘定义及类型 图像边缘描述 边缘检测算子类别 一阶微分算子:Roberts .Sobel .Prewitt 二阶微分算子:Lapl ...

  7. Canny边缘检测算法原理及其VC实现详解(二)

    3.  Canny算法的实现流程 由于本文主要目的在于学习和实现算法,而对于图像读取.视频获取等内容不进行阐述.因此选用OpenCV算法库作为其他功能的实现途径(关于OpenCV的使用,作者将另文表述 ...

  8. 第四章:OpenCV中的图像处理

    第四章:OpenCV中的图像处理 本章节你将学习图像的改变色彩空间.提取对象.图像的几何变换.图像的阈值.平滑图像等OpenCV图像处理的基本内容. 更多内容请关注我的GitHub库:TonyStar ...

  9. OpenCV中的图像处理 —— 图像梯度+Canny边缘检测+图像金字塔

    OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 目录 OpenCV中的图像处理 -- 图像梯度+Canny边缘检测+图像金字塔 1. 图像梯度 1.1 Sobel和Schar ...

最新文章

  1. 一个 Babelfish ,看懂云数据库的发展方向
  2. MySQL的优化(大纲)
  3. ML之RS:基于用户的CF+LFM实现的推荐系统(基于相关度较高的用户实现电影推荐)
  4. 微博:吃饭砸锅的艺术
  5. 上学路线 (Standard IO)
  6. mysql中一些简单但是新手容易犯的错误
  7. net core 3.0 之Grpc新特性小试牛刀
  8. vscode 使用 ssh 登录
  9. 敏捷开发绩效管理之三:个体动力之源——同行压力(松结对编程,师徒制度,跨职能团队,绩效考核)...
  10. wait会释放锁吗_漫画:如何证明sleep不释放锁,而wait释放锁?
  11. LINUX获得毫秒时间戳的代码
  12. debian远程桌面设置
  13. mysql建表语句转换成oracle,如何手动将ORACLE的sql建表语句转换为MYSQL的建表语句...
  14. sci-hub, libgen等科研用文献书籍下载
  15. 联想拯救者Legion Y7000 2020款(10代INTEL+GTX1650)安装ubuntu16.04(双系统)探索内核与显卡网卡驱动的关系
  16. OllyDbg笔记-Olly Advanced插件使用
  17. Hadoop数据迁移工具DistCp
  18. 豆瓣爬虫btmd_12_Mamba文件
  19. beego框架-logs模块学习笔记
  20. 和月薪5W的华为程序员聊过后,才知道自己一直在打杂...

热门文章

  1. Ubuntu16.04/18.04安装MATLAB2018b
  2. Mac无法启动eclipse
  3. 奔三的尴尬年纪,你要知道的44件事
  4. 使用JQuery选择HTML遍历函数
  5. 100条为人处事的技巧
  6. iphonex计算机历史记录,拿到 iPhone X 之后,一定要试试这些「独占」的新功能
  7. 计算机毕设题目推荐 - 毕业设计项目
  8. 使用CrazyXhtml.com将您的PSD文件转换为HTML代码
  9. vs登录界面空白_金蝶KIS云专业版登录使用时一片空白
  10. UX设计师你需要知道的52个专业术语