在图像处理中,求解图像梯度是常用操作。

Sobel算子

Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator.

Sobel 算子是一种离散性差分算子,用来计算图像像素值的一阶、二阶、三阶或混合梯度。在图像的任何一点使用此算子,将会产生对应的灰度矢量或是其法矢量。

C++: void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=, double scale=, double delta=, int borderType=BORDER_DEFAULT )
C: void cvSobel(const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size= )

参数含义

src – 输入图像

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

当ddepth=-1时,输出与输入具有相同的数据类型。当输入是8比特图像时,输出结果将是截断的导数值(in the case of 8-bit input images it will result in truncated derivatives)。

xorder – x方向求导阶数

yorder – y方向求导阶数

ksize – 卷积核的大小,只能是1/3/5/7之一(it must be 1, 3, 5, or 7)。

scale – 缩放尺度因子,默认无缩放

delta – 存储之前加到上述结果上的偏移量。

borderType – 边界插值方法,详见附录A-1。

Scharr算子

Calculates the first x- or y- image derivative using Scharr operator.

该算子参数和 Sobel 算子一致,与 Sobel 区别在于,Scharr 仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确。

C++: void Scharr(InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale=, double delta=, int borderType=BORDER_DEFAULT )

参数含义

src – 输入图像

dst – 输出结果,与输入图像具有相同的尺寸和通道数

ddepth – 输出图像的数据类型,即矩阵中元素的一个通道的数据类型,这个值和 type 是相关的。例如 type 为 CV_16SC2,一个2通道的16位的有符号整数,depth是CV_16S

dx – dx=1 表示求 x 方向的一阶梯度,dx=0 表示不求 x 方向

dy – 与上类似,dy=1 表示求 y 方向的一阶梯度,dy=0 表示不求 y 方向

scale – 求导得到的值的缩放尺度因子,默认无缩放

delta – 在存储之前加到求导值上的数值,可以用于将0以下的值调整到0以上。delta=0 时表示梯度为0处结果保存为0;delta=m 时表示梯度为0处结果保存为m

borderType – 表示图像四周像素外插值方法,默认是 BORDER_DEFAULT,该参数解释见附录A-1。

附录A-1

borderType

决定在图像发生几何变换或者滤波操作(卷积)时边沿像素的处理方式

/*
Various border types, image boundaries are denoted with '|' * BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
*/
  • BORDER_CONSTANT 边沿像素用 i 扩展,需要设置borderValue 指定 ' i ' 值,const cv::Scalar& borderValue = cv::Scalar(0);
  • BORDER_REPLICATE,复制边界像素
  • BORDER_REFLECT,对边界对称扩展,包含对称轴处的元素
  • BORDER_REFLECT_101,以边界为对称轴对称扩展复制像素,不包含对称轴处的元素

cv::Mat 的属性

The class Mat represents an n-dimensional dense numerical single-channel or multi-channel array.
It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel
volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms
may be better stored in a SparseMat ).

Mat是用于表示一个多维的单通道或者多通道的稠密数组。能用来保存实数或复数的向量、矩阵,灰度或彩色图像,立体元素,点云,张量以及直方图(高维的直方图最好使用SparseMat保存)。总之Mat就是用来保存多维的矩阵的。

  • depth

depth属性表示矩阵中元素的一个通道的数据类型。可以根据矩阵的 type 属性来判断( S 代表 signed int,即有符号整形;U 代表 unsigned int,即无符号整形;F 代表 float,即单精度浮点型。):

对于 CV_8U/CV_8S 其 depth 为 1

对于 CV_16U/CV_16S 其 depth 为 2

对于 CV_32S/CV_32F 其 depth 为 4

对于 CV_64F 其depth 为 8

#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n)) #define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n)) #define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n)) #define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n)) #define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n)) #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n)) #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))

type definition


参考资料

[1] Image Filtering

[2] OpenCV2:Mat属性type,depth,step

[3] Sobel Derivatives

[4] opencv边缘检测sobel算子

[5] python opencv学习(六)图像梯度计算

