Canny边缘检测

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

一:Canny边缘检测基础
步骤:
(1):去噪,噪声会影响边缘检测的准确度,因此首先要将噪声过滤掉
(2):计算梯度的幅度和方向
(3):非极大值抑制,即适当的让边缘“变瘦”
(4):确定边缘,使用双阈值算法确定最终的边缘信息

1:应用高斯滤波去除图像噪声

图像边缘容易受到噪声的干扰,为了避免检测到错误的边缘,通常需要对图像进行滤波以除 去噪声,滤波的目的是平滑一些纹理较弱的非边缘区域,以便得到更准确的边缘,在实际使用过程中,通常采用高斯滤波去噪。
在滤波过程中,高斯核的大小对边缘检测的效果很重要,核越大,边缘信息对于噪声的敏感度越低,但同时核越大,边缘检测的错误也会随之增加,通常来说,采用5*5的核就能满足大多数情况。

2、计算梯度

边缘检测返回水平方向的Gx和垂直方向的Gy。梯度的幅度G和方向如下:在这里插入图片描述
梯度的方向总是与边缘垂直的,通常就近取值为水平(左、右),垂直(上、下),对角线(右上、右下、左上、左下)8个方向。

3、非极大值抑制

在获得梯度的幅度和方向后,逐一遍历图像中的像素点,判断当前像素点是否是周围像素点中具有相同梯度方向的最大值,如果是则保留,否则抑制(归零),以达到去除非边缘的点的目的。
在这里插入图片描述
如上图所示,红色标记的点都是向上方向梯度(水平边缘)的局部最大值,这些点会被保留,其余的点被抑制为0,这意味着这些红色标记的点最终会被处理为边缘点,而其他点会被处理为非边缘点。经过该处理后,对于同一方向的若干个边缘点,基本上仅保留了一个,实现了边缘细化的目的。

4、应用双阈值确定边缘
(1)完成上述步骤后 ,图像内部的强化边缘已经在当前获取的边缘内,但是一些虚边缘可能也在图像内,这些虚边缘可能是真实图像产生的,也可能是由噪声生成的,我们需要进一步筛选。
(2)设置两个阈值,其中一个为高阈值maxVal,另一个为低阈值minVal,根据当前边缘像素的梯度值与这两个阈值之间的关系,判断边缘的属性

如果当前边缘像素的梯度值大于或等于maxVal,则将当前边缘像素标记为强边缘(处理为边缘)
如果当前边缘像素的梯度值小于或等于minVal,则抑制当前边缘像素
如果当前边缘像素的梯度值介于maxVal与minVal之间,则将当前边缘像素标记为虚边缘,需要进一步判断。通常来说,与强边缘连接,则将该边缘处理为边缘,否则将其抑制。

5、canny函数及应用

dst=cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)
image:8为输入图像
threshold1:阈值minVal
threshold2:阈值maxVal
apertureSize:表示sobel算子的孔径大小
L2gradient:计算图像梯度幅度的标识,默认为False(两个方向倒数的绝对值相加),如果为True,则使用更加精准的L2范数进行计算(两个方向倒数的平方和再开方)。

import cv2

img = cv2.resize(cv2.imread("img/1.jpg"), (300, 300))

dst=cv2.Canny(img, 10, 50)
dst_1=cv2.Canny(img,50,150)
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.imshow("dst_1",dst_1)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
对比上图dst与dst_1可知,当threshold1与threshold2较小时,能够捕获更多的边缘信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值