opencv —— Sobel 一阶导数算子、Scharr 滤波器 一阶导数用于边缘检测
sobel 算子的基本概念
sobel 算子是一个主要用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用于计算图像灰度函数的近似梯度。
其基础来自于一个事实,即在边缘部分,像素值出现“跳跃”或者较大的变化。如果在此边缘部分求取一阶导数,会看到极值的出现。正如下图所示:

sobel 算子的计算过程
(1)分别在 x 和 y 两个方向求导
x 方向求导:将源图像与 Gx 进行卷积。对竖线敏感(导数大),横线不敏感(导数小)。
y 方向求导:将源图像与 Gy 进行卷积。对竖线不敏感(导数小),横线敏感(导数大)。

(2)对于图像的每一点,结合以上两个结果求出近似梯度

可以简化成:

Sobel 函数
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);
- src,输入图像,填 Mat 类型即可。
- dst,输出图像,需要和源图像有一样的尺寸和类型。
- ddepth,输出图像的深度,满足下列要求:
src.depth() = CV_8U, ddepth = -1 / CV_16S / CV_32F / CV_64F
src.depth() = CV_16U / CV_16S, ddepth = -1 / CV_32F / CV_64F
src.depth() = CV_32F, ddepth = -1 / CV_32F / CV_64F
src.depth() = CV_64F, ddepth = -1 / CV_64F
- dx,x 方向上导数的阶数,只能是 0、1、2。若求 x 方向上的一阶导数,dx = 1,dy = 0。
- dy,y 方向上导数的阶数,只能是 0、1、2。若求 y 方向上的一阶导数,dx = 0,dy = 1。
- ksize,默认值为 3,表示 sobel 核的大小,必须取 1、3、5、7。
- scale,计算导数值的缩放因子,默认值为 1,表示默认情况下不进行缩放。
- delta,输出梯度 = scale * G + delta。
- borderType,Gx 和 Gy 都有一定大小,边缘会处理不到,需要进行边缘扩展。这个参数指定边缘扩充类型。
一般情况下,都是使用 ksize×ksize 内核来计算导数的,然而,当 ksize = 1 时,会使用 3×1、1×3 的内核。这种情况下,并没有进行高斯平滑操作。
代码示例:
#include<opencv.hpp>
using namespace cv;
int main() {
Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg");
GaussianBlur(src, src, Size(, ), , );
imshow("src", src); Mat gray, x_img, y_img, sobel_img;
cvtColor(src, gray, COLOR_BGR2GRAY);
Sobel(gray, x_img, -, , , );
imshow("x_img", x_img);
Sobel(gray, y_img, -, , , );
imshow("y_img", y_img); addWeighted(x_img, , y_img, , , sobel_img);
//https://www.cnblogs.com/bjxqmy/p/11986135.html
imshow("sobel_img", sobel_img);
waitKey();
}
效果演示:

补充说明:当内核大小为 3×3 时,sobel 内核可能产生比较明显的误差,毕竟 sobel 算子只是求取了导数的近似值而已。为解决这一问题,OpenCV 提供了 Scharr 函数,但该函数仅作用于 3×3 的内核。该函数的运算与 Sobel 函数一样快,但结果更精确,其内核为

借鉴博客:https://www.cnblogs.com/wxl845235800/p/7700887.html
https://www.cnblogs.com/sevenyuan/p/7874344.html
opencv —— Sobel 一阶导数算子、Scharr 滤波器 一阶导数用于边缘检测的更多相关文章
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
- [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器
本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码 ...
- Sobel算子 Scharr算子 Laplacian算子
图像梯度处理 Sobel算子 水平方向: 对于线条A和线条B,右侧像素值与左侧像素值的差值不为零,因此是边界 上下像素值差值为0,左右素值的差值不为零,分布为正负, 离的近的为2,离的远的为1 P5= ...
- OpenCV——Sobel和拉普拉斯变换
Sobel变换和拉普拉斯变换都是高通滤波器. 什么是高通滤波器呢?就是保留图像的高频分量(变化剧烈的部分),抑制图像的低频分量(变化缓慢的部分).而图像变化剧烈的部分,往往反应的就是图像的边沿信息了. ...
- 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测
1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...
- opencv学习之路(17)、边缘检测
一.概述 二.canny边缘检测 #include "opencv2/opencv.hpp" using namespace cv; void main() { //Canny边缘 ...
- OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- opencv::Sobel算子
卷积应用-图像边缘提取 卷积应用-图像边缘提取 边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一, 在图像特征提取.对象检测.模式识别等方面都有重要的作用. 如何捕捉/提取边缘 – 对图像 ...
随机推荐
- Linux 6种日志查看方法,不会看日志会被鄙视的
作为一名后端程序员,和Linux打交道的地方很多,不会看Linux日志,非常容易受到来自同事和面试官的嘲讽,所以掌握一种或者几种查看日志的方法非常重要. Linux查看日志的命令有多种: tail.c ...
- Git 初级使用 windows & Ubuntu
目的:有一段代码要进行几个人同时维护,但是传来传去不方便,所以希望在github上实现,前提是每台机器都有git 在github 上新建一个项目 然后会看到,大体上就按这执行就可以 在Windows系 ...
- 【Nginx入门系列】第四章 通过域名匹配虚拟主机,不修改端口
域名访问原理 我们在显示生活中,我们怎样通过一个域名来访问到我们所需要的网站呢? 例如www.baidu.com,我们在浏览器输入百度网址会先发送请求到DNS服务器,DNS会通过我们的域名解析百度对应 ...
- 乌班图14更新软件提示错误:https://mirrors.aliyun.com kubernetes-xenial InRelease: 由于没有公钥,无法验证下列签名: NO_PUBKEY 6A030B21BA07F4FB
提示如下 获取: https://mirrors.aliyun.com kubernetes-xenial InRelease 忽略 https://mirrors.aliyun.com kubern ...
- 漏洞利用:验证绕过,XSS利用,Cookic盗用,文件上传
1. 文件上传 低级别 写好上传的内容 选择好上传的文件 上传成功. 测试:访问文件,执行代码 中级别 修改文件后缀为png 上传该文件 抓包修改文件后缀为php,然后允许数据包通过. 上传 ...
- TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?
引 言 这是一个系列文章,我们将在本系列中探索Rancher使用TLS证书的不同方式.TLS,安全传输层协议,是用于保护网络通信的加密协议.它是目前已经弃用的安全套接层(SSL)的继任者. 你可以从本 ...
- 死磕mysql(3)
花了一个晚上得出的结论,autocommit=1是不是立刻提交,autocommit=0是没有写入数据库的关闭数据,除非遇到commit和rollback........把自己给逗了关闭数据库发现数据 ...
- Spring注入bean的方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的se ...
- mod3 如何用硬件实现
今天接到Qualcom 的电话面试,表现很一般.Qualcom 不愧是一流的IC 设计公司,问得问题非常基础,但是非常深入! 其中问了一个如何实现模3 的问题.没有回答上来. 后来想了一下,其实非常简 ...
- HDU_4734_数位dp
http://acm.hdu.edu.cn/showproblem.php?pid=4734 模版题. #include<iostream> #include<cstdio> ...