Canny边缘检测是一种使用多级边缘检测算法检测边缘的方法
Canny边缘检测的步骤:
(1)去噪。
(2)计算梯度的幅度与方向
(3)非极大值抑制,适当地让边缘“变瘦”
(4)确定边缘,使用双阈值算法确定最终的边缘信息
图像的边缘易收到噪声的干扰,我们为了检测到准确的边缘信息,通常要对图像进行滤波去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域。
高斯滤波器T对图像O的像素点226滤波得到D
高斯滤波器不是固定的,滤波器的核越大,边缘信息对噪声的敏感度就越低,边缘检测的定位错误也会越大,所以一般使用5×5的核就可以满足大多数情况。
梯度的方向与边缘的方向是垂直的,通常取近似值为水平、垂直、对角线
边缘检测算子返回水平方向的Gx和垂直方向的Gy,梯度的幅度和方向表示为:
atan2()表示具有两个参数的arctan函数
2↑表示梯度的幅度为2,方向为90°
确定好梯度和方向后,遍历图像的每一个像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,并根据结果判断是否抑制该点。
如果该点是正或负方向上的局部最大值,则保留该点。如果不是,就抑制该点(归零)
经过上述细化边缘后,获取的边缘有强边缘和虚边缘(真实图像产生或噪声产生),所以我们要去除由噪声产生的虚边缘
设置两个阈值,maxVal,minVal,步骤为:
(1)当边缘像素的梯度值大于或等于maxVal,则当前边缘像素为强边缘。
(2)大于minVal小于maxVal时,像素为虚边缘(需要保留)。
(3)小于等于minVal时,则抑制当前边缘像素。
得到虚边缘后,要判断虚边缘与墙边缘是否连接,若与强边缘连接则处理为边缘,若与强边缘无连接,则为弱边缘,抑制。
高阈值和低阈值是不固定的,要针对不同图像进行定义。
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 ()