【问题标题】:Gaussian derivative kernel for edge detection algorithm边缘检测算法的高斯导数核
【发布时间】:2018-10-15 05:08:38
【问题描述】:

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

他们得到的操作是:

[ -3 -5 0 5 3] * A

我假设它是水平导数?

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

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

另一边计算梯度方向他们使用 3x3 Sobel 核,但是扫描线是 5x5,有人知道是怎么做的吗?

【问题讨论】:

  • 您可以在此处阅读有关具有高斯和高斯导数的卷积:crisluengo.net/index.php/archives/22
  • 谢谢,很好的解释,但我仍然不清楚如何将其应用于上述情况,如果能看到一个如何使用 1d 内核计算梯度的示例,那就太好了。 .

标签: image-processing gaussian edge-detection


【解决方案1】:

卷积

[-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。也就是说,用高斯导数对图像进行卷积与经过高斯平滑的图像的true导数相同。您可以将这样的一维卷积编写为:

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

请注意,最好将列与高斯进行卷积,以保持各向同性。但我们暂时忽略它。

出于某种原因,计算机视觉社区的人们似乎对浮点值过敏(这在最近得到了很大改进,但总会有人认为用整数值计算卷积更便宜)。所以看起来你链接的页面,他们用一个近似它的整数值内核替换了高斯内核的实际导数。这导致[3 5 0 -5 -3]。他们还设法反转这些值,从而得到一个近似于-d/dx 的运算。

他们后来使用 Gabor 来确定方向进一步表明他们并不真正知道自己在做什么,因为 Gabor 对真实梯度的逼近比使用高斯导数所能做的更差。

简而言之,如果要计算导数,请执行以下操作:

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

G(x) 是一维高斯函数x 的函数,即水平向量,G(y) 是其转置的函数;直接对d/dx G(x) 进行采样,而不是对G(x) 进行采样并计算其有限差分导数) .

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

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

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

【讨论】:

  • 嗨,克里斯,感谢您的回答和时间,我看了您的文章,它们对更好地理解背后的理论很有帮助,但目前我正试图了解他们做了什么到目前为止,我似乎有点困惑。我的目标是基于嵌入式系统 fpga,无论好坏,他们都有一个有效的算法,当你的资源有限时,这似乎是个好方法。目前我想了解他们在使用该内核和扫描线方法的卷积过程中做了什么......
猜你喜欢
  • 2014-03-29
  • 2012-04-25
  • 2018-12-26
  • 2023-03-16
  • 2021-06-02
  • 2013-11-19
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
相关资源
最近更新 更多