18 OpenCV之Canny边缘检测

本文介绍了Canny边缘检测算法,这是John Canny在1986年提出的最优边缘检测方法。首先通过高斯滤波器进行降噪,然后计算梯度幅度和方向。非极大值抑制步骤保留细线条作为候选边缘,最后使用滞后阈值确定最终边缘。Canny算法利用两个阈值来判断像素是否属于边缘,低阈值排除部分像素,高阈值保留边缘,而介于两者之间的像素仅在与高阈值像素相连时保留。文章还提供了一个示例来展示Canny边缘检测的应用。

一、Canny算子

Canny边缘检测算法是John F. Canny于1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的最优算法

  • 消除噪声:使用高斯平滑滤波器卷积降噪

  • 计算梯度幅值和方向
    在这里插入图片描述
    梯度方向近似得到四个可能角度之一(一般0,45,90,135)

  • 非极大值抑制:这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘)

  • 滞后阈值:最后一步,Canny使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值)

    • 如果某一像素位置的幅值超过高阈值,该像素被保留为边缘像素。
    • 如果某一像素的幅值小于低阈值,该像素被排除
    • 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留

    二、Canny

void cv::Canny  (   InputArray      image,
        OutputArray     edges,
        double      threshold1,
        double      threshold2,
        int     apertureSize = 3,
        bool    L2gradient = false 
    )   
  • Image: 输入图像
  • edges: 输出的边缘图像,8-bit单通道图像,与输入图像有相同的尺寸。
  • threshold1: 第一个滞后性阈值
  • threshold2: 第二个滞后性阈值
  • apertureSize: 表示应用的Sobel算子孔径大小,有默认值3
  • L2gradient: 一个计算图像梯度幅值的标识,有默认值false

对于threshold1和threshold2两个阈值来讲,两者较小的值用于边缘连接而较大的值用来寻找边缘的初始段。

三、示例

#include<opencv2/opencv.hpp>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值