首页 > 编程语言 >OpenCV(Canny 边缘检测算法)

OpenCV(Canny 边缘检测算法)

时间:2024-09-23 11:45:25浏览次数:8  
标签:边缘 梯度 像素 OpenCV 算法 检测 Canny 90

目录



Canny 边缘检测算法是一种经典的图像处理技术,用于检测图像中的边缘。它由 John F. Canny 于 1986 年提出。Canny 算法的目的是通过检测图像中强度变化最大的部分来识别边缘。算法主要分为以下几个步骤:



1. 高斯滤波(Gaussian Blur)

为了减少图像噪声对边缘检测的影响,首先对图像进行高斯滤波。这个步骤的目的是平滑图像,使得边缘检测对噪声的敏感度降低。

  • 高斯滤波器:使用一个高斯核(滤波器)来平滑图像。高斯核的大小和标准差参数(σ)决定了平滑的程度。


2. 计算梯度强度和方向(Gradient Calculation)

在平滑后的图像上计算每个像素的梯度强度和方向。梯度的强度反映了像素值的变化率,梯度的方向指示了变化的方向。

  • 梯度计算:通常使用 Sobel 算子来计算图像的梯度。Sobel 算子分别在水平和垂直方向上进行卷积,得到水平梯度(Gx)和垂直梯度(Gy),然后计算梯度强度和方向:
    • 梯度强度:\(G = \sqrt{G_x^2 + G_y^2}\)
    • 梯度方向:\(\theta = \arctan\left(\frac{G_y}{G_x}\right)\)

详细计算过程参考:OpenCV(cv::Sobel())



3. 非极大值抑制(Non-Maximum Suppression)

为了得到更精确的边缘线条,使用非极大值抑制步骤来抑制非边缘的像素。这个步骤的目的是去除梯度强度图中的噪声和不必要的边缘。

非极大值抑制:沿着梯度方向检查每个像素,如果它不是梯度方向上的局部最大值,则将其设为零。


3.1 示例

我们通过一个 \(7\times7\) 的梯度强度矩阵,举例说明Canny边缘检测算法中非极大值抑制的过程。

假设已经计算了每个像素的梯度强度,并且也知道每个像素的梯度方向。为了简单起见,我们假设梯度方向仅为0度(水平),45度,90度(垂直),135度四种方向。


1. 梯度强度矩阵(7x7)
[  2,  3,  1,  2,  1,  0,  1 ]
[  4,  6,  9,  5,  3,  2,  0 ]
[  1,  8, 15, 12,  6,  1,  1 ]
[  4, 12, 18, 18, 11,  5,  2 ]
[  2,  9, 16, 14,  8,  2,  1 ]
[  0,  5,  7,  6,  4,  1,  0 ]
[  1,  2,  3,  2,  1,  0,  1 ]

2. 每个像素的梯度方向(7x7)
  • :水平方向
  • 45°:对角方向
  • 90°:垂直方向
  • 135°:对角方向
[135°,  90°,  90°,  90°, 135°,  45°,  90°]
[ 45°,  90°,  90°,  90°,  45°, 135°,  90°]
[ 90°,  90°,  90°,  90°,  45°,  45°,  90°]
[ 45°,  90°,  90°,  90°,  45°, 135°,  90°]
[135°,  90°,  90°,  90°, 135°, 135°,  90°]
[ 90°,  90°,  90°,  90°,  45°,  45°,  90°]
[135°,  90°,  90°,  90°, 135°, 135°,  90°]

3. 非极大值抑制过程

对每个像素,根据它的梯度方向比较它沿着该方向的邻域像素,决定是否保留当前像素的梯度强度。

假设我们选择中心的像素(18),它位于梯度方向矩阵的[3, 3]位置,其梯度方向为90°(垂直)。因此我们需要比较它上下的两个邻居的梯度值:

  • 上面的邻居是位置 [2, 3],梯度强度为12
  • 下面的邻居是位置 [4, 3],梯度强度为14

