一:Canny算法介绍

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
好的检测- 算法能够尽可能多地标识出图像中的实际边缘。
好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

推文:Canny边缘检测算法原理及其VC实现详解(一)

1.高斯模糊--GaussianBlur  消除噪声。 一般情况下,使用高斯平滑滤波器卷积降噪。,因为canny是对噪声敏感的算法,所以先降噪,但是降噪不要太过,以免丢失
2.灰度转换--cvtColor  
3.计算梯度--Sobel/Scharr
4.非最大信号抑制
5.高低阈值输出二值图像

补充:

非最大信号抑制

在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,通俗意义上是指寻找像素点局部最大值,将非极大值点所对应的灰度值置为0
sobel算子中有一个x,y
根据x,y可以求出一个θ角度
1.要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。是最大则下一步
2.图中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。  因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点
3.如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。
完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。根据下文的具体测试图像可以看出,这样一个检测结果还是包含了很多由噪声及其他原因造成的假边缘。因此还需要进一步的处理。

高低阈值输出二值图像

二:Canny边缘提取实现

def edge_demo(image):#1.高斯模糊blurred = cv.GaussianBlur(image,(3,3),0)#2.灰度转换gray = cv.cvtColor(blurred,cv.COLOR_RGB2GRAY)#3.计算梯度xgrad = cv.Sobel(gray,cv.CV_16SC1,1,0)  #canny方法API要求不允许使用浮点数ygrad = cv.Sobel(gray,cv.CV_16SC1,0,1)#4.Canny方法中包含非最大信号抑制和双阈值输出edge_output = cv.Canny(xgrad,ygrad,50,150)  #50是低阈值,150是高阈值cv.imshow("Canny Edge",edge_output)dst = cv.bitwise_and(image,image,mask=edge_output)  #相与,获取颜色cv.imshow("Color Edge",dst)src = cv.imread("./g.png")  #读取图片
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)    #创建GUI窗口,形式为自适应
cv.imshow("input image",src)    #通过名字将图像和窗口联系edge_demo(src)cv.waitKey(0)   #等待用户操作,里面等待参数是毫秒,我们填写0,代表是永远,等待用户操作
cv.destroyAllWindows()  #销毁所有窗口

使用Canny计算梯度

def edge_demo(image):#1.高斯模糊blurred = cv.GaussianBlur(image,(3,3),0)#2.灰度转换gray = cv.cvtColor(blurred,cv.COLOR_RGB2GRAY)#3.直接传入灰度图像,Canny方法中包含计算梯度,非最大信号抑制和双阈值输出edge_output = cv.Canny(gray,50,150)  #50是低阈值,150是高阈值cv.imshow("Canny Edge",edge_output)dst = cv.bitwise_and(image,image,mask=edge_output)cv.imshow("Color Edge",dst)

相关知识补充

(一)Canny方法

(1)需要我们求出梯度

Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges
使用带自定义图像渐变的Canny算法在图像中查找边缘,

其函数原型为:Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]]) -> edges

dx参数表示输入图像的x导数(x导数满足16位,选择CV_16SC1或CV_16SC3)

dy参数表示输入图像的y导数(y导数满足16位,选择CV_16SC1或CV_16SC3)。

threshold1参数表示设置的低阈值。

threshold2参数表示设置的高阈值,一般设定为低阈值的3倍 (根据Canny算法的推荐)。

edges参数表示输出边缘图像,单通道8位图像。

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

(2)直接调用Canny算法在单通道灰度图像中查找边缘,

def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None): # real signature unknown; restored from __doc__
image参数表示8位输入图像。threshold1参数表示设置的低阈值。threshold2参数表示设置的高阈值,一般设定为低阈值的3倍 (根据Canny算法的推荐)。edges参数表示输出边缘图像,单通道8位图像。apertureSize参数表示Sobel算子的大小。L2gradient参数表示一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。

