简介

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的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...

  3. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  4. 云时代架构阅读笔记十四——我对Hash算法的理解

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...

  5. OpenCV学习笔记十四:opencv_objdetect模块

    一,简介: 该库用于目标检测.

  6. Opencv笔记(十八)——轮廓的更多函数及其层次结构

    凸缺陷 前面我们已经学习了轮廓的凸包,对象上的任何凹陷都被成为凸缺陷.OpenCV 中有一个函数 cv.convexityDefect() 可以帮助我们找到凸缺陷.函数调用如下: hull = cv2 ...

  7. Opencv笔记(四)——绘图函数

    常用的绘图函数有: cv2.line()       cv2.circle()        cv2.rectangle()      cv2.ellipse()       cv2.putText( ...

  8. TCP/IP详解 笔记十四

    TCP/IP协议(二)  连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...

  9. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

随机推荐

  1. idea将web项目打成war包放在tomcat/webapps上运行

    1.进入Project Structure 或者 file -> Project Structure 或者 快捷键ctrl+alt+shift+s 2.选中Artifacts 3.点加号,然后如 ...

  2. json解析精度问题

    由于后台传过来的值是float或者double类型,解析之后作为对象放到字典或数组里面,被转成nsstring或者nsnumber会有一定的误差,很正常 解决办法,通过NSNumberFormatte ...

  3. SASS - 操作符

    SASS – 简介 SASS – 环境搭建 SASS – 使用Sass程序 SASS – 语法 SASS – 变量 SASS- 局部文件(Partial) SASS – 混合(Mixin) SASS ...

  4. css 居中布局方案

    position(transform css3  有些浏览器不兼容) <article id="one"> <section id="section&q ...

  5. mybatis+mysql 通过sql脚本生成mapper的部分内容

    SQL mysql SELECT concat('<if test="', COLUMN_NAME, ' != null"> ', COLUMN_NAME, ',< ...

  6. 18 11 27 高级的服务器连接 epoll

    ---恢复内容开始--- 之前的  http 服务器  都是采用 轮询的方式(就像 厨师挨个问谁饿了好做饭 一样  ) 而  epoll 用着高级的 方式  事件通知 (直接问谁饿了) 同时还和  计 ...

  7. kube-apiserver常用配置项

    KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"                                        ...

  8. python一个正则表达式的不解

    htmlSource="data-lazy=\"http://gtms01.alicdn.com/tps/i1/T1faOCFQXXXXc2jIrl-.png\"&quo ...

  9. JavaScript 之 "for"的衍生对象

    JavaScript for/in 语句 作用:for/in 语句用于遍历循环对象属性. 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作. 例子: 循环对象属性: var pers ...

  10. php对象:get_object_vars(), get_parent_class(),is_subclass_of(),interface_exists()

    get_object_vars():获得对象的属性,以关联数组形式返回 get_parent_class():获得对象的父类 is_subclass_of():判断对象是否某类(参数2)的子类实例出的 ...