首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于边缘检测算法的高斯导数核

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

Stack Overflow用户
提问于 2018-05-04 16:36:02
回答 1查看 5.5K关注 0票数 1

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

他们的行动是:

代码语言:javascript
复制
[ -3 -5 0 5 3] * A

我想是水平导数吧?

那么垂直的那一个呢,只是像这样乘以转置的问题吗?

代码语言:javascript
复制
A * ([ -3 -5 0 5 3]^T)

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-04 21:04:50

卷积

代码语言:javascript
复制
[-3 -5 0 5 3] * A

实际导数近似。因为A是抽样的,所以我们不能知道真正的导数。我们需要一个离散的近似。一种常见的方法是有限差分法,其中简单地考虑了后续元素之间的区别:A[x+1,y]-A[x,y]。这就是当你在离散情况下填写导数极限方程时得到的结果。Lim h->0变成h=1,没有更小的间距。这种差异可以用卷积来计算:

代码语言:javascript
复制
[1  -1] * A

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

代码语言:javascript
复制
[1/2  0  -1/2] * A

通过与高斯导数的转换,可以得到进一步的改进。当涉及到平滑(正则化)滤波器时,高斯是某种最优的。此外,卷积具有以下性质:d/dx (A * G) = A * d/dx G。也就是说,将图像与高斯导数相转换,与高斯平滑图像的真导数是相同的。你可以写这样一个一维卷积,例如:

代码语言:javascript
复制
[0.013  0.108  0.242  0.0  -0.242  -0.108  -0.013] * A

请注意,最好也将列与高斯,保持事物的各向同性。但让我们暂时忽略这一点。

由于某种原因,计算机视觉社区中的人们似乎对浮点值过敏(最近这种情况有了很大改善,但总有一些人认为用整数计算卷积比较便宜)。所以你所链接的页面,他们用一个整数值的核来代替高斯核的实际导数,这个核可以近似它。这将导致[3 5 0 -5 -3]。他们还设法反转了值,导致了一个近似于-d/dx的操作。

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

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

代码语言:javascript
复制
A * d/dx G(x) * G(y)

(对于G(x),一维高斯作为x的函数,即水平向量,G(y)变换;直接采样d/dx G(x),而不是采样G(x)和计算其有限差分导数)。

要计算沿y轴的导数,同样要使用G(y)核的导数。

实际的实现建议取决于您的语言。以下是使用MATLAB时的一些建议。它可能也能很好地翻译成其他语言。

关于5x5扫描线:我不知道这意味着什么。我认为他们在某种程度上对图像进行了细分,以提高性能。更少的像素=更快的计算。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50179551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档