在这一篇文章里我们将去学习在计算机视觉中边缘检测的知识,并且去使用OpenCV来实现Canny边缘检测算法。
一:什么是边缘检测
边缘检测是计算机视觉领域非常重要的一种图像特征提取方法,同样也是比较好用的特征提取方法。我们通过边缘检测就是为了找到图像中像素亮度发生剧烈变化像素点集合,通常这些集合表现出来往往是轮廓。如果我们可以将物体的轮廓表现出来,拓展一下思路,我们可以把物体的面积,形状等等特征表示出来。在现实情况中,我们得到的边缘往往会分为4大类情况:
①:深度的不连续(物体处在不同的物平面上);
②: 表面方向的不连续(如正方体的不同的两个面);
③:物体材料不同(这样会导致光的反射系数不同);
④:场景中光照不同(如被树萌投向的地面);
二:边缘检测的方法
边缘检测与上一篇文章中的图像金字塔其实有关联,因为边缘的提取本身就是一个滤波的过程,通过不同的算子来去提取不同的特征。每种算子都有他的特点,抛开现在神经网络方法不谈,传统的方法一般有三种:Sobel算子,Laplacian算子,Canny算子。
1:Sobel算子
在这篇文章中,比较详细的介绍了Sobel算子的原理。
CV学习笔记(十三):图像梯度 - 云时之间的文章 zhuanlan.zhihu.com/p/11
在目标检测中,Sobel算子对灰度渐变和噪声较多的图像处理效果较好,但是Sobel算子对边缘定位不是很准确(图像的边缘不止一个像素),因此精度要求不是很高时,Sobel比较常用。
2:Laplacian算子
Laplacian算子其实就是使用二阶微分的算子,更通俗来说就是梯度的散度。
二阶微分:
令
然后带入卷积模板: