OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
::返回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 (索贝尔和夏尔滤波器检测边缘)相关推荐
- 有关opencv的学习(17)—形态学滤波器检测边缘和角点
一.图像特征类型可被分为以下三种: 边缘.角点.斑点 其中,角点是个很特殊的存在.他们在图像中可以轻易地定位,同时,他们在人造物体场景,比如门.窗.桌等出随处可见.因为 角点位于两条边缘的交点处,代表 ...
- opencv——Sobel算子与Scharr算子
目录 算子 边缘提取与梯度 边缘提取 Sobel算子 原理 API 代码展示 结果 优化代码 结果 Scharr算子 代码 结果 算子 狭义的算子实际上是指从一个函数空间到另一个函数空间(或它自身)的 ...
- OpenCV图像梯度(Sobel和Scharr)
OpenCV图像梯度(Sobel和Scharr) 1 图像梯度是什么? 2 图像梯度的用途 3 图像梯度的使用 参考 这篇博客将介绍图像渐变以及如何使用OpenCV的cv2.Sobel计算Sobel渐 ...
- OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例(附完整代码)
OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例 OpenCV使用Sobel或Scharr O ...
- OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器 1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此 ...
- OpenCV 图像梯度 Sobel、Scharr、Laplacian
概念: 梯度简单来说就是求导,在图像上表现出来的就是提取图像的边缘(不管是横向的.纵向的.斜方向的等等),所需要的无非也是一个核模板,模板的不同结果也不同.所以可以看到,所有的这些个算子函数,归结到底 ...
- OpenCV Sobel Derivatives衍生物
OpenCV Sobel Derivatives衍生物 Sobel Derivatives衍生物 目标 理论 索贝尔算子 代码 解释 声明变量 加载源图像 减少噪音 灰阶 索贝尔算子 将输出转换为CV ...
- opencv sobel导数
如何使用OpenCV函数 Sobel 对图像求导. 如何使用OpenCV函数 Scharr 更准确地计算 核的导数. 原理 Note 以下内容来自于Bradski和Kaehler的大作: Learn ...
- OpenCV Sobel 边缘检测
Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...
最新文章
- C语言函数指针 和 OC-Block
- 【计算机网络】应用层 : 万维网 和 HTTP 协议 ( 万维网概述 | HTTP 协议特点 | HTTP 协议连接方式 | HTTP 协议报文结构 | HTTP 请求报文 | HTTP 响应报文 )
- Oracle集合运算
- mysql运维管理-mysqldump 备份与恢复数据库20
- 北斗三号b1c频点带宽_重磅北斗星通新一代22nm北斗高精度定位芯片正式发布
- 解决 :sudo:/etc/sudoers 可被任何人写
- 如何把手变成手控_手把手教您如何在生产环境直接web级设计图形报表
- Linux下多功能编辑器,Linux下的编辑器——vi大全
- 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
- 借助阿里AntUI元素实现两个Web页面之间的过渡——“Loading…”
- 【web组件库系列】纯CSS实现典型网页数据分页器
- axios请求拦截器错误_React中使用高阶组件和axios的拦截器,统一处理请求失败提示...
- html怎么用pdf保存,html保存为PDF
- com.apple.Boot.plist 和SMBIOS.plist 的设置
- 怎样设置图片大小php,php调整图片大小的方法
- 《赋予角色移动时的动画》part02——动画蓝图
- vb中Msgbox函数的应用。
- Element-UI中打开本地文件
- 数博会金蝶揭秘智能零售:名企转型底气
- vscode中用快捷键 Alt + Shift + F 格式化代码不生效的问题
热门文章
- bat for 循环中定义变量(变量值不显示,通过使用「延期变量扩展」方式解决)
- Postgre中的 select for update 和 select for update nowait
- 数据库的时间格式(毫秒表示)
- java tlv协议_看懂通信协议:自定义通信协议设计之TLV编码应用
- Appium 解决微信公众号、小程序切换 webview 后无法定位元素的问题
- 关于我在安装2.6.9版本bochs虚拟机时遇到的问题以及解决过程
- 如何解决”ArcGIS Server Site is currently being configured by another administrative operation“的问题
- java网络爬虫,乱码问题终于完美解决
- POI操作Excel时Cannot get a text value from a numeric formula cell非法参数异常
- Maven 无法下载依赖包的解决方法---三步dao!!!