OpenCV-python学习笔记(十)——Canny边缘检测

十、Canny边缘检测

Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法

10.1 Canny边缘检测基础

Canny边缘检测的步骤:

(1)去噪。

(2)计算梯度的幅度与方向

(3)非极大值抑制,适当地让边缘“变瘦”

(4)确定边缘,使用双阈值算法确定最终的边缘信息

10.1.1 高斯滤波去除图像噪声

图像的边缘易收到噪声的干扰,我们为了检测到准确的边缘信息,通常要对图像进行滤波去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域。
在这里插入图片描述

高斯滤波器T对图像O的像素点226滤波得到D

高斯滤波器不是固定的,滤波器的核越大,边缘信息对噪声的敏感度就越低,边缘检测的定位错误也会越大,所以一般使用5×5的核就可以满足大多数情况。

10.1.2 计算梯度

梯度的方向与边缘的方向是垂直的,通常取近似值为水平、垂直、对角线

边缘检测算子返回水平方向的Gx和垂直方向的Gy,梯度的幅度和方向表示为:
在这里插入图片描述

atan2()表示具有两个参数的arctan函数

梯度的可视化表示方法:
在这里插入图片描述

2↑表示梯度的幅度为2,方向为90°

10.1.3 非极大值抑制

确定好梯度和方向后,遍历图像的每一个像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据结果判断是否抑制该点。

如果该点是正或负方向上的局部最大值,则保留该点。如果不是,就抑制该点(归零)

10.1.4 双阈值确定边缘

经过上述细化边缘后,获取的边缘有强边缘和虚边缘(真实图像产生或噪声产生),所以我们要去除由噪声产生的虚边缘

设置两个阈值,maxVal,minVal,步骤为:

(1)当边缘像素的梯度值大于或等于maxVal,则当前边缘像素为强边缘。

(2)大于minVal小于maxVal时,像素为虚边缘(需要保留)。

(3)小于等于minVal时,则抑制当前边缘像素。

得到虚边缘后,要判断虚边缘与墙边缘是否连接,若与强边缘连接则处理为边缘,若与强边缘无连接,则为弱边缘,抑制。

高阈值和低阈值是不固定的,要针对不同图像进行定义。

10.2 Canny函数

edges=cv.Canny (image,threshold1,threshold2[,apertureSize[,L2gradient]])

image:输入的8位图像

threshold1:第一个阈值

threshold2:第二个阈值

apertureSize:Sobel算子的孔径大小

L2gradient:计算图像梯度幅度的标识,默认值为False,如果为Ture,则使用更精确的L2范数进行计算**(两个方向的导数的平方和再开方),否则使用L1范数(直接两个方向的导数的绝对值相加)**

当threshold1和threshold2值较小时,可以获得更多的边缘信息。

示例:使用不同大小的阈值获得不同的边缘信息

import cv2
o=cv2.imread ("lena.png",cv2.IMREAD_GRAYSCALE)
r1=cv2.Canny (o,128,200)
r2=cv2.Canny (o,32,128)
cv2.imshow ("original",o)
cv2.imshow ("result1",r1)
cv2.imshow ("result2",r2)
cv2.waitKey ()
cv2.destroyAllWindows ()

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_56321457/article/details/126078470