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()

原图:

扫描二维码关注公众号,回复: 2632236 查看本文章

效果图:

  • 由于Canny只能处理灰度图,所以将读取的图像转成灰度图。用高斯平滑处理原图像降噪。
  • 调用Canny函数,指定最大和最小阈值,其中apertureSize默认为3。

猜你喜欢

转载自blog.csdn.net/wzyaiwl/article/details/81278808