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 滤波器 一阶导数用于边缘检测的更多相关文章

  1. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  2. [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  3. 学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

    本篇文章中,我们将一起学习OpenCV中边缘检测的各种算子和滤波器——Canny算子,Sobel算子,Laplace算子以及Scharr滤波器.文章中包含了五个浅墨为大家准备的详细注释的博文配套源代码 ...

  4. Sobel算子 Scharr算子 Laplacian算子

    图像梯度处理 Sobel算子 水平方向: 对于线条A和线条B,右侧像素值与左侧像素值的差值不为零,因此是边界 上下像素值差值为0,左右素值的差值不为零,分布为正负, 离的近的为2,离的远的为1 P5= ...

  5. OpenCV——Sobel和拉普拉斯变换

    Sobel变换和拉普拉斯变换都是高通滤波器. 什么是高通滤波器呢?就是保留图像的高频分量(变化剧烈的部分),抑制图像的低频分量(变化缓慢的部分).而图像变化剧烈的部分,往往反应的就是图像的边沿信息了. ...

  6. 14、OpenCV实现图像的空间滤波——图像锐化及边缘检测

    1.图像锐化理论基础 1.锐化的概念 图像锐化的目的是使模糊的图像变得清晰起来,主要用于增强图像的灰度跳变部分,这一点与图像平滑对灰度跳变的抑制正好相反.而且从算子可以看出来,平滑是基于对图像领域的加 ...

  7. opencv学习之路(17)、边缘检测

    一.概述 二.canny边缘检测 #include "opencv2/opencv.hpp" using namespace cv; void main() { //Canny边缘 ...

  8. OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  9. opencv::Sobel算子

    卷积应用-图像边缘提取 卷积应用-图像边缘提取 边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一, 在图像特征提取.对象检测.模式识别等方面都有重要的作用. 如何捕捉/提取边缘 – 对图像 ...

随机推荐

  1. SpringCloud与微服务Ⅱ --- 微服务概述

    一.什么是微服务 1) Martin Fowler论文对微服务的阐述(中文版) 2) 对单一应用进行拆分 3) 每一个独立的应用都有一个独立的进程 4) 拥有自己独立的数据库 5) 微服务化的核心就是 ...

  2. IDEA | Dot Executable: null..No dot executable found

    背景 今天想在IDEA上打开.puml后缀的类图,发现IDEA并不能识别,但是正常的时序图却能正常打开,打开类图就报如下错误: 解决方案 经排查,idea的plantuml插件默认只支持时序图,类图还 ...

  3. 基于 Istio 与 Kubernetes 对应用进行灰度发布与 Tracing

    灰度发布,是指在黑与白之间,能够平滑过渡的一种发布方式.通俗来说,即让产品的迭代能够按照不同的灰度策略对新版本进行线上环境的测试,灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以对新版本进行测试 ...

  4. 利用AppMetrics对Web进行监控教程

    利用AppMetrics对Web进行监控教程 一.基础准备 1. 安装依赖 这里可以通过nuget或使用命令行进行安装,具体需要安装的类库如下(注意版本): Install-Package App.M ...

  5. LoadRunner参数传递给参数

    需求:使用随机函数时,需要参数化某个参数,并且后面的步骤需要使用这个参数. 方法: lr_save_string 该函数主要是将程序中的常量或变量保存为lr中的参数 lr_eval_string 从参 ...

  6. DLL/EXE查看工具Dumpbin

    一般情况下,我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息,可以使用VS自带的工具dumpbin: 可以直接在命令行下输入dumpbin就可以查看他的使用说明,如果未显示,可以先 ...

  7. python学习记录(三)

    0827--https://www.cnblogs.com/fnng/archive/2013/02/24/2924283.html 通用序列操作 索引 序列中的所有元素都是有编号的--从0开始递增. ...

  8. 推荐一个很棒的开源工作流elsa-core

    开源项目orchard主要开发人员Sipke Schoorstra 开源了一个netcore 工作流项目,地址:https://github.com/elsa-workflows/elsa-core, ...

  9. 第3章 JDK并发包(二)

    3.1.2 重入锁的好搭档:Condition条件 它和wait()和notify()方法的作用是大致相同的.但是wait()和notify()方法是和synchronized关键字合作使用的,而Co ...

  10. Go语言实现:【剑指offer】数字在排序数组中出现的次数

    该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...