Gradients and Sobel Derivatives 梯度和Sobel导数<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一个最重要并且最基本的卷积是导数的计算(或者是其近似值),有许多方法可以做到,但是只有少数适合于给定情况。
通常来说,用来表达微分的最常用的操作是sobel微分算子(见图6-3,6-4)。Sobel算子包含任意阶的微分以及混合偏导(例如<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="图片_x0020_5" style="VISIBILITY: visible; WIDTH: 74.25pt; HEIGHT: 27pt" alt="getfile?item=Zi8wNTNpYXM3NXJnY2dtdHBpMTkwOGU5L2Q2NjEvMS5naXAvMWdtN25z" type="#_x0000_t75" o:spid="_x0000_i1025"><imagedata o:title="getfile?item=Zi8wNTNpYXM3NXJnY2dtdHBpMTkwOGU5L2Q2NjEvMS5naXAvMWdtN25z" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/02/clip_image001.png"></imagedata><textbox style="mso-rotate-with-shape: t"></textbox></shape>)。
图6-3 逼近x-方向上一阶微分的sobel算子效果
<shape id="图片_x0020_6" style="VISIBILITY: visible; WIDTH: 183.75pt; HEIGHT: 138.75pt" alt="getfile?item=Zi8wNTNpYXM3NXJnY2dtdHBpMTkwOGU5L2Q2NjEvMS5naXAvM2dtN25z" type="#_x0000_t75" o:spid="_x0000_i1026"><imagedata o:title="getfile?item=Zi8wNTNpYXM3NXJnY2dtdHBpMTkwOGU5L2Q2NjEvMS5naXAvM2dtN25z" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/02/clip_image003.png"></imagedata><textbox style="mso-rotate-with-shape: t"></textbox></shape>
cvSobel(
const CvArr* src,
CvArr* dst,
int xorder,
int yorder,
int aperture_size = 3
);
这里,src和dst分别是输入图像和输出图像,xorder和yorder是求导的阶数。通常只可能用到0,1最多2。值为0表明在这个方向上没有求导[65],aperture_size参数是方形滤波器的宽(或高)并且应该是奇数。目前,aperture_size支持1,3,5,7。如果原图像src是8位的,为避免溢出,目标图像的深度必须是IPL_DEPTH_16S。无论是xorder还是yorder都必须非零。
图6-3 逼近y-方向上一阶微分的sobel算子效果
<shape id="图片_x0020_7" style="VISIBILITY: visible; WIDTH: 173.25pt; HEIGHT: 131.25pt" alt="getfile?item=Zi8wNTNpYXM3NXJnY2dtdHBpMTkwOGU5L2Q2NjEvMS5naXAvNWdtN25z" type="#_x0000_t75" o:spid="_x0000_i1027"><imagedata o:title="getfile?item=Zi8wNTNpYXM3NXJnY2dtdHBpMTkwOGU5L2Q2NjEvMS5naXAvNWdtN25z" src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msoclip1/02/clip_image005.png"></imagedata><textbox style="mso-rotate-with-shape: t"></textbox></shape>
Sobel导数有一个非常好的属性,即可以定义任意大小的核,并且这些核可以快速且迭代方式构造。因为小核对噪声更敏感,所以大核对导数有更好的逼近。
为了更好的理解以上内容,我们必须认识到,Sobel导数并不是真正的导数,这是因为Sobel算子是定义在一个离散空间。Sobel算子真正表示的是多项式拟合,也就是说,x方向上的二阶Sobel导数并不是真正的二阶导数。它是对抛物线函数的局部拟合。这说明人们为什么想用较大的内核,因为较大内核是在更多像素上计算这种拟合。
事实上,在离散网格的场合下有很多方法可以近似地计算出导数。这种使用于Sobel算子近似计算导数的缺点是使用小核的精度比较差。对于大核,由于使用了更多的点用于估计,这个问题并不严重。这种不精确性并不会直接在cvSobel()中使用的X和Y滤波器中表现出来,因为它们完全按x和y轴排列。当试图计算图像的方向导数的估计量时,难度就出现了。(如,使用y/x滤波器响应的反正切得到的图像梯度的方向 。)
为了承上启下,这里有一个这类图像度量的具体例子。这个例子是在从一个物体收集形状信息的过程里,而这个过程是通过累积目标周围梯度角度的直方图来实现的。 这样的直方图是许多被训练和操作的形状分类器的基础。在这种情况下,对梯度角度不准确的度量将会将低分类器识别的性能。
对于一个3×3的Sobel滤波器,进一步来说当梯度角度是水平或者垂直时,这样的不准确就更加明显。OPENCV通过在cvSobel()函数中一些特殊aperture_size值CV_SCHARR的隐性使用,可以解决小(但是快)的3×3 Sobel导数滤波器不准确的问题。Scharr滤波器同sobel滤波器一样快,但是准确率更高,所以当你利用3×3滤波器实现图像度量的时候应该使用Scharr滤波器。Scharr滤波器的滤波系数如图6-5所示[Scharr00]。
分享到:
相关推荐
用于学习OpenCV的一本很好的教材,清晰的英文原版,看了就舒服,分享ing.
OpenCv —— 人脸识别(附完整源码)。具体查看csdn文章: ...
opencv边缘检测 C++ sobel prewitt Robert opencv边缘检测 C++ sobel prewitt Robert 两种实现,凑合着看吧 更正,for循环内,x y对调一下,for内部
OpenCv —— 检测高速车流。具体查看csdn博文:https://blog.csdn.net/automoblie0/article/details/125440284?spm=1001.2014.3001.5502
( Learning OpenCV 3 计算机视觉使用C++英文第三版高清.pdf
Learning opencv 源代码,Learning opencv 源代码,Learning opencv 源代码
《Learning OpenCV 3》是2018年出版的英文版...总之,《Learning OpenCV 3》是全面学习和掌握OpenCV 3的宝贵资源,无论你是想要入门计算机视觉,还是在现有项目中深化OpenCV的应用,这本书都将是你不可或缺的参考工具。
1、Learning OpenCV 3 Application 英文原版【带目录,无水印】 2、Build, create, and deploy your own computer vision applications with the power of OpenCV 3、本资源转载自网络,如有侵权,请联系上传者或...
Learning OpenCV 3: Computer Vision in C++ with the OpenCV Library 是一本由浅入深介绍Opencv3 计算机视觉库使用的专业书籍。书中详细介绍了opencv3安装及各个模块的使用,此书在旧版基本上做了大量修改,以适应...
在本篇文章中,我们将深入探讨如何使用C++与OpenCV3中的Sobel算子进行边缘检测,特别是通过分析一个具体的示例代码来了解`sobel`函数的使用方法。此外,我们还会详细介绍Sobel算子的基本原理、参数设置以及在图像...
opencv_source_code chm格式 很好用
在本文中,我们将深入探讨如何在64位环境下利用Visual Studio 2017与OpenCV 3.4.1及它的contrib模块进行安装和配置。OpenCV(开源计算机视觉库)是一个强大的图像处理和计算机视觉库,而contrib模块则包含了一些额外...
1.下载了最新的opencv_python-3.2.0.7-cp35-cp35m-win_amd64.whl,使用pip安装成功 2. import cv2 失败,ImportError: DLL load failed: 找不到指定的模块 3. 按照网上博客提示,下载 Visual C++ Redistributable ...
具体查看博文:...
opencv图像边缘检测,包括roberts,sobel,prewitt和laplace算子
通过阅读"Learning OpenCV3"和"学习OpenCV2 中文版.pdf"这两本书,并结合源码实践,你可以系统地掌握OpenCV的核心技术和应用,为你的计算机视觉项目打下坚实的基础。同时,随着OpenCV的持续发展,不断关注新版本的...
中文版的learning opencv. 一共12章
Learning OpenCV 3_Computer Vision in C++ with the OpenCV Library_Adrian Kaehler and Gary Bradski.epub