现在的位置: 首页 > 综合 > 正文

Learning OpenCV —— Gradients and Sobel Derivatives 梯度和Sobel导数

2013年07月09日 ⁄ 综合 ⁄ 共 1334字 ⁄ 字号 评论关闭

Gradients and Sobel Derivatives  梯度和Sobel导数

    一个最重要并且最基本的卷积是导数的计算(或者是其近似值),有许多方法可以做到,但是只有少数适合于给定情况。

通常来说,用来表达微分的最常用的操作是sobel微分算子(见图6-36-4)Sobel算子包含任意阶的微分以及混合偏导(例如
)

6-3 逼近x-方向上一阶微分的sobel算子效果

cvSobel(

      const CvArr*  src,

      CvArr*        dst,

      int           xorder,

      int           yorder,

      int           aperture_size = 3

);

这里,srcdst分别是输入图像和输出图像,xorderyorder是求导的阶数。通常只可能用到01最多2。值为0表明在这个方向上没有求导[65]aperture_size参数是方形滤波器的宽(或高)并且应该是奇数。目前,aperture_size支持1,3,5,7。如果原图像src是8位的,为避免溢出,目标图像的深度必须是IPL_DEPTH_16S。无论是xorder还是yorder都必须非零。

6-3 逼近y-方向上一阶微分的sobel算子效果

Sobel导数有一个非常好的属性,即可以定义任意大小的核,并且这些核可以快速且迭代方式构造。因为小核对噪声更敏感,所以大核对导数有更好的逼近。

为了更好的理解以上内容,我们必须认识到,Sobel导数并不是真正的导数,这是因为Sobel算子是定义在一个离散空间。Sobel算子真正表示的是多项式拟合,也就是说,x方向上的二阶Sobel导数并不是真正的二阶导数。它是对抛物线函数的局部拟合。这说明人们为什么想用较大的内核,因为较大内核是在更多像素上计算这种拟合。

事实上,在离散网格的场合下有很多方法可以近似地计算出导数。这种使用于Sobel算子近似计算导数的缺点是使用小核的精度比较差。对于大核,由于使用了更多的点用于估计,这个问题并不严重。这种不精确性并不会直接在cvSobel()中使用的XY滤波器中表现出来,因为它们完全按xy轴排列。当试图计算图像的方向导数的估计量时,难度就出现了。(如,使用y/x滤波器响应的反正切得到的图像梯度的方向 。)

为了承上启下,这里有一个这类图像度量的具体例子。这个例子是在从一个物体收集形状信息的过程里,而这个过程是通过累积目标周围梯度角度的直方图来实现的。 这样的直方图是许多被训练和操作的形状分类器的基础。在这种情况下,对梯度角度不准确的度量将会将低分类器识别的性能。

对于一个3×3Sobel滤波器,进一步来说当梯度角度是水平或者垂直时,这样的不准确就更加明显。OPENCV通过在cvSobel()函数中一些特殊aperture_sizeCV_SCHARR的隐性使用,可以解决小(但是快)3×3 Sobel导数滤波器不准确的问题。Scharr滤波器同sobel滤波器一样快,但是准确率更高,所以当你利用3×3滤波器实现图像度量的时候应该使用Scharr滤波器。Scharr滤波器的滤波系数如图6-5所示[Scharr00]

 

抱歉!评论已关闭.