Canny边缘检测算法原理及其OpenCV实现

112 篇文章 7 订阅
79 篇文章 1 订阅

1、简介

Canny边缘检是Canny在1986年提出来的,目前仍是图像边缘检测算法中最经典、先进的算法之一。

2、Canny边缘检测算法主要步骤

2.1 图像平滑

  • 使用高斯滤波器,完成图像平滑,滤除噪声;

2.2 计算梯度及其方向

  • 利用soble算子、Prewitt算子、Roberts算子等计算图像中每个像素点的梯度强度和方向,其中soble算子又分为水平算子和竖直算子,用水平算子和竖直算子分别与原图像卷积,得到竖直和水平方向的梯度分量,如下所示:
    在这里插入图片描述
    然后采用以下方式计算总梯度:
    在这里插入图片描述
    有时为了简化计算,也采用以下方式:
    在这里插入图片描述

2.3 非极大值抑制

计算完 每个像素点的梯度强度和方向后,采用非极大值抑制的方法,保留局部梯度最大的点,以得到细化的边缘,消除边缘检测带来的杂散响应。
边缘方向和梯度方向是垂直的,且梯度方向或边缘方向绝大多数情况下并不是水平或竖直的。那么这就引出了非极大值抑制的两种方法:

2.3.1 插值法

如下图所示:
在这里插入图片描述
根据差值如上图所示方法,计算当前点前后位置处的差值梯度强度,如果当前点梯度大小小于前后位置处的差值梯度强度,则说明当前点不在边缘上,非边缘点。

2.3.2 简化方法

如下图所示: 在这里插入图片描述
实际上我们可以用上图所示方法进行简化,将当前点周围简化为八个方向(四个方向),看梯度方向与八个方向中的哪个最接近,就用哪个方向上的相邻两点梯度大小与当前点梯度大小进行比较。

2.4 双阈值检测

应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
在这里插入图片描述
如上图所示:

  • 选取系数TH和TL,比率为2:1或3:1。(一般取TH=0.3或0.2,TL=0.1);

  • 将小于低阈值的点抛弃,赋0;将大于高阈值的点立即标记(这些点为确定边缘点),赋1或255;

  • 将小于高阈值,大于低阈值的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋 1或255)

3、Opencv实例

img=cv2.imread("gauge.jpg",cv2.IMREAD_GRAYSCALE)

v1=cv2.Canny(img,120,250)   #120和250分别对应底阈值和高阈值
v2=cv2.Canny(img,50,100)    #不同的双阈值效果对比

res = np.hstack((v1,v2))
cv_show(res,'res')

输出:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值