OpenCV-Python (Canny边缘检测)_canny边缘检测算法python-程序员宅基地

技术标签: Opencv-Python  OpenCV  边缘检测  Canny  Python  

Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。

  1. 图像降噪
  2. 计算图像梯度
  3. 非极大值抑制
  4. 阈值筛选

原型

OpenCV-Python中Canny函数的原型为:

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

必要参数:

  • 第一个参数是需要处理的原图像,该图像必须为单通道的灰度图;
  • 第二个参数是阈值1;
  • 第三个参数是阈值2。

其中较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。

可选参数中apertureSize就是Sobel算子的大小。而L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)。

具体的算法可参见清华大学出版社的《图像处理与计算机视觉算法及应用(第2版) 》第二章,其中有Canny算法的详细描述及实现。

函数返回一副二值图,其中包含检测出的边缘。

使用

Canny函数的使用很简单,只需指定最大和最小阈值即可。如下:

#coding=utf-8

import cv2
import numpy as np  


img = cv2.imread("D:/lion.jpg", 0)  # 由于Canny只能处理灰度图,所以将读取的图像转成灰度图


img = cv2.GaussianBlur(img,(3,3),0) # 用高斯平滑处理原图像降噪。若效果不好可调节高斯核大小

canny = cv2.Canny(img, 50, 150)     # 调用Canny函数,指定最大和最小阈值,其中apertureSize默认为3。


cv2.imshow('Canny', canny)

cv2.waitKey(0)

cv2.destroyAllWindows()

原图:

处理结果如下:

分别为高斯核为(1,1)和(3, 3)的效果图:

更多

这个程序只是静态的,下面是可以在运行时调整阈值大小的程序。其代码如下:

import cv2
import numpy as np

def CannyThreshold(lowThreshold):
    detected_edges = cv2.GaussianBlur(gray,(3,3),0)
    detected_edges =cv2.Canny(detected_edges,lowThreshold,lowThreshold*ratio,apertureSize = kernel_size)
    dst = cv2.bitwise_and(img,img,mask = detected_edges)  # just add some colours to edges from original image.
    cv2.imshow('canny demo',dst)

lowThreshold = 0
max_lowThreshold = 100
ratio = 3
kernel_size = 3

