zoukankan      html  css  js  c++  java
  • Canny算子

    https://zhuanlan.zhihu.com/p/42122107

    Canny边缘检测算法

    提取图片的边缘信息是底层数字图像处理的基本任务之一。边缘信息对进一步提取高层语义信息有很大的影响。大部分边缘检测算法都是上个世纪的,OpenCV的使用的算法是Canny边缘检测算法,大概是1986年提出了,似乎说明边缘检测算法的研究已经到达了瓶颈期。跟人眼系统相比,边缘检测算法仍然逊色不少。

    Canny边缘检测算法是比较出色的算法,它包含以下四个步骤:

    1. 高斯滤波

    滤波的主要目的是降噪,一般的图像处理算法都需要先进行降噪。而高斯滤波主要使图像变得平滑(模糊),同时也有可能增大了边缘的宽度。

    高斯函数是一个类似与正态分布的中间大两边小的函数。

    对于一个位置(m,n)的像素点,其灰度值(这里只考虑二值图)为f(m,n)。

    那么经过高斯滤波后的灰度值将变为:

    [公式]

    简单说就是用一个高斯矩阵乘以每一个像素点及其邻域,取其带权重的平均值作为最后的灰度值。

    2. 计算梯度值和梯度方向

    边缘是什么?边缘就是灰度值变化较大的的像素点的集合。一道黑边一道白边中间就是边缘,它的灰度值变化是最大的,在图像中,用梯度来表示灰度值的变化程度和方向。

    它可以通过点乘一个sobel或其它算子得到不同方向的梯度值 [公式] , [公式] 。

    sobel算子:https://blog.csdn.net/qq_37124237/article/details/82183177

    综合梯度通过以下公式计算梯度值和梯度方向:

    [公式]

    [公式]

    3. 过滤非最大值

    在高斯滤波过程中,边缘有可能被放大了。这个步骤使用一个规则来过滤不是边缘的点,使边缘的宽度尽可能为1个像素点:如果一个像素点属于边缘,那么这个像素点在梯度方向上的梯度值是最大的。否则不是边缘,将灰度值设为0。

    4. 使用上下阀值来检测边缘

    一般情况下,使用一个阀值来检测边缘,但是这样做未免太武断了。如果能够使用启发式的方法确定一个上阀值和下阀值,位于下阀值之上的都可以作为边缘,这样就可能提高准确度。

    它的步骤是这样的。

    它设置两个阀值(threshold),分别为maxVal和minVal。其中大于maxVal的都被检测为边缘,而低于minval的都被检测为非边缘。对于中间的像素点,如果与确定为边缘的像素点邻接,则判定为边缘;否则为非边缘。

    参考链接:

    1.canny edge detector tutorial

    2.canny edge detection

    3.fundamental of computer vision(p45-p48)

    4.edge detection

  • 相关阅读:
    网络技术
    AWS责任共担模型
    AWS 创建新用户(IAM用户)
    AWS系列-申请Redis
    AWS系列-申请MySQL
    MDX之Case When用法
    SSAS中雪花模型
    SSAS中处理时经常出现的几种错误
    C#连接Oracle中文乱码问题解决方法
    BI中PowerDesigner建模
  • 原文地址:https://www.cnblogs.com/Manuel/p/14602101.html
Copyright © 2011-2022 走看看