目录

  • 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算子又分为水平算子和竖直算子,用水平算子和竖直算子分别与原图像卷积,得到竖直和水平方向的梯度分量,如下所示:

    然后采用以下方式计算总梯度:

    有时为了简化计算,也采用以下方式:

2.3 非极大值抑制

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

2.3.1 插值法

如下图所示:

Imatest 图像测试算法_计算机视觉


根据差值如上图所示方法,计算当前点前后位置处的差值梯度强度,如果当前点梯度大小小于前后位置处的差值梯度强度,则说明当前点不在边缘上,非边缘点。

2.3.2 简化方法

如下图所示:

Imatest 图像测试算法_算法_02


实际上我们可以用上图所示方法进行简化,将当前点周围简化为八个方向(四个方向),看梯度方向与八个方向中的哪个最接近,就用哪个方向上的相邻两点梯度大小与当前点梯度大小进行比较。

2.4 双阈值检测

应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。

Imatest 图像测试算法_opencv_03


如上图所示:

  • 选取系数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')

输出:

Imatest 图像测试算法_opencv_04