Opencv笔记(十四)——边缘检测算法canny
简介
Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法,它是由很多步构成的算法。
最优边缘检测的三个主要评价标准:
- 低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
- 高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。
- 最小响应: 图像中的边缘只能标识一次。
算法过程
1.噪声去除,可使用5x5的高斯滤波器;
2.计算图像梯度,这里使用Sobel算子;
相同
3.非极大值抑制,在获得梯度的大小和方向后,要对整幅图像进行扫描,那些非边界上的点.对每个像素进行检查,看其是不是周围具有相同梯度方向的点中最大。
4.滞后阈值,要确定哪些边界才是真正的边界,这里需要设定两个阈值,即minVal和maxVal,当图像的灰度梯度高于maxVal才是真正的边界,低于minVal的边界会被抛弃,如果介于两者之间,就看这个点是否与被确定为边界的点相连。
如上图所示,A高于maxVal阈值,所以是真正的边界点,C虽然低于maxVal,但高于minVal且与A相连,所以C也是边界,B处于两阈值之间,且未与真正的边界点相连,所以B被抛弃。
Canny函数
在Opencv中只需要一个cv2.Canny()函数就能完成上面的几步。下面是该函数原型,返回处理后的图像:
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
- 第一个参数是需要处理的原图像,该图像必须为单通道的灰度图;
- 第二个参数是阈值1,即minVal;
- 第三个参数是阈值2 ,即maxVal;
- 选参数中apertureSize就是Sobel算子的大小;
- L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)。
代码实战
# coding=utf-8
import cv2
import numpy as np
img = cv2.imread("/home/wl/3.jpg", 0)
res=cv2.resize(img,None,fx=0.4,fy=0.4,interpolation=cv2.INTER_AREA)#原图太大
res = cv2.GaussianBlur(res,(3,3),0)
dst = cv2.Canny(res,50,100)
while(1):
cv2.imshow("Result",dst)
k = cv2.waitKey(1) & 0XFF
if k==ord('q'):
break;
cv2.destroyAllWindows()
原图:
效果图:
- 由于Canny只能处理灰度图,所以将读取的图像转成灰度图。用高斯平滑处理原图像降噪。
- 调用Canny函数,指定最大和最小阈值,其中apertureSize默认为3。
Opencv笔记(十四)——边缘检测算法canny的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...
- (C/C++学习笔记) 十四. 动态分配
十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...
- 云时代架构阅读笔记十四——我对Hash算法的理解
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...
- OpenCV学习笔记十四:opencv_objdetect模块
一,简介: 该库用于目标检测.
- Opencv笔记(十八)——轮廓的更多函数及其层次结构
凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2 ...
- Opencv笔记(四)——绘图函数
常用的绘图函数有: cv2.line() cv2.circle() cv2.rectangle() cv2.ellipse() cv2.putText( ...
- TCP/IP详解 笔记十四
TCP/IP协议(二) 连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...
- SharpGL学习笔记(十四) 材质:十二个材质球
材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...
随机推荐
- TP中统计指定字段的总数
如统计已激活设备数量和未激活设备数量 $condition = [ ['member_id', '=', $member_id] ]; $field = [ 'COUNT(IF(active_memb ...
- 《新标准C++程序设计》1.1-1.6(C++学习笔记1)
1.cout输出 cout<<待输出项<<待输出项2<<···; 2.cin输入 cin>>变量1>>变量2>>···; 3.C ...
- swift中利用系统线程实现异步加载数据同步更新UI
swift中的使用案例样式 // Mark: -数据源更新 typealias AddDataBlock = () ->Void var updataBlock:AddDataBlock? fu ...
- idea 2019.3 最新破解补丁和激活码,可破解至2089年!
链接:https://blog.csdn.net/qq_42914528/article/details/85617901 上面方法失效了,请尝试以下方式激活(2020.1.6更新) idea激活码( ...
- 【动手学pytorch】pytorch的基础操作
一.Tensor a) 张量是torch的基础数据类型 b) 张量的核心是坐标的改变不会改变自身性质. c) 0阶张量为标量(只有数值,没有方向的量),因为它不随 ...
- tfield的字段名和显示名
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Java线程——线程之间的数据共享
在 Java 传统线程机制中的共享数据方式,大致可以简单分两种情况: ➢ 多个线程行为一致,共同操作一个数据源.也就是每个线程执行的代码相同,可以使用同一个 Runnable 对象,这个 Runn ...
- centos系统将shell脚本改成systemctl启动的形式
说明: CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,就将程序存在系统服务里,即 ...
- 4)栈和队列-->受限线性表
栈和队列叫 受限线性表 只不过他们插入和删除的位置 相对于之前的线性表有了限制 所以叫受限线性表 1)栈-->就是先进后出 2)队列-->先进先出 3)循环链表框图: 4)队列
- DDL&DML
SQL语言的DDL和DML DDL:数据定义语言它是用来定义 管理数据对象(数据库和数据表)的. create(创建),alter(修改),drop(删除) 一.创建数据库create datebas ...