::返回OpenCV算子速查表

OpenCV Sobel和Scharr

  • 1. 函数定义
    • 1.1 声明
    • 1.2 重要参数解析
  • 2. 例程
    • 2.1 处理效果
      • 原图
      • 在x,y方向分别求导
      • 如果两个方向一起求导,结果会如何呢?
      • dx的值为1和2有什么区别呢?
      • 参数scale对结果的影响
      • 参数delta对结果的影响
      • SCHARR和Scharr
    • 2.2 代码

1. 函数定义

1.1 声明

 //索贝尔滤波器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);//夏尔滤波器void Scharr(InputArray src,OutputArray dst, int ddepth,int dx, int dy, double scale = 1,double delta = 0,int borderType = BORDER_DEFAULT);
  • 以下是《学习OpenCV3》中对Sobel的讲解:

    • Sobel算子有一个好处就是可以将核定义为各种大小,并且可以快速、迭代式地构造这些核。
    • 大的核可以更好的近似导数,因为可以消除噪声影响。不过。假如导数在空间上变化剧烈,核太大会使结果发生偏差。
    • Sobel不是真正的导数,因为它定义在离散空间上。它实际上是一个多项式,在x方向上进行二阶Sobel运算表示的并不是二阶导数,而是对抛物线函数的局部拟合。这也说明了为什么要使用一个更大的核,更大的核拟合了更多的像素。
    • Sobel算子的缺点是核比较小的时候准确度不高。对于大型的核,近似过程使用了较多的点,因此精度问题不太显著。对于3×3的Sobel滤波器,梯度角距离水平或垂直方向越远,误差越明显。
    • Scahrr可消除3×3这样小但是快的Sobel导数滤波器所带来的误差。Scharr同样很快,但是精度更高。

1.2 重要参数解析

  • Sobel函数支持就地调用。
  • dx: x方向的求导顺序,0表示不求导。
  • dy: y方向的求导顺序,0表示不求导。
  • ksize:Sobel滤波器的尺寸,正奇数,OpenCV给出的取值范围是 1, 3, 5, or 7,实际上最大可以支持到31。
  • 一般情况下,都是用ksize x ksize内核来计算导数的。然而,有一种特殊情况——当ksize为1时,往往会使用3 x 1或者1 x 3的内核。且这种情况下,并没有进行高斯平滑操作。
  • scale:用来计算导数的可选择的缩放比例因子,缺省值是不使用缩放。
  • delta:可选择的偏移值。
  • 缩放因子和偏移值都会在把结果存入dst之前调用,这有助于将求导结果可视化。
  • ksize有一个特殊的值“-1”,也就是FILTER_SCHARR,这意味着即将执行的是Scharr算法。使用的是 3×3 Scharr滤波器:
  • 因此 Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType)Sobel(src, dst, ddepth, dx, dy, FILTER_SCHARR, scale, delta, borderType) 是一样的,你完全可以只使用Sobel算子,想使用Scharr算子时设置一下ksize就好了。
  • OpenCV官方文档中关于 Sobel 的讲解
  • OpenCV官方文档中关于 Scharr 的讲解

2. 例程

2.1 处理效果

原图

在x,y方向分别求导

  • 可以看出在x方向求导检测的是纵向的边缘,而在y方向求导检测的是横向的边缘。

如果两个方向一起求导,结果会如何呢?

  • 结果并不好,边缘根本无法被检测出来。

dx的值为1和2有什么区别呢?

  • 不难看出当dx为2相对于1来说,轮廓线条更多更细了。

参数scale对结果的影响

  • 可以看出scale变大之后,边缘的亮度明显提升了

参数delta对结果的影响

  • delta影响了除边缘以外的背景色灰度值

SCHARR和Scharr

  • 这两者之间完全等同

2.2 代码

#include "stdafx.h"
#include <opencv.hpp>
using namespace cv;int main()
{Mat m_SrcImg = imread("./1.bmp", IMREAD_GRAYSCALE);imshow("原图", m_SrcImg);Mat m_DstImg;//这里需要注意的是:dx,dy的取值是0,1,2//0代表在这个方向不求导,Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 1, 0, 3);imshow("Sobel x", m_DstImg);Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 0, 1, 3);imshow("Sobel y", m_DstImg);//观察dx为1和2时的区别Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 2, 0, 3);imshow("Sobel x2", m_DstImg);//两个方向一起求导,边缘根本无法被检测出来Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 1, 1, 3);imshow("Sobel x1 y1", m_DstImg);Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 1, 2, 3);imshow("Sobel x1 y2", m_DstImg);//观察参数scale和delta对结果的影响Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 1, 0, 3, 1, 0);imshow("Sobel no scale no delta", m_DstImg);Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 1, 0, 3, 3, 0);imshow("Sobel scale", m_DstImg);Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 1, 0, 3, 1, 100);imshow("Sobel delta", m_DstImg);//SCHARR和Scharr等价Sobel(m_SrcImg, m_DstImg, m_SrcImg.depth(), 0, 1, -1);imshow("Sobel SCHARR", m_DstImg);Scharr(m_SrcImg, m_DstImg, m_SrcImg.depth(), 0, 1);imshow("Scharr", m_DstImg);waitKey(0);return 0;
}

OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)相关推荐

  1. 有关opencv的学习(17)—形态学滤波器检测边缘和角点

    一.图像特征类型可被分为以下三种: 边缘.角点.斑点 其中,角点是个很特殊的存在.他们在图像中可以轻易地定位,同时,他们在人造物体场景,比如门.窗.桌等出随处可见.因为 角点位于两条边缘的交点处,代表 ...

  2. opencv——Sobel算子与Scharr算子

    目录 算子 边缘提取与梯度 边缘提取 Sobel算子 原理 API 代码展示 结果 优化代码 结果 Scharr算子 代码 结果 算子 狭义的算子实际上是指从一个函数空间到另一个函数空间(或它自身)的 ...

  3. OpenCV图像梯度(Sobel和Scharr)

    OpenCV图像梯度(Sobel和Scharr) 1 图像梯度是什么? 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2.Sobel计算Sobel渐 ...

  4. OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例(附完整代码)

    OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr O ...

  5. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器

    OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...

  6. OpenCV 图像梯度 Sobel、Scharr、Laplacian

    概念: 梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(不管是横向的.纵向的.斜方向的等等),所需要的无非也是一个核模板,模板的不同结果也不同.所以可以看到,所有的这些个算子函数,归结到底 ...

  7. OpenCV Sobel Derivatives衍生物

    OpenCV Sobel Derivatives衍生物 Sobel Derivatives衍生物 目标 理论 索贝尔算子 代码 解释 声明变量 加载源图像 减少噪音 灰阶 索贝尔算子 将输出转换为CV ...

  8. opencv sobel导数

    如何使用OpenCV函数 Sobel 对图像求导. 如何使用OpenCV函数 Scharr 更准确地计算  核的导数. 原理 Note 以下内容来自于Bradski和Kaehler的大作: Learn ...

  9. OpenCV Sobel 边缘检测

    Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...

最新文章

  1. C语言函数指针 和 OC-Block
  2. 【计算机网络】应用层 : 万维网 和 HTTP 协议 ( 万维网概述 | HTTP 协议特点 | HTTP 协议连接方式 | HTTP 协议报文结构 | HTTP 请求报文 | HTTP 响应报文 )
  3. Oracle集合运算
  4. mysql运维管理-mysqldump 备份与恢复数据库20
  5. 北斗三号b1c频点带宽_重磅北斗星通新一代22nm北斗高精度定位芯片正式发布
  6. 解决 :sudo:/etc/sudoers 可被任何人写
  7. 如何把手变成手控_手把手教您如何在生产环境直接web级设计图形报表
  8. Linux下多功能编辑器,Linux下的编辑器——vi大全
  9. 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
  10. 借助阿里AntUI元素实现两个Web页面之间的过渡——“Loading…”
  11. 【web组件库系列】纯CSS实现典型网页数据分页器
  12. axios请求拦截器错误_React中使用高阶组件和axios的拦截器,统一处理请求失败提示...
  13. html怎么用pdf保存,html保存为PDF
  14. com.apple.Boot.plist 和SMBIOS.plist 的设置
  15. 怎样设置图片大小php,php调整图片大小的方法
  16. 《赋予角色移动时的动画》part02——动画蓝图
  17. vb中Msgbox函数的应用。
  18. Element-UI中打开本地文件
  19. 数博会金蝶揭秘智能零售:名企转型底气
  20. vscode中用快捷键 Alt + Shift + F 格式化代码不生效的问题

热门文章

  1. bat for 循环中定义变量(变量值不显示,通过使用「延期变量扩展」方式解决)
  2. Postgre中的 select for update 和 select for update nowait
  3. 数据库的时间格式(毫秒表示)
  4. java tlv协议_看懂通信协议:自定义通信协议设计之TLV编码应用
  5. Appium 解决微信公众号、小程序切换 webview 后无法定位元素的问题
  6. 关于我在安装2.6.9版本bochs虚拟机时遇到的问题以及解决过程
  7. 如何解决”ArcGIS Server Site is currently being configured by another administrative operation“的问题
  8. java网络爬虫,乱码问题终于完美解决
  9. POI操作Excel时Cannot get a text value from a numeric formula cell非法参数异常
  10. Maven 无法下载依赖包的解决方法---三步dao!!!