【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_yMat 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
【OpenCV】边缘检测:Sobel、拉普拉斯算子相关推荐
- 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- python+OpenCv笔记(十三):边缘检测——Sobel检测算子
Sobel检测算子 概述: Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子 ...
- OpenCV边缘检测(Sobel,Scharr,Laplace,Canny)
对于图像的处理,基本的步骤是这样的: 取得图像数据 -- 将图像进行平滑处理 -- 进行边缘检测,阈值分析 -- 进行形态学的操作 -- 获取某些特征点 -- 分析数据 那么在这里,我就讲解下边缘检测 ...
- opencv:边缘检测之Laplacian算子思想及实现
Laplacian算子边缘检测的来源 在边缘部分求取一阶导数,你会看到极值的出现: 如果在边缘部分求二阶导数会出现什么情况? 从上例中我们可以推论检测边缘可以通过定位梯度值大于邻域的相素的方法找到(或 ...
- OpenCV学习-P34-P38 Opencv边缘检测
OpenCV学习-P34-P37 Opencv边缘检测 Sobel检测算子 Laplacian检测算子 Canny边缘检测算法 边缘检测总结 边缘检测分为两类:基于搜索和基于零穿越 基于搜索:寻找图像 ...
- OpenCV图像处理 空间域图像增强(图像锐化 1 基于拉普拉斯算子)
http://ggicci.blog.163.com/blog/static/210364096201262123236955/ OpenCV OpenCV 图像锐化 拉普拉斯算子 ( Laplaci ...
- 拉普拉斯噪声公式_高斯拉普拉斯算子(Laplace of Gaussian)
高斯拉普拉斯(Laplace of Gaussian) Laplace算子作为一种优秀的边缘检测算子,在边缘检测中得到了广泛的应用.该方法通过对图像 求图像的二阶倒数的零交叉点来实现边缘的检测,公式表 ...
- 二阶微分算子-拉普拉斯算子
在前面博客结尾,我们简要谈了一下二阶微分算子:对于图像: 从上面可以看出 一阶微分算子,就是求图像灰度变化曲线的导数,能够突出图像中的对象边缘:二阶微分算子,求图像灰度变化导数的导数,对图像中灰度变化 ...
- 拉普拉斯算子属于卷积方法吗_2020 年 GNN 开卷有益与再谈图卷积
题记 2019 年,GNN 从来没有这样繁荣过.一方面,计算机视觉.自然语言处理等领域都忽如一夜春风来,反复"发现"了自身潜在的 Graph 结构,与 GNN 融合.另一方面,GN ...
最新文章
- [盘点]从《行者无疆》开始了解欧洲
- 《漫画算法2》源码整理-3 二分查找 跳跃表
- 装linux时可用空间只有1929k,求Linux命令习题
- java basic类似的地方_java – Shiro使用HTTP Basic Auth或匿名访问相同的URI
- 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const
- 我感觉这个书上的微信小程序登陆写得不好
- Java代码风格:最终决定
- PHP获取字符串的所有子集,PHP Regexp(PCRE)-查找所有子字符串的集合
- Python学习之==数组(二)
- HTML5安全风险详析之三:WebSQL攻击
- 生成一定数量的不重复随机数
- android 下拉刷新listview,实现Android下拉刷新的ListView
- [转]C#:手把手教你用C#打包应用程序(安装程序卸载程序)
- Linux下vi命令小结
- yacc 简易计算机规则,Lex Yacc 学习笔记(2)- 简单计算器
- SM3算法的C++实现(代码)
- Android SVG矢量图形打造中国地图
- AcWing 1123. 铲雪车 题解(欧拉回路)
- html中的定位及其定位方式
- 自动驾驶测试中的场景构建