OpenCV---Canny边缘提取相关推荐

  1. python canny 保留指定区域的轮廓线_opencv python Canny边缘提取实现过程解析

    这篇文章主要介绍了opencv python Canny边缘提取实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Canny是边缘提取算法 ...

  2. OpenCV——canny算子

    1. opencv--Canny算子 Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是: 最好的检测: 算法能够尽可能多地标识出图像中的实际边缘. 最好的定位: 标识出的边缘要尽可 ...

  3. OpenCV Canny边缘检测的实例(附完整代码)

    OpenCV Canny边缘检测的实例 OpenCV Canny边缘检测的实例 OpenCV Canny边缘检测的实例 #include "opencv2/core/utility.hpp& ...

  4. OpenCV——Canny直线检测

    目录 前言 正文 原理 高斯滤波过滤 计算像素点的梯度方向(Sobel算子) 非极大值抑制 用双阈值算法检测和连接边缘 通过抑制孤立的弱边缘最终完成边缘检测 代码 参考文献 前言 Canny边缘检测是 ...

  5. opencv Canny边缘检测用法

    <span style="color:#000080">1. cv2.Canny(image, threshold1, threshold2[, edges[, ape ...

  6. 十四、Canny边缘提取

    一.算法步骤 1,对图像进行GaussianBlur(高斯模糊)消除一些噪声 2,对图像进行灰度转换cvtColor 3,计算梯度Sobel/Scharr 4,非最大信号抑制 5,高低阈值输出二值图像 ...

  7. (九)OpenCV Canny边缘检测

    1.基础原理 参考自<数字图象处理>第十章 及OpenCV Tutorial Canny Edge Detector 1.1边缘检测概述 边缘检测是根据灰度突变来分割图像的一种常用方法.边 ...

  8. Python cv2(Opencv) Canny边缘检测 和 傅里叶变换

    简介: OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效,由一 ...

  9. opencv Canny算子

    叙述Canny()函数,这个函数是拿来边缘检测的,最好是高定位低出错. 第一个参数:srcImage,注意要是8位.这个要求和自适应阈值化函数的要求一样. 第二个参数:dstImage,要和srcIm ...

  10. python canny 保留指定区域的轮廓线_opencv python:Canny边缘提取

    Canny是边缘提取算法,在1986年提出的 是一个很好的边缘检测器 Canny算法介绍 非最大信号抑制: 高低阈值连接: example import cv2 as cv import numpy ...

最新文章

  1. C++编程进阶8(最好不要实现类型转换运算符、单形参的构造函数与类型转换、临时对象与RVO)
  2. Postgresql中文排序
  3. [渝粤教育] 西南科技大学 投资经济学 在线考试复习资料(2)
  4. 【转】C++中的字符串(String)和数值转换
  5. 能力=知识+技能+经验
  6. Ubuntu 安装配置 ROR3
  7. CXF框架介绍及Spring集成
  8. 关闭Ubuntu错误报告
  9. linux内核mtd驱动程序与sd卡驱动程序,Linux内核MTD驱动程序及SD卡驱动程序.doc
  10. 在Linux下进入目录,目录下创建、修改、删除文件所需权限
  11. bilibili ,B站视频预览缩略图实现分析
  12. 2020switch电信最快的dns_《2020switch电信最快的dns》电影_2020switch电信最快的dns正片免费观看-深圳市创业发科技有限公司...
  13. 游戏开发工具引擎/模拟器收集
  14. feedburner怎么用_新手RSS订阅使用指南
  15. 让自己的电脑会说话||让电脑在开机时说话
  16. 高通平台耳机类型识别
  17. 真无线蓝牙耳机哪款适合新手?数码发烧友最全盘点,高实用性蓝牙耳机
  18. 一级建造师考试备考顺序
  19. 基于asp.net742自驾游旅游服务网站的设计
  20. 多个微信服务号对接一个微信商户号流程

热门文章

  1. 23种设计模式的意图和适用范围
  2. Kebernetes 学习总结(8) statefulset
  3. 使用Istio分布式跟踪应用程序
  4. 虚拟Linux系统使用Windows系统oracle数据库
  5. 《高度安全环境下的高级渗透测试》—第1章1.5节安装OpenOffice
  6. 如何安装 chrome 开发版
  7. zencart 批量修改价格
  8. 查看User Profile的名称和显示名称
  9. DDR2与DDR的区别
  10. 根据 List 对象中的某个字段进行排序