【OpenCV】边缘检测:Sobel、拉普拉斯算子
推荐博文,博客。写得很好,给个赞。
Reference Link : http://blog.csdn.net/xiaowei_cqu/article/details/7829481
一阶导数法:梯度算子
对于左图,左侧的边是正的(由暗到亮),右侧的边是负的(由亮到暗)。对于右图,结论相反。常数部分为零。用来检测边是否存在。

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

计算这个向量的大小为:


梯度的方向角为:

Sobel算子
sobel算子的表示:

梯度幅值:

用卷积模板来实现:

【相关代码】
- CV_EXPORTS_W Sobel( InputArray src, OutputArray dst, ddepth,
- ksize=3,
- double scale=1, double delta=0,
- borderType=BORDER_DEFAULT );
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 );
/////////////////////////// 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 Laplacian( InputArray src, OutputArray dst, ddepth,
- ksize=1, double scale=1, double delta=0,
- borderType=BORDER_DEFAULT );
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;
- scale = 1;
- delta = 0;
- ddepth = CV_16S;
- kernel_size = 3;
- Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
- convertScaleAbs( dst, abs_dst );
- namedWindow( window_name2, CV_WINDOW_AUTOSIZE );
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 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- Opencv Laplacian(拉普拉斯算子)
#include <iostream>#include <opencv2/opencv.hpp>#include <math.h> using namespace ...
- 学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器
本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码 ...
- opencv边缘检测-拉普拉斯算子
sobel算子一文说了,索贝尔算子是模拟一阶求导,导数越大的地方说明变换越剧烈,越有可能是边缘. 那如果继续对f'(t)求导呢? 可以发现"边缘处"的二阶导数=0. 我们可以利用这 ...
- Opencv3 Robert算子 Sobel算子 拉普拉斯算子 自定义卷积核——实现渐进模糊
#include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...
- 边缘检测:Canny算子,Sobel算子,Laplace算子
1.canny算子 Canny边缘检测算子是John F.Canny于 1986 年开发出来的一个多级边缘检测算法.更为重要的是 Canny 创立了边缘检测计算理论(Computational the ...
- 边缘检测sobel算子
sobel算子 - sophia_hxw - 博客园http://www.cnblogs.com/sophia-hxw/p/6088035.html #1,个人理解 网上查了很多资料,都说sobel算 ...
- Opencv拉普拉斯算子做图像增强
Opencv拉普拉斯算子——图像增强 #include <iostream> #include <opencv2/opencv.hpp> using namespace std ...
- opencv边缘检测的入门剖析(第七天)
---边缘检测概念理解--- 边缘检测的理解可以结合前面的内核,说到内核在图像中的应用还真是多,到现在为止学的对图像的操作都是核的操作,下面还有更神奇的! 想把边缘检测出来,从图像像素的角度去想,那就 ...
随机推荐
- Android新旧版本Notification
Android新旧版本Notification 在notification.setLatestEventInfo() 过时了 以前: NotificationManager mn = (Notific ...
- C#(winform)为button添加背景图片
1.既然是添加背景图片 所以这里应该使用 Button.BackgroudImage = "" ;来设置图片 而不应该使用 Button.Image = "" ...
- Swift开发小技巧--TabBar中间按钮的添加方案
TabBar中间按钮的添加方案 之前做百思项目的时候,也有一个中间按钮,当时是重写的TabBar,这里介绍一个新的方法 给TabbarVC多添加添加一个控制器,这个控制器的作用仅仅是用来占位的,多了这 ...
- CentOS6.5下搭建NFS文件服务器
本文参考这里 CentOS下搭建NFS服务器总结 环境介绍: 1. 服务器: 192.168.0.100 2. 客户机: 192.168.0.101 安装软件包: 服务器和客户机都要安装nfs 和 r ...
- 常用免费的WebService列表
天气预报Web服务,数据来源于中国气象局 Endpoint : http://www.webxml.com.cn/WebServices/WeatherWebService.asmx Disc ...
- Sublime Text 3配置C++编译运行
2016.9.8更新: linux(Ubuntu16.04)下的配置,编译后用终端运行,解决了不能输入的问题 { "encoding": "utf-8", &q ...
- js-JavaScript高级程序设计学习笔记7
第十一章 DOM扩展 1.对DOM的两个主要的扩展是Selectors API(选择符API)和HTML5. 2.jQuery的核心就是通过CSS选择符查询DOM文档取得元素的引用,从而抛开了getE ...
- Android热身:通过网络获取资源并更新UI组件
Android热身:通过网络获取资源并更新UI组件 目标 点击"发送请求"按钮,下载某网页的html源码,并显示在TextView控件上:点击"清空",清除Te ...
- ini_set()函数的使用 以及 post_max_size,upload_max_filesize的修改方法
Apache服务器处理: ini_set('display_errors', 'Off');ini_set('memory_limit', -1); //-1 / 10240Mini_set(&quo ...
- Bzoj2683 简单题 [CDQ分治]
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1071 Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...