Sobel 导数
来源:互联网 发布:java开发用mac好吗 编辑:程序博客网 时间:2024/04/27 22:54
目标
本文档尝试解答如下问题:
- 如何使用OpenCV函数 Sobel 对图像求导。
- 如何使用OpenCV函数 Scharr 更准确地计算 核的导数。
原理
Note
以下内容来自于Bradski和Kaehler的大作: Learning OpenCV .
上面两节我们已经学习了卷积操作。一个最重要的卷积运算就是导数的计算(或者近似计算).
为什么对图像进行求导是重要的呢? 假设我们需要检测图像中的 边缘 ,如下图:
你可以看到在 边缘 ,相素值显著的 改变 了。表示这一 改变 的一个方法是使用 导数 。 梯度值的大变预示着图像中内容的显著变化。
用更加形象的图像来解释,假设我们有一张一维图形。下图中灰度值的”跃升”表示边缘的存在:
使用一阶微分求导我们可以更加清晰的看到边缘”跃升”的存在(这里显示为高峰值)
从上例中我们可以推论检测边缘可以通过定位梯度值大于邻域的相素的方法找到(或者推广到大于一个阀值).
更加详细的解释,请参考Bradski 和 Kaehler的 Learning OpenCV 。
Sobel算子
- Sobel 算子是一个离散微分算子 (discrete differentiation operator)。 它用来计算图像灰度函数的近似梯度。
- Sobel 算子结合了高斯平滑和微分求导。
计算
假设被作用图像为 :
在两个方向求导:
水平变化: 将 与一个奇数大小的内核 进行卷积。比如,当内核大小为3时, 的计算结果为:
垂直变化: 将:math:I 与一个奇数大小的内核 进行卷积。比如,当内核大小为3时, 的计算结果为:
在图像的每一点,结合以上两个结果求出近似 梯度:
有时也用下面更简单公式代替:
Note
当内核大小为 时, 以上Sobel内核可能产生比较明显的误差(毕竟,Sobel算子只是求取了导数的近似值)。 为解决这一问题,OpenCV提供了Scharr 函数,但该函数仅作用于大小为3的内核。该函数的运算与Sobel函数一样快,但结果却更加精确,其内核为:
关于( Scharr )的更多信息请参考OpenCV文档。在下面的示例代码中,你会发现在 Sobel 函数调用的上面有被注释掉的 Scharr 函数调用。 反注释Scharr调用 (当然也要相应的注释掉Sobel调用),看看该函数是如何工作的。
源码
- 本程序做什么?
- 使用 Sobel算子 产生的输出图像上,检测到的亮起的 边缘 相素散布在更暗的背景中。
- 下面是本教程的源码,你也可以从 here 下载
解释
首先申明变量:
装载原图像 src:
第一步对原图像使用 GaussianBlur 降噪 ( 内核大小 = 3 )
将降噪后的图像转换为灰度图:
第二步,在 x 和 y 方向分别”求导“。 为此,我们使用函数 Sobel :
该函数接受了以下参数:
- src_gray: 在本例中为输入图像,元素类型 CV_8U
- grad_x/grad_y: 输出图像.
- ddepth: 输出图像的深度,设定为 CV_16S 避免外溢。
- x_order: x 方向求导的阶数。
- y_order: y 方向求导的阶数。
- scale, delta 和 BORDER_DEFAULT: 使用默认值
注意为了在 x 方向求导我们使用: , . 采用同样方法在 y 方向求导。
将中间结果转换到 CV_8U:
将两个方向的梯度相加来求取近似 梯度 (注意这里没有准确的计算,但是对我们来讲已经足够了)。
最后,显示结果:
结果
这里是将Sobel算子作用于 lena.jpg 的结果:
- Sobel 导数
- sobel导数
- opencv sobel导数
- OpenCV学习Sobel 导数
- 梯度和Sobel导数
- 梯度和Sobel导数
- opencv——Sobel导数
- cvSobel() 梯度和Sobel导数
- 第6章 图像变换/Sobel导数
- 【opencv练习20 - Sobel算子 一阶导数】
- 图像变换 -梯度和Sobel导数(cvSobel)
- 第六章 - 图像变换 -梯度和Sobel导数(cvSobel)
- opencv c++函数 imgproc模块 8 Sobel 导数
- 差分近似图像导数算子之Sobel算子
- 第六章 - 图像变换 -梯度和Sobel导数(cvSobel)
- 差分近似图像导数算子之Sobel算子
- sobel
- 图像处理中的梯度、导数如何求?(Robert算子,Sobel算子,Prewitt算子,Laplace算子)
- CodeIgniter工作流程(三)
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第7题:六角填数(12')
- Memcached源码分析之内存池
- C# 关于事件
- junit4按顺序执行test方法
- Sobel 导数
- 理解WebKit和Chromium: JavaScript引擎简介
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第八题:蚂蚁感冒(10')(4.9更新)
- .NET日期格式化
- json ajax
- Git 常用命令详解(二)
- 解决android SDK manager更新慢的办法
- [2014Contest_1I]How Many Sets II
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12')