img = cv2.imread('D:/lion.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

cv2.namedWindow('canny demo')

cv2.createTrackbar('Min threshold','canny demo',lowThreshold, max_lowThreshold, CannyThreshold)

CannyThreshold(0)  # initialization

if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

效果图如下:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/haohaomua/article/details/100742181

智能推荐

安卓系统开发下载和安装JRE-程序员宅基地

文章浏览阅读277次。在你下载和安装Eclipse之前,你必须确保在电脑上下载并安装了JavaRuntimeEnvironment(JRE)。因为Eclipse作为一个程序是由Java写成,它要求JRE来运行。如果JRE没有安装或被检测到,如果你..._安卓 安装jre环境

关于查看OCX控件接口和AdobeReader,FoxitReader在页面中展示PDF文件_foxitpdfreader control ocx-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏3次。IE浏览器展示pdf,控件,FoxitReader,FoxitReaderOCX.ocx,classid_foxitpdfreader control ocx

hive 字符串拼接函数_hive 字符串拼接 窗口函数-程序员宅基地

文章浏览阅读10w+次,点赞4次,收藏22次。字符串拼接函数CONCAT()语法: CONCAT(string A, string B…)返回值: string说明:返回输入字符串连接后的结果,支持任意个输入字符串举例:Hive> select concat(‘abc’,'def’,'gh’) from lxw_dual;abcdefgh延伸:指定分割字符的拼接函数CONCAT_WS()_hive 字符串拼接 窗口函数

2017软考 | 正式的培训课开始之前,我该做些什么?-程序员宅基地

文章浏览阅读98次。转眼又到了2017年上半年的软考考试季(5月20日),攻克要塞(公众号ruankao580)与培训结构合作的课程马上就要开始,基于攻克要塞软考团队以往的面授经验,因此,我们就面授课正式开始之前的预习事宜给出若干建议。考点:必须知道,考试所涉及的知识点众多,因此,对考点要有一个综合性的了解,我们不建议马上打开书,而是先看知识点的分布图或翻看教程的目录,初步形成对考试范围..._培训课开始之前怎么说

计算机二级c语言考试真题及答案详解,全国计算机二级c语言考试题-程序员宅基地

文章浏览阅读1k次。在全国的计算机二级考试中,我们会遇到什么样的知识点题目呢?下面是学习啦小编给大家整理的计算机二级c语言考试题目及答案,供大家参阅!计算机二级c语言考试选择题1.下列数据结构中,属于非线性结构的是(  )。A.循环队列B.带链队列C.二叉树D.带链栈2.在面向对象方法中,实现信息隐蔽是依靠(  )。A.对象的继承B.对象的多态C.对象的封装D.对象的分类3.对于循环队列,下列叙述中正确的是(  )。..._下选项中,能用做用户标识符的是( ).【2009年9月】 [单选题] avoidb8_8c_0_d

VFH & VFH+ & VFH*—— Path Planning_matlab vfh算法 路径规划 矢量场直方图-程序员宅基地

文章浏览阅读4.3k次,点赞11次,收藏40次。版权声明:本文为博主原创博文,未经允许不得转载,若要转载,请说明出处并给出博文链接 最近在学习VFH算法,感觉蛮神奇,特意从维基百科扒来了资料,供学习研究。。。 在机器人技术中,Vector Field Histogram(VFH,向量场直方图)是Johann Borenstein和Yoram Koren在1991年提出的一种实时路径规划算法。VFH通过所谓的直方图网格利用机器人环境的统计表示,因此非常重视处理来自传感器和建模误差的不确定性。与..._matlab vfh算法 路径规划 矢量场直方图

随便推点

web 登录oracle数据库服务器,从数æ�库中è¿é— Web æœ�务-程序员宅基地

文章浏览阅读2.2k次。打开一个 DOS 窗å�£ï¼Œè¾ç½ CLASSPATH 环境å�˜é‡�,使其包括以下内å¹ï¼š%oracle_home%\jdbc\lib\ojdbc14.jar;%oracle_home%\jdbc\lib\orai18n.jar;%oracle_home%\sqlj\lib\translator.jar;%oracle..._è é— androeed.cn ¥ è é 6

IDEA中Debug的各种按钮怎么用_idea 新版调试框按钮变3个了-程序员宅基地

文章浏览阅读250次。IDEA中Debug的各种按钮怎么用对于我们的日常开发,很多时候都会用到debug这个功能,通过该功能我们可以看到代码的执行流程,看到每段代码的参数,同时该方法也有利于我们进行源码的阅读,不过对于小白来说,很多时候看不懂debug的标志本章使用的idea开发工具为2019.2.3版本Debug中的标志含义Debug的优化设置进行如下设置更加节省内存空间Setting -> Build,Execution,Deployment -> Debugger拓展知识在我们进行debug_idea 新版调试框按钮变3个了

RHCE考试--05、使用 Ansible Galaxy 安装角色_ansible-galaxy install -r requirements.yml-程序员宅基地

文章浏览阅读140次。使用 Ansible Galaxy 和要求文件 /home/greg/ansible/roles/requirements.yml。http://materials/haproxy.tar 此角色的名称应当为 balancer。http://materials/phpinfo.tar 此角色的名称应当为 phpinfo。_ansible-galaxy install -r requirements.yml

Spring中JDK动态代理和CGLIB动态代理的性能比较-程序员宅基地

文章浏览阅读141次。新项目开始之前领导让研究下公司原有的框架(基于struts1.2.9+spring2.0.6),比较古老了。读service基类时发现竟然将request穿透到了service层(request为BaseService的实例变量),这样service就变成了有状态Bean,使service层变成了非线程安全,导致用Spring容器管理service的时候不得不使用prototype的sco..._springboot 2.* 动态代理速度比较

window服务器环境将springboot项目 jar包注册成一个window服务自启动_springboot windows注册服务-程序员宅基地

文章浏览阅读1.6k次。window服务器环境将springboot项目 jar包安装成一个window服务自启动_springboot windows注册服务

北京科技大学计算机实践报告,北京科技大学计算机实践报告附加资料-Book5-程序员宅基地

文章浏览阅读115次。北京科技大学计算机实践报告附加资料Excel 文档学生期末考试成绩单学号 0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 最高分 最低分 平均分 姓名 name1 name2 name3 name4 name5 name6 name7 name8 ..._03:0004:0005:0006:0007:0008:0009:0010:0011:0012:0013:0014:0015:00十團

推荐文章

热门文章

相关标签