`

【OpenCV】边缘检测:Sobel、拉普拉斯算子

 
阅读更多

边缘

边缘(edge)是指图像局部强度变化最显著的部分。主要存在于目标与目标、目标与背景、区域与区域(包括不同色彩)之间,是图像分割、纹理特征和形状特征等图像分析的重要基础。

图像强度的显著变化可分为:

  • 阶跃变化函数,即图像强度在不连续处的两边的像素灰度值有着显著的差异;
  • 线条(屋顶)变化函数,即图像强度突然从一个值变化到另一个值,保持一较小行程后又回到原来的值。

图像的边缘有方向和幅度两个属性,沿边缘方向像素变化平缓,垂直于边缘方向像素变化剧烈.边缘上的这种变化可以用微分算子检测出来,通常用一阶或二阶导数来检测边缘。

(a)(b)分别是阶跃函数和屋顶函数的二维图像;(c)(d)是阶跃和屋顶函数的函数图象;(e)(f)对应一阶倒数;(g)(h)是二阶倒数。

 

一阶导数法:梯度算子

对于左图,左侧的边是正的(由暗到亮),右侧的边是负的(由亮到暗)。对于右图,结论相反。常数部分为零。用来检测边是否存在。

梯度算子 Gradient operators

函数f(x,y)在(x,y)处的梯度为一个向量:

计算这个向量的大小为:

近似为:

梯度的方向角为:

 

Sobel算子

sobel算子的表示:

 

梯度幅值:

用卷积模板来实现:

【相关代码】

接口

CV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth,
                         int dx, int dy, int ksize=3,
                         double scale=1, double delta=0,
                         int borderType=BORDER_DEFAULT );

使用

  /////////////////////////// Sobe l////////////////////////////////////
  /// Generate grad_x and grad_y
  Mat grad_x, grad_y;
  Mat abs_grad_x, abs_grad_y;
  /// Gradient X
  //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
  //Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.
  Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );   
  convertScaleAbs( grad_x, abs_grad_x );
  /// Gradient Y  
  //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
  Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );   
  convertScaleAbs( grad_y, abs_grad_y );
  /// Total Gradient (approximate)
  addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );


二阶微分法:拉普拉斯

二阶微分在亮的一边是负的,在暗的一边是正的。常数部分为零。可以用来确定边的准确位置,以及像素在亮的一侧还是暗的一侧。

LapLace 拉普拉斯算子

二维函数f(x,y)的拉普拉斯是一个二阶的微分,定义为:

其中:

可以用多种方式将其表示为数字形式。对于一个3*3的区域,经验上被推荐最多的形式是:

定义数字形式的拉普拉斯要求系数之和必为0

 

【相关代码】

接口

CV_EXPORTS_W void Laplacian( InputArray src, OutputArray dst, int ddepth,
                             int ksize=1, double scale=1, double delta=0,
                             int borderType=BORDER_DEFAULT );

使用

Mat abs_dst,dst;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;
  int kernel_size = 3; 
  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( dst, abs_dst );
  namedWindow( window_name2, CV_WINDOW_AUTOSIZE );


实践效果

原图

注意,边缘检测对噪声比较敏感,需要先用高斯滤波器对图像进行平滑。参考博文:【OpenCV】邻域滤波:方框、高斯、中值、双边滤波

Sobel 边缘检测

Sobel算子可以直接计算Gx 、Gy可以检测到边的存在,以及从暗到亮,从亮到暗的变化。仅计算| Gx |,产生最强的响应是正交于x轴的边; | Gy |则是正交于y轴的边。

 

Laplace边缘检测

拉普拉斯对噪声敏感,会产生双边效果。不能检测出边的方向。通常不直接用于边的检测,只起辅助的角色,检测一个像素是在边的亮的一边还是暗的一边利用零跨越,确定边的位置。


转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7829481

实验代码下载:http://download.csdn.net/detail/xiaowei_cqu/4475976

 

分享到:
评论

相关推荐

    学习笔记python+opencv利用拉普拉斯算子锐化与sobel算子锐化(csdn)————程序.pdf

    本篇学习笔记主要探讨了如何使用Python结合OpenCV库,通过拉普拉斯算子和Sobel算子来实现图像的锐化处理。 首先,我们导入必要的库,包括OpenCV(cv2)和NumPy(np)。OpenCV是一个强大的图像处理库,提供了丰富的...

    Laplacian函数边缘检测_边缘检测;拉普拉斯算子_

    拉普拉斯算子(Laplacian Operator)是边缘检测中常用的一种数学工具,尤其适用于检测图像中的快速亮度变化,即边缘。在本主题中,我们将深入探讨拉普拉斯算子的理论基础,以及如何通过编程实现边缘检测。 拉普拉斯...

    OpenCV边缘检测算子

    接下来是Scharr算子,它是Sobel算子的一种改进,旨在解决拉普拉斯算子在边缘定位上的不精确问题。Scharr算子考虑了边缘的方向性,提供了更好的边缘定位和抗噪声能力。对于水平和垂直边缘,Scharr算子的3x3核分别为:...

    python通过robert、sobel、Laplace算子实现图像边缘提取详解

    图像边缘提取是计算机视觉和图像处理中的一个重要领域,它涉及从图像中检测边缘,以便进一步的分析和处理。边缘指的是图像中颜色或亮度发生剧烈变化的地方,边缘提取算法往往基于检测图像亮度的变化。常用的边缘提取...

    VC++图像锐化和边缘检测

    7. 高斯-拉普拉斯算子:这是一种组合了高斯平滑和拉普拉斯算子的边缘检测方法。先用高斯滤波器去除噪声,然后应用拉普拉斯算子检测边缘。这种方法在保持边缘清晰的同时,减少了噪声的影响。 在VC++中实现这些算法时...

    QT+opencv边缘检测,轮廓提取及轮廓跟踪

    在给定的项目中,采用了三种经典的边缘检测算子:Canny算子、Sobel算子和Laplacian算子。 1. **Canny算子**:由John F. Canny提出的,是一种自适应的多级边缘检测算法。它通过高斯滤波器减少噪声,然后应用非极大值...

    边缘检测各种算法编码.rar_eye detection_边缘检测_边缘检测 opencv_边缘检测算法

    - **Laplacian of Gaussian (LoG)**:高斯拉普拉斯算子是一种更复杂的边缘检测技术,它结合了高斯滤波器和拉普拉斯算子,可以去除噪声并检测边缘。 - **Harris角点检测**:虽然不是纯边缘检测算法,但Harris角点...

    \利用laplacian算子对图像进行锐化操作

    2. **改进的拉普拉斯算子**:使用更复杂的算子,如高斯-拉普拉斯算子(LoG),它可以更好地平衡边缘检测和噪声抑制。 3. **阈值处理**:设定一个阈值,只增强超过该阈值的边缘。 四、代码实现 在Python中,可以使用...

    亚像素级别的边缘检测和获取

    Laplacian算子则是使用拉普拉斯算子(图像的二阶导数)直接检测图像的突变,对于边缘定位也具有亚像素精度。 Harris角点检测是一种同时检测边缘和角点的方法,它计算图像局部区域的结构张量,通过响应矩阵的特征值...

    opencv边缘检测简单例子

    OpenCV是一个强大的开源计算机视觉库,提供了多种边缘检测算法,包括Sobel、Canny和Laplace算子。本教程将详细介绍如何使用OpenCV实现这三种边缘检测方法。 首先,让我们了解边缘检测的重要性。边缘检测可以帮助...

    各种边缘检测的比较 (2).docx

    - Roberts 算子:这种算子使用2x2的差分模板,通过计算相邻像素的差异来检测边缘。Roberts 算子简单,但对噪声敏感,对于斜向边缘的检测效果不佳。 - Prewitt 算子:Prewitt 算子利用3x3模板,计算水平和垂直方向...

    c#边缘检测算法源码

    3. 拉普拉斯算子:拉普拉斯算子是一种无方向的边缘检测算子,它是二阶偏微分方程的离散版本。在C#中,可以通过一个5x5或3x3的差分掩模实现,其核心是检测像素邻域内的亮度变化。拉普拉斯算子对噪声比较敏感,因此在...

    openCV实现图像处理

    - **拉普拉斯算子**:拉普拉斯算子是一种二阶微分算子,用于检测图像的边缘。它对图像中的边缘有较大的响应,因为边缘处像素的梯度较大。 - ** Sobel算子**:Sobel算子是一种一阶差分算子,可以计算图像在水平和...

    第十节 图像处理之边缘检测

    本文主要讨论了两种常用的边缘检测方法:Sobel算子和拉普拉斯算子,以及它们在OpenCV库中的实现。 首先,Sobel算子是一种一阶差分算子,用于近似计算图像灰度函数的梯度。Sobel算子通过对图像进行水平和垂直方向的...

    opencv之处理边缘实例下载

    - **Laplacian of Gaussian (LoG)**:LoG算子是高斯滤波器与拉普拉斯算子的组合,可以有效去除噪声并检测出细小的边缘。 - **Hough变换**:虽然不是直接的边缘检测,但Hough变换可以检测出直线,这对于识别图像中...

    opencv图像处理-opencv图像处理算法之边缘检测.zip

    在OpenCV中,常使用离散拉普拉斯算子进行边缘检测,结合适当的阈值可以找出边缘。 4. **Hough变换**:Hough变换是一种参数空间的边缘检测方法,它可以从原始图像空间转换到参数空间,寻找直线的参数形式。这种方法...

    边缘检测算子

    LOG算子在处理噪声和细节方面比单纯使用拉普拉斯算子更为稳健,但可能无法检测到某些弱边缘。 在VS或DEV-C++等集成开发环境中配置OpenCV库进行边缘检测,首先需要安装OpenCV库并将其添加到项目的包含目录中。接着,...

    图像处理边缘检测算法代码VC++实现

    Gauss-Laplace算子是高斯滤波器与拉普拉斯算子的结合,它首先使用高斯滤波器平滑图像以减少噪声,然后应用拉普拉斯算子检测边缘。拉普拉斯算子是一个二阶微分算子,通常用离散形式表示,如[0, -1, 0; -1, 4, -1; 0,...

    opencv边缘检测

    OpenCV提供了多种边缘检测算法,如Canny边缘检测、Sobel算子、Laplacian算子、Prewitt算子等。其中,Canny算法是一种广泛使用的多级边缘检测算法,它结合了高斯滤波、梯度计算和双阈值检测,能够在减少假边缘的同时...

Global site tag (gtag.js) - Google Analytics