天天看点

canny边缘检测_边缘检测算法

canny边缘检测_边缘检测算法

通过物体的边缘检测,我们可以完成很多的图像识别任务。科学研究发现,图像边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘。常见的边缘检测算法包括Soble边缘检测,拉普拉斯边缘检测和Canny边缘检测。

Sobel边缘检测

图像的彩色信息在进行边缘检测时通常是多余的,因此可以在进行边缘检测前先把彩色图像转换成灰度图像。直观的感觉,灰度图像中的边缘一定是变化相对比较剧烈的区域,那么这个区域灰度值的一阶导数便是取极大值或者极小值。Sobel边缘检测正是基于这一原理,在OpenCV中的函数定义如下:

Sobel(src,ddepth, dx, dy, ksize=None, scale=None, delta=None, borderType=None)
           

其中主要的参数如下:

  • ddepth: 深度类型,通常用cv2.CV_64F表示64位浮点数即64 float。
  • dx:x方向的导数,1表示取导,0表示不取导。
  • dy: y方向的导数,1表示取导,0表示不取导。
  • ksize: 卷积核的大小。
# 加载需要的库文件
           
canny边缘检测_边缘检测算法

Sobel边缘检测,区分不同的方向

import 
           
canny边缘检测_边缘检测算法

拉普拉斯边缘检测

基于一阶导数的Sobel效果并不理想,人们在其基础上提出了取对应的二阶导数为0的点为边缘。拉普拉斯边缘检测正是利用了这一原理。

拉普拉斯在OpenCV中的函数定义如下:

Laplacian(src, ddepth, ksize=None, scale=None, delta=None, borderType=None)
           

其中主要的参数为:

  • ddepth: 深度类型。
  • ksize: 卷积核大小。
img 
           
canny边缘检测_边缘检测算法

(A)图像表示原图,(B)图使用了拉普拉斯边缘检测,(C)图像使用了Sobel边缘检测。相对于Sobel,拉普拉斯对边缘的识别效果更好,但是拉普拉斯对噪声敏感,会产生双边效果,不能检测出边的方向,通常不直接用于边的检测,只起辅助的角色。

Canny边缘检测

Canny边缘检测是使用最广泛的边缘检测算法之一,可以有效减少噪音的影响,同时边缘处理的效果也不错。

Canny边缘检测算法可以分为以下5个步骤:

1) 使用高斯滤波器,以平滑图像,滤除噪声。

2) 计算图像中每个像素点的梯度强度和方向。

3) 应用非极大值抑制,以消除边缘检测带来的杂散响应。

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

5) 通过抑制孤立的弱边缘最终完成边缘检测。

Canny算法应用双阈值的技术,即设定一个阈值上界和阈值下界,图像中的像素点如果大于阈值上界则认为必然是边缘,小于阈值下界则认为必然不是边缘,两者之间的则认为是候选项,需进一步处理。

Canny边缘检测在OpenCV中的函数定义如下:

Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)
           

其中主要的参数如下:

  • threshold1: 阈值1,即低阈值。
  • threshold2: 阈值2,即高阈值。

低阈值用来控制边缘连接,高阈值用来控制强边缘的初始分割,低于低阈值的会被判定为不是边缘,高于高阈值的会被判定为边缘,中间区间的会通过计算判断是否为边缘。

import 
           
canny边缘检测_边缘检测算法

(A)图像是原图像,(B)图像是叠加的高斯噪声图像,(C)图像是对混有高斯噪声的图像进行拉普拉斯边缘检测,(D)图像是对混有高斯噪声的图像进行Canny边缘检测。由上图可以看出,拉普拉斯边缘检测容易受到噪声干扰,Canny边缘检测对噪声具有一定的抵御能力。

继续阅读