简介

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。

最新文章

  1. STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析
  2. (五)CoreData 使用 (转)
  3. 在虚拟中开启Windows 8.1的Hyper-V平台
  4. List的add方法与addAll方法的区别
  5. JavaScript入门(2)
  6. Managing Data in Containers
  7. java:高速排序算法与冒泡排序算法
  8. MyEclipse使用总结——修改MyEclipse默认的Servlet和jsp代码模板
  9. 最短路径Floyd算法【图文详解】
  10. C++ 中const作用
  11. python selenium 基本常用操作
  12. 【PAT】B1004 成绩排名
  13. Websocket(一)——原理及基本属性和方法
  14. cf220b
  15. git bash 常用命令
  16. mosquitto SSL认证
  17. jqgrid取所有行的值,jqgrid取行对应列(name)的值,jqgrid取多行值对应列转json的方法
  18. redis设计与实现-数据结构
  19. 即时通讯App怎样才能火?背后的技术原理,可以从这5个角度切入
  20. [保存]——pycharm5专业版激活方法

热门文章

  1. 基于云开发开发 Web 应用(四):引入统计及 Crash 收集
  2. logrotate+crond日志切割、轮询
  3. 关于javascript中this 指向的4种调用模式
  4. html 鼠标样式 鼠标悬停 小手样式
  5. OC项目加入swift第三方库遇到的坑
  6. UIWindow的那些事
  7. Aizu 2155 Magic Slayer 背包DP
  8. 兼容iphonex底部那个
  9. 第四章:Schema与数据类型优化
  10. 51nod 1438:方阵与完全平方数