用于边缘检测算法的高斯导数核

时间:2018-05-04 16:36:03

标签: image-processing gaussian edge

我正在研究标记检测算法并阅读this他们正在使用高斯核的一维导数来获得梯度。他们将屏幕分成5个像素的小扫描线,然后他们在水平和垂直方向上操作内核来计算梯度,我很想知道它是如何完成的,即:

他们得到的操作是:

[ -3 -5 0 5 3] * A

我认为它是水平衍生物?

那么垂直的那个,只是乘以这样的转置?:

A * ([ -3 -5 0 5 3]^T)

对于计算梯度方向的另一方,他们使用3x3 Sobel内核,但扫描线是5x5,有人知道它是如何完成的吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

卷积

[-3 -5 0 5 3] * A

actual derivative的近似值。因为A被抽样,我们无法知道真正的导数。我们需要一个离散近似。一种常见的方法是finite difference method,其中一个简单地区分后续元素:A[x+1,y]-A[x,y]。这是在离散情况下填写导数极限方程时得到的结果。 Lim h->0变为h=1,没有更小的间距。可以使用卷积计算这种差异:

[1  -1] * A

此操作在两个像素之间的位置处产生导数。为了克服这个问题,可以使用中心差异:(A[x+1,y]-A[x-1,y])/2或卷积形式:

[1/2  0  -1/2] * A

通过与derivative of the Gaussian合作,可以获得进一步的改进。当涉及平滑(正则化)滤波器时,高斯是某种最佳的。此外,卷积具有以下属性:d/dx (A * G) = A * d/dx G。也就是说,用高斯的导数对图像进行卷积与由高斯平滑的图像的导数相同。您可以将这样的1D卷积写为:

[0.013  0.108  0.242  0.0  -0.242  -0.108  -0.013] * A

请注意,最好还使用Gaussian对列进行卷积,以保持各向同性。但我们暂时忽略它。

出于某种原因,计算机视觉社区的人们似乎对浮点值过敏(最近这种情况有所改善,但总会有人认为用整数值计算卷积更便宜)。因此,似乎您链接的页面,他们用近似它的整数值内核替换了高斯内核的实际导数。这会导致[3 5 0 -5 -3]。他们还设法反转了值,导致操作接近-d/dx

他们后来使用Gabor来确定方向,进一步表明他们并不真正知道他们在做什么,因为Gabor比真正的梯度更接近于高斯衍生物。

简而言之,如果您想计算衍生工具,请按以下步骤操作:

A * d/dx G(x) * G(y)

(使用G(x) 1D高斯作为x的函数,即水平向量,并G(y)转置;并直接采样d/dx G(x),而非采样{{ 1}}并计算其有限差分导数。)

要计算沿G(x)轴的导数,请使用y内核的导数进行相同的操作。

实际实施建议取决于您的语言。 Here is some advice when using MATLAB。它也可能很好地翻译成其他语言。

关于5x5扫描线:我不知道这意味着什么。我认为他们以某种方式对图像进行子采样以提高性能。更少的像素=更快的计算。