OpenCV笔记(十六)——使用Canny方法进行边缘检测

Canny方法被许多人认为是拿来做边缘检测的最佳的方法。

在维基百科上有关于Canny方法的比较详细的介绍:http://en.wikipedia.org/wiki/Canny_edge_detector

所以下面只是简单地提一下,因为暂时没有充裕的时间去阅读OpenCV实现Canny的源代码。

Canny方法大体上以四个步骤完成:

1. 利用高斯滤波器过滤噪声。

2. 利用Sobel相似的方法得到图像的强度的梯度。(Sobel算子对图像做微分)

3. 利用Non-maximum suppression方法对第2步获得的候选边缘进行处理,移除不属于边缘部分的像素,留下比较细小的边缘。

4. Hysteresis,即设定upper, lower两个阈值,高于upper的认为是边缘,低于lower的不是边缘。在upper和lower之间的,只有它们与高于upper的像素邻接,才认为是边缘。upper和lower的比例一般为2:1或者3:1。

在OpenCV中,Canny方法的实现由Canny函数来完成:

void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false)

参数介绍:

image应为8位单通道的图像

edges和image有相同的尺寸和类型

threshold1是上文中的lower阈值

threshold2是upper阈值

apertureSize是Sobel算子的大小,一般为3

L2gradient是一个flag,如果为false,则计算gradient时候使用1范式,即计算行微分和列微分绝对值的和,如果为true,则计算行为分和列微分的平方和的开根号。

时间: 2024-07-30 05:01:02

OpenCV笔记(十六)——使用Canny方法进行边缘检测的相关文章

swift 笔记 (十六) —— 可选链

可选链(Optional Chaining) 我们都知道"可选型"是什么,那么可选链又是什么,举个例子解释一下: struct MyName{ var name } struct MyInfo { var myName:MyName? = MyName() } class MyClass { var structInstance: MyInfo? = MyInfo() } 这里有两个结构体和一个类,当,这个类实例化的时候: var myInstance = MyClass() 所有的可

C++学习笔记十六-模板和泛型编程(二)

C++学习笔记十六-模板和泛型编程(二) 16.4 类模板成员 1.模板作用域中模板类型的引用: 通常,当使用类模板的名字的时候,必须指定模板形参.这一规则有个例外:在类本身的作用域内部,可以使用类模板的非限定名.例如,在默认构造函数和复制构造函数的声明中,名字 Queue 是 Queue<Type> 缩写表示.实质上,编译器推断,当我们引用类的名字时,引用的是同一版本.因此,复制构造函数定义其实等价于: Queue<Type>(const Queue<Type> &a

MYSQL进阶学习笔记十六:MySQL 监控!(视频序号:进阶_35)

知识点十六:MySQL监控(35) 一.为什么使用MySQL监控 随着软件后期的不断升级,myssql的服务器数量越来越多,软硬件故障的发生概率也越来越高.这个时候就需要一套监控系统,当主机发生异常时,此时通过监控系统发现和处理. 这个监控实际上是在我们的开发完成之后,这个时候软件就开始在运行,这个运行我们就需要去关注到mysql服务器是否正常,那么我们要观察它就需要给它提供一些监控,这监控就是当它发生故障之后, 那么我们这个监控就会告诉我们到底什么地方发生了一些异常或者一些错误,这个时候我们就

PHP学习笔记十六【方法】

<?php //给一个函数传递基本数据类型 $a=90; $b=90.8; $c=true; $d="hello world"; function test1($a,$b,$c,$d) //test1(&$a,&$b,&$c,&$d)//如果是传地址那么值就会改变 { $a=78; $b=89.5; $c=false; $d="beijing"; } //调用函数 test1($a,$b,$c,$d); echo $a.&quo

OpenCV笔记(六)——随机数产生器、绘制文字

一.随机数产生器 在OpenCV中,我们主要使用RNG类(即Random Number Generator)来产生随机数. RNG rng(); // 默认以0xffffffff作为随机数产生器的种子 我们也可以以系统的当前时间作为随机数产生器的种子.这也是常用的手段. #include <time.h> RNG rng( (unsigned int)time(NULL) ); 另外,我们可以产生一定范围内的均匀分布或者高斯分布(均值为零)的随机数 rng.uniform(0, 10); //

章节十六、3-TestNG方法和类注解

一.Test Suite(测试套件) 我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有10个,我们需要创建不同的类来测试这10个页面的具体功能,测试具体功能的测试用例会放到具体的测试类中,把这些所有的测试类组合起来就成了Test Suite.可以根据我们的测试目的,选择一些类来组成Test Suite.可以选择一些基本功能的测试类,组成冒烟测试的测试类,冒烟测试可以快速的检验软件的基本

python学习笔记十六 django深入学习一

django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), #精确匹配 url(r'^articles/([0-9]{4})/$', views.year_archive), #动态路由 url(r'^articles/([0-9]{4})/([0-9]{2

《objective-c基础教程》学习笔记(六)—— 复合方法

今天我们要讲的复合,当然不是小情侣吵着分手,然后又在一起的复合. 复合遵循一个合成复用原则,又称为组合或者聚合复用原则.该原则的内容是:尽量使用对象组合,而不是继承来达到复用的目的.用聚合可以使系统更加灵活,类与类之间的耦合度降低.在objective-c中,复合是指将多个组件组合在一起,配合使用,从而得到一个完整的作品.严格的说,只有对象之间的组合才是复合.类中的基本数据和结构型对象不算复合. 继承和复合,是类与类之间两种重要的关系.接下来,我们就借用书本上的例子来介绍下复合关系. 假如我们要

spring in action学习笔记十六:配置数据源的几种方式

第一种方式:JNDI的方式. 用xml配置的方式的代码如下: 1 <jee:jndi-lookup jndi-name="/jdbc/spittrDS" resource-ref="true" id="dataSource"/> 用注解方式的代码如下: 1 @Bean 2 public JndiObjectFactoryBean jndiObjectFactoryBean(){ 3 JndiObjectFactoryBean jndi