OpenCV学习(二) Canny算子

Canny介绍

Canny边缘检测算法是由John Canny在1986年提出的[26],是一种多级边缘检测的算法。该算法是从不同的视觉对象中提取有用的信息并减少数据量的一种技术。

Canny实现步骤

Canny边缘检测主要分为以下五个步骤:

  1. 使用高斯滤波对图像进行平滑处理
    使用高斯平滑滤波主要是为了减少噪声的干扰,引起边缘的误检测。使用高斯滤波器对图像进行卷积可以使得图像变得平滑。

  2. 计算图像的像素梯度强度和方向
    Canny计算边缘的算法中,计算像素的梯度强度和方向主要是为了给后续处理提供处理数据,经典的Canny算法常用四个梯度算子计算水平、垂直和对角线方向的梯度,在常用的情况中使用的是只含有水平方向和垂直方向的差分算子,例如在OpenCV学习(一) 相关和卷积中描述过的sobel算子。

  3. 非极大值抑制消除边缘杂散影响
    非极大值抑制是一种边缘细化方式,利用非极大值抑制使得边缘“锐化”。这是由于由梯度边缘计算所得到的边缘本身不止一个像素,而是周围多个像素都会是边缘
    OpenCV学习(二) Canny算子_第1张图片
    上述是x和y方向的sobel算子结果,得到了更为厚重的边缘,重叠像素部分更多。

  4. 使用双阈值法检测边缘
    完成非极大值抑制后的图像边缘中仍然存在着一些噪声和颜色变化引起的边缘,为了滤除这些由于杂散影响产生的边缘信息,可以采用阈值检测的方法,通过设定双阈值判定,设定的高阈值作为判定边缘像素是否为强边缘像素,判断依据是该点的梯度值是否超过阈值,同理,低阈值用于区分弱边缘像素和被抑制的像素点。通过双阈值法,选取高低阈值,保留强边缘像素,并将弱边缘像素点送至下一步骤进行最后的边缘像素点检测。

  5. 抑制孤立弱边缘完成检测
    该步骤主要检测由步骤四获取的弱边缘像素点。弱边缘像素点判定为边缘有两种可能,一种是由于它们是从真实边缘提取出来的,另一种是由于噪声或颜色变化引起的。通过查看弱边缘像素点的8个邻域像素,对弱边缘像素进行抑制,当弱边缘像素点的邻域含有强边缘像素时,可以保留边缘为真实边缘。

OpenCVCanny函数

CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize = 3, bool L2gradient = false );

这里的threshold1 和threshold2对应相应的高低阈值,apertureSize为sobel算子的大小

Canny边缘提取与其他边缘提取对比

Sobel

位或的sobelX和sobelY,以及直接使用opencv sobel算子得到的边缘结果(这里位或省去了取x和y的平方开根操作)
OpenCV学习(二) Canny算子_第2张图片

Laplacian

OpenCV学习(二) Canny算子_第3张图片

canny结果

Canny(in, out, 3, 9, 3)结果
OpenCV学习(二) Canny算子_第4张图片

Canny(in, out, 51, 101, 3)结果
OpenCV学习(二) Canny算子_第5张图片

参考链接:
Wiki上的Canny描述

你可能感兴趣的:(学习,opencv)