非极大值抑制步骤:

  • 18 > 12(保留18)
  • 18 > 14(保留18)

因此,该像素的梯度值为18,被保留下来。

再看位置[3, 4]的像素(11),其梯度方向为45°。我们需要沿着45°方向检查它的两个邻域像素(也就是[2, 3][4, 5],值分别为12和2):

  • 11 < 12 (抑制,设为0)

因此,该像素的梯度值将被抑制为0。


4. 非极大值抑制后的矩阵(7x7)

处理每个像素后,最终的梯度强度矩阵会变成如下结果(仅保留局部极大值)

[  0,  0,  0,  0,  0,  0,  0 ]
[  0,  0,  9,  0,  0,  0,  0 ]
[  0,  0, 15, 12,  0,  0,  0 ]
[  0,  0, 18, 18,  0,  0,  0 ]
[  0,  0, 16, 14,  0,  0,  0 ]
[  0,  0,  0,  0,  0,  0,  0 ]
[  0,  0,  0,  0,  0,  0,  0 ]

通过非极大值抑制过程,我们只保留了梯度强度局部极大的像素,这样可以获得精确的边缘线条,而弱边缘和噪声则被抑制。



4. 双阈值处理(Double Thresholding)

通过设定两个阈值来确定边缘的强度,将像素分为强边缘、弱边缘和非边缘。

  • 强边缘:梯度强度大于高阈值的像素。
  • 弱边缘:梯度强度介于低阈值和高阈值之间的像素。
  • 非边缘:梯度强度小于低阈值的像素。


5. 边缘连接(Edge Tracking by Hysteresis)

通过连接强边缘和弱边缘,完成边缘的识别。弱边缘只有在与强边缘相连的情况下才被认为是有效的边缘。

  • 边缘连接:从强边缘像素开始,检查其周围的弱边缘像素,如果这些弱边缘像素与强边缘相连,则将其标记为边缘像素。


6. 优缺点

Canny 边缘检测算法是一种广泛使用的边缘检测方法,因其准确性和鲁棒性而受到青睐。

优点:

  1. 高精度边缘检测

    • Canny 算法能够准确地检测图像中的边缘,并能有效地定位边缘的具体位置。它在检测到的边缘上提供了清晰且连贯的边界。
  2. 噪声抑制

    • 通过高斯滤波来平滑图像,Canny 算法能够显著减少噪声对边缘检测结果的影响,从而提高边缘检测的准确性。
  3. 低假阳性

    • Canny 算法通过双阈值处理和边缘连接步骤,有效地减少了假阳性边缘(即检测到的边缘中实际上不存在的边缘)。
  4. 边缘连通性

    • 边缘连接步骤可以通过将弱边缘与强边缘连接起来,提供连续的边缘检测结果,使得检测到的边缘更加连贯。
  5. 方向信息

    • Canny 算法能够计算边缘的方向,这对于后续的图像处理任务(如特征提取和形状分析)非常有用。

缺点:

  1. 计算复杂度高

    • Canny 算法涉及多个步骤(如高斯滤波、梯度计算、非极大值抑制、双阈值处理和边缘连接),这些步骤的计算复杂度较高,可能导致处理速度较慢,尤其是在大图像或实时应用中。
  2. 参数选择

    • Canny 算法对高斯滤波器的标准差(σ)和双阈值(低阈值和高阈值)非常敏感。选择不当的参数可能会影响检测结果,导致边缘检测不准确。
  3. 边缘断裂

    • 在某些情况下,特别是在边缘强度较弱或图像质量较差的情况下,Canny 算法可能会导致边缘断裂或漏检。
  4. 对细节的处理有限

    • 对于细小或不明显的边缘,Canny 算法可能无法完全检测到,尤其是在低对比度或高噪声的图像中。
  5. 计算资源消耗

    • 由于其复杂的处理流程,Canny 算法可能需要较多的计算资源,尤其是在需要实时处理或处理高分辨率图像时。

总结:

