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

Gradients and Sobel Derivatives 梯度和Sobel导数<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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

通常来说,用来表达微分的最常用的操作是sobel微分算子(见图6-36-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

);

这里,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算子效果

<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()中使用的XY滤波器中表现出来,因为它们完全按xy轴排列。当试图计算图像的方向导数的估计量时,难度就出现了。(如,使用y/x滤波器响应的反正切得到的图像梯度的方向 。)

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

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

你可能感兴趣的:(xml,F#,ext,Microsoft,Office)