Canny算法学习

一. 目标

识别一副图中的sudden change

二.定义

1.边缘

图像中发生强烈变化的地方

2.有限差分

类比于积分,可以使用有限差分来表现变化 

3.梯度

图像的梯度: 

梯度的幅角 : 

边缘的强度:

三. 算法步骤

1.将原图灰度化

使用公式: $v = 0.299R + 0.587G + 0.114B $

2.高斯模糊

由于原图中存在许多随机噪声,在求导过程中,可能会产生很大的变化,但这些噪声并不是我们要求的边缘。所以需要通过高斯模糊去除高频部分。

3. 使用一阶偏导的有限差分来计算梯度的幅值和方向

4.非最大化抑制

图像梯度幅值矩阵中的元素值越大,说明图像中该点的梯度值越大,但这不能说明该点就是边缘。Canny算法中

1. 将该像素的幅度与该像素正梯度方向上的和负梯度方向上的像素相比

2.如果该像素是最大的,该值会保留,否则则会被抑制(置0)

 

5.双阈值的选取

Canny算法中采用双阈值法,根据高阈值得到一个边缘图像,这样一个图像含有很少的假边缘,但是由于阈值较高,产生的图像边缘可能不闭合,所以需要低阈值。高于高阈值的称为强边缘,介于高阈值和低阈值之间的称为弱边缘

6.滞后边界跟踪

在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8领域中寻找高于低阈值的点,形成轮廓。(即将在强边缘像0素八领域内的弱边缘像素认为是强边缘像素)

四.相关函数

Opencv中的Canny函数

函数原型:

cv2.Canny(image, thresholod, threshold2, apertureSize, L2gradient) -> edges

image:输入的图像,要求是灰度图

thresholod1:低阈值,用来找出弱边缘

thresholod2:高阈值,用来找出强边缘

apertureSize:sobel模版的尺寸

L2gradient:采用L1范式计算算子还是L2范式计算算子

// edge detection

原文地址:https://www.cnblogs.com/tempestT/p/10894905.html