Canny 边缘检测算法具有高精度、噪声抑制和边缘连通性等优点,适用于需要高质量边缘检测的任务。然而,其计算复杂度、参数选择敏感性和对细节处理的限制也是需要考虑的因素。在实际应用中,可能需要根据具体情况调整参数和优化算法,以达到最佳的边缘检测效果。



标签:边缘,梯度,像素,OpenCV,算法,检测,Canny,90
From: https://www.cnblogs.com/keye/p/18426808

相关文章

  • 时间序列无监督异常点检测算法_孤立森林,局部离群因子检测和自编码器
    数据入口:压气机异常检测一维时间序列-Heywhale.com该数据为采样自工业压气机的一维时间序列数据。本文将通过无监督时间序列算法进行时间序列异常检测。针对时间序列数据,常用的无监督异常检测算法包括:孤立森林(IsolationForest)、基于密度的局部离群因子检测(LOF)、自编码器(Au......
  • OpenCV(图像锐化)
    目录1.图像锐化2.原理3.示例1.图像锐化图像锐化是一种图像增强技术,旨在通过增强图像的边缘信息,使图像看起来更加清晰和具有细节。图像锐化的核心思想是突出图像中的高频分量,这通常与图像中的边缘和快速变化的区域相关。2.原理图像锐化的基本原理是通过增强图像中像素......
  • 【面试经验】大疆2024届秋招控制算法岗笔试
    建议之后想进大疆控制方向的学弟学妹们,准备好以下几点,笔试挂掉的血泪教训:1、经典控制理论和现代控制理论经典控制里面的拉式变换、传递函数建立、稳定性裕量、稳定性判据、系统校正和零极点配置,要熟练掌握;现代控制理论里面根据动态系统列状态空间方程,观测器估计器收敛性分......
  • DFP算法-MATLAB
    背景DFP算法是在20世纪60年代初期由Davidon、Fletcher和Powell共同开发的,是拟牛顿法(Quasi-NewtonMethods)的一种重要实现。拟牛顿法的基本思想是利用目标函数在当前点附近的二次近似来构造搜索方向,并通过迭代更新这一近似来逼近真实的解。DFP算法通过不断更新Hessian矩阵的逆......
  • DeepCross模型实现推荐算法
    1.项目简介A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发展,利用用户行为数据和内容特征,来生......
  • [OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码
    文章目录前言1.直方图均衡化的理论基础(1)什么是直方图(2)直方图均衡化原理(3)直方图均衡化公式2.直方图比较理论基础(1)相关性(Correlation)——HISTCMP_CORREL(2)卡方(Chi-Square)——HISTCMP_CHISQR(3)十字交叉性(Intersection)——HISTCMP_INTERSECT(4)巴氏距离......
  • OpenCV(图像对比度)
    目录1.图像对比度2.对比度调整的原理3.示例4.调整对比度的效果1.图像对比度图像对比度是指图像中亮部和暗部之间的差异程度。对比度越高,亮区更亮,暗区更暗;对比度低时,亮区和暗区的差异不明显,图像显得平淡。2.对比度调整的原理图像对比度可以通过线性变换实现,公式如下:......
  • OpenCV(图像明度)
    目录1.图像明度(Brightness)2.明度调整的原理3.示例1.图像明度(Brightness)明度(Brightness)是图像中反映光亮程度的一个属性,通常用于描述像素的亮度水平。对于RGB图像,明度(Luminance)每个像素中红、绿、蓝通道的加权和。\[\text{Luminance}=0.299\timesR+0.587\timesG......
  • 智谱AI算法工程师带你上手实践CogVideoX 视频生成开源模型
    关注公众号:青稞AI,第一时间学习最新AI技术......
  • 408算法题leetcode--第11天
    3.无重复字符的最长子串3.无重复字符的最长子串思路:滑动窗口时间:O(n);空间:O(字符种类数)classSolution{public:intlengthOfLongestSubstring(strings){//滑动窗口:如果没有出现相同的字符,那么右指针一直向右intret=0,size=s.size();......