我正在看一种标记检测算法,并读取这,它们使用一维高斯核导数来获得梯度。他们将屏幕分成5个像素的小扫描线,然后在水平和垂直方向上操作内核来计算梯度,我想知道它是如何做到的,即:
他们的行动是:
[ -3 -5 0 5 3] * A我想是水平导数吧?
那么垂直的那一个呢,只是像这样乘以转置的问题吗?
A * ([ -3 -5 0 5 3]^T)对于另一边计算梯度方向,他们使用3x3Sobel内核,但是扫描线是5x5,有人知道它是如何完成的吗?
发布于 2018-05-04 21:04:50
卷积
[-3 -5 0 5 3] * A与实际导数近似。因为A是抽样的,所以我们不能知道真正的导数。我们需要一个离散的近似。一种常见的方法是有限差分法,其中简单地考虑了后续元素之间的区别: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通过与高斯导数的转换,可以得到进一步的改进。当涉及到平滑(正则化)滤波器时,高斯是某种最优的。此外,卷积具有以下性质:d/dx (A * G) = A * d/dx G。也就是说,将图像与高斯导数相转换,与高斯平滑图像的真导数是相同的。你可以写这样一个一维卷积,例如:
[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)核的导数。
实际的实现建议取决于您的语言。以下是使用MATLAB时的一些建议。它可能也能很好地翻译成其他语言。
关于5x5扫描线:我不知道这意味着什么。我认为他们在某种程度上对图像进行了细分,以提高性能。更少的像素=更快的计算。
https://stackoverflow.com/questions/50179551
复制相似问题