OpenCV4系列之图像梯度和边缘检测的更多相关文章

  1. opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测

    opencv-学习笔记(6)图像梯度Sobel以及canny边缘检测 这章讲了 sobel算子 scharr算子 Laplacion拉普拉斯算子 图像深度问题 Canny检测 图像梯度 sobel算子 ...

  2. 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换

    一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ...

  3. Python+OpenCV图像处理(十二)—— 图像梯度

    简介:图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导. Sobel算子是普通一阶差分,是基于寻找梯度强度.拉普拉斯算子(二阶差分)是基于过零点检测.通过计算梯度,设置阀值, ...

  4. opencv学习笔记(六)---图像梯度

    图像梯度的算法有很多方法:sabel算子,scharr算子,laplacian算子,sanny边缘检测(下个随笔)... 这些算子的原理可参考:https://blog.csdn.net/poem_q ...

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

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

  6. OpenCV常用基本处理函数(6)图像梯度

    形态学转换 腐蚀 img = cv2.imread() kernel = np.ones((,),np.uint8) erosion = cv2.erode(img,kernel,iterations ...

  7. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  8. 『cs231n』作业3问题3选讲_通过代码理解图像梯度

    Saliency Maps 这部分想探究一下 CNN 内部的原理,参考论文 Deep Inside Convolutional Networks: Visualising Image Classifi ...

  9. OpenCV学习笔记(10)——图像梯度

    学习图像梯度,图像边界等 梯度简单来说就是求导. OpenCV提供了三种不同的梯度滤波器,或者说高通滤波器:Sobel,Scharr和Lapacian.Sobel,Scharr其实就是求一阶或二阶导. ...

随机推荐

  1. 全网最详细!Centos7.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台

    背景 日常工作中,经常会用到Jmeter去压测,毕竟LR还要钱(@¥&*...),而最常用的接口压力测试,我们都是通过聚合报告去查看压测结果的,然鹅聚合报告的真的是丑到家了,作为程序猿这当然不 ...

  2. QTP测试web时:打开ie浏览器进行录制但qtp录制脚本为空

    1. 关闭ie的保护模式:设置——internet选项——安全——取消勾选“启用保护模式” 这一步很关键,之前试过很多步骤,只有这个成功了. 修改后如果可行即可.如果不行再进行下面操作: 2.关闭杀毒 ...

  3. django cms 5月第一弹

    官方文档: ##http://django-cms.readthedocs.io/en/latest/index.html #截图 #生存的项目结构

  4. latex2e

    classs and packages 这一节介绍新的latex文档结构, 以及新的文件类型: classs and packages 类和包是什么? lext 2.09和latex2e的主要差别就在 ...

  5. openpyxl库实现对excel文档进行编辑(追加写入)

    首先,这个库只支持xlsx格式的excel文件 预期,对”excel_test.xlsx“的A1单元格写入”hello word“ 1.安装”openpyxl“库,pip install openpy ...

  6. Spring Boot定义系统启动任务的两种方式

    Spring Boot定义系统启动任务的两种方式 概述 如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web ...

  7. Shell常用命令之sort

    sort命令 sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出.sort命令既可以从特定的文件,也可以从stdin中获取输入. 语法 sort (选项) (参数) 选项 - ...

  8. apache 目录网站显示indexs

    Apache Options Indexes FollowSymLinks详解 第一种方法 <Directory "E:\myvirtualhost\localhost"&g ...

  9. java.net.UnknownHostException 异常处理(个人案例)

    案例 今天在公司开发中,遇到一个比较奇怪的异常 ,java.net.UnknownHostException 异常处理  ,一直没找到什么好的办法解决 解决方案 在公司的项目开发中,项目都是连了很多个 ...

  10. C语言系列之自增自减运算符的用法(二)

    运算符中最难理解的有自增自减运算符的使用方法,下面我将简单总结一下他们的使用方法 我们知道,C语言运行是由右向左运行的 下面我们来看一个例子 当i等于3的时候 j=++i; 由上面可知,C语言是由右向 ...