`
bcyy
  • 浏览: 1809512 次
文章分类
社区版块
存档分类
最新评论

【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算子锐化(csdn)————程序

    openCV实现图像处理

    openCV+VS2008实现图像滤波、锐化laplace算子、边缘提取sobel算子canny算子、kmeans颜色聚类、颜色空间量化

    基于OPENCV的完整图像处理程序

    基于opencv1.0 VC++6.0MFC写的完整的图像处理程序,功能齐全(图像基本操作:旋转、镜像、反色、图像二值化、图像分割、图像增强、灰度直方图均衡、线性变换、灰度拉伸)、边缘检测(prewitt算子、sobel算子、canny...

    opencv 拉普拉斯变换

    对图像进行拉普拉斯变换,边缘检测,现有Sobel算子计算二阶差分,再由内核做卷积

    opencv python图像梯度实例详解

    拉普拉斯算子: import cv2 as cv import numpy as np # 图像梯度(由x,y方向上的偏导数和偏移构成),有一阶导数(sobel算子)和二阶导数(Laplace算子) # 用于求解图像边缘,一阶的极大值,二阶的零点 # 一阶偏...

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

    注:当然我们也可以cv.filter2D命令来make一个拉普拉斯算子: kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]]) dst = cv.filter2D(image,cv.CV_32F,kernel) dst = cv.convertScaleAbs(dst) cv.imshow(...

    opencv之自定义线性滤波实例下载

    详细讲解了卷积概念,卷积如何工作,以及常见的Robert算子、Sobel算子和拉普拉斯算子,自定义卷积等。欢迎下载学习。

    OpenCV的图像模糊与否检测

    综合了几种检测方法,vs2013编译通过。Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。图像模糊与否的一种检测方法,该方法主要采用图像的拉普拉斯卷积操作。

    基于C++和Opencv图像处理函数的静态车道线检测项目源码+数据+报告.zip

    边缘提取你又可以拉普拉斯锐化,sobel算子,Robert算子,scharr算子,candy检测。 于是我干脆把这些实现一个遍,再慢慢选择好了。 于是自实现了以下算法: 1. 彩色图像转灰度 2. 图像翻转,获得负片 3. 线性...

    基于自实现opencv图像处理函数的静态车道线检测项目源码.zip

    边缘提取你又可以拉普拉斯锐化,sobel算子,Robert算子,scharr算子,candy检测。 于是我干脆把这些实现一个遍,再慢慢选择好了。 于是自实现了以下算法: 1. 彩色图像转灰度 2. 图像翻转,获得负片 3. 线性...

    数字图像处理.docx

    基于python环境以及opencv的前提下,对图像进行处理,涉及到统计灰度级像素点数、幂律变换、双线性插值放大缩小、直方图均衡化处理并显示、均值滤波、拉普拉斯算子和Sobel算子等处理操作。

    基于opencv的图像空域滤波处理

    一个图像滤波处理的演示程序 ,实现图像的几种空域模板方法...均值滤波 ,中值滤波 ,高斯滤波 ,sobel算子,laplace算子,滤波参数可调 程序界面基于MFC,VC6.0 滤波函数基于opencv1.0 ps,程序存在bug,懒得改了....

    学习OPENCV(中文版)

    学习opencv(中文版) 清华大学出版社 出版前言 译者序 写在前面的话 前言 第1章 概述 什么是OpenCV OpenCV的应用领域 什么是计算机视觉 OpenCV的起源 下载和安装OpenCV 通过SVN获取最新的OpenCV代码 更多OpenCV文档 ...

    学习opencv中文版

    尺寸调整 图像金字塔 阈值化 练习 第6章 图像变换 概述 卷积 梯度和Sobel导 数 拉普拉斯变换 Canny算子 霍夫变换 重映射 拉伸、收缩、扭曲和旋转 CartToPolar与PolarToCart LogPolar 离散傅里叶变换(DFT) 离散余弦...

    opencv的全部基础操作,一共109个实例全部都在anaconda3,python3.7,opencv4调试通过。

    code_033 | [拉普拉斯算子(二阶导数算子)](python/code_033/opencv_033.py) | ✔️ code_034 | [图像锐化](python/code_034/opencv_034.py) | ✔️ code_035 | [USM 锐化增强算法](python/code_035/opencv_035.py) |...

    opencv图像处理个人笔记整理|图像处理笔记-三查查.pdf

    图像处理上课笔记,入门基础知识点整合。例如图像腐蚀、开运算、闭运算,礼帽操作,图像融合,图像反转,sobel算子概念、拉普拉斯金字塔、边缘检测等诸多内容。

    【opencv学习笔记 19 图像的梯度】

    二阶导数 —拉普拉斯算子系数和为0 一阶导数 import cv2 as cv import numpy as np def sobel_demo(image): # grad_x = cv.Scharr(image, cv.CV_32F, 1, 0) grad_y = cv.Scharr(image, cv.CV_32F, 0, 1) # ...

    《Visual C++数字图像处理开发入门与编程实践》源码

    13.1.4 拉普拉斯算子 503 13.2 Hough变换 509 13.2.1 Hough变换的原理 509 13.2.2 编程实现 515 13.3 种子算法 520 13.3.1 算法介绍 520 13.3.2 编程实现 523 13.4 轮廓跟踪 526 13.4.1 区域表示方法 526 13.4.2 单...

    picture.cpp

    Android OpenCV 图片清晰度检测,两个方法blurDetect与VideoBlurDetect一个基于Sobel算子,一个是拉普拉斯算法

Global site tag (gtag.js) - Google Analytics