Canny边缘检测算法原理及其OpenCV实现

目录

    • 1、简介
    • 2、Canny边缘检测算法主要步骤
      • 2.1 图像平滑
      • 2.2 计算梯度及其方向
      • 2.3 非极大值抑制
        • 2.3.1 插值法
        • 2.3.2 简化方法
      • 2.4 双阈值检测
    • 3、Opencv实例

1、简介

Canny边缘检是Canny在1986年提出来的,目前仍是图像边缘检测算法中最经典、先进的算法之一。

2、Canny边缘检测算法主要步骤

2.1 图像平滑

  • 使用高斯滤波器,完成图像平滑,滤除噪声;

2.2 计算梯度及其方向

  • 利用soble算子、Prewitt算子、Roberts算子等计算图像中每个像素点的梯度强度和方向,其中soble算子又分为水平算子和竖直算子,用水平算子和竖直算子分别与原图像卷积,得到竖直和水平方向的梯度分量,如下所示:
    Canny边缘检测算法原理及其OpenCV实现_第1张图片
    然后采用以下方式计算总梯度:
    在这里插入图片描述
    有时为了简化计算,也采用以下方式:
    在这里插入图片描述

2.3 非极大值抑制

计算完 每个像素点的梯度强度和方向后,采用非极大值抑制的方法,保留局部梯度最大的点,以得到细化的边缘,消除边缘检测带来的杂散响应。
边缘方向和梯度方向是垂直的,且梯度方向或边缘方向绝大多数情况下并不是水平或竖直的。那么这就引出了非极大值抑制的两种方法:

2.3.1 插值法

如下图所示:
Canny边缘检测算法原理及其OpenCV实现_第2张图片
根据差值如上图所示方法,计算当前点前后位置处的差值梯度强度,如果当前点梯度大小小于前后位置处的差值梯度强度,则说明当前点不在边缘上,非边缘点。

2.3.2 简化方法

如下图所示: Canny边缘检测算法原理及其OpenCV实现_第3张图片
实际上我们可以用上图所示方法进行简化,将当前点周围简化为八个方向(四个方向),看梯度方向与八个方向中的哪个最接近,就用哪个方向上的相邻两点梯度大小与当前点梯度大小进行比较。

2.4 双阈值检测

应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
Canny边缘检测算法原理及其OpenCV实现_第4张图片
如上图所示:

  • 选取系数TH和TL,比率为2:1或3:1。(一般取TH=0.3或0.2,TL=0.1);

  • 将小于低阈值的点抛弃,赋0;将大于高阈值的点立即标记(这些点为确定边缘点),赋1或255;

  • 将小于高阈值,大于低阈值的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋 1或255)

3、Opencv实例

img=cv2.imread("gauge.jpg",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,120,250)   #120和250分别对应底阈值和高阈值
v2=cv2.Canny(img,50,100)    #不同的双阈值效果对比

res = np.hstack((v1,v2))
cv_show(res,'res')

输出:
Canny边缘检测算法原理及其OpenCV实现_第5张图片

你可能感兴趣的:(机器学习,计算机视觉,Python,算法,计算机视觉,opencv,python)