我正在研究标记检测算法并阅读this他们正在使用高斯核的一维导数来获得梯度。他们将屏幕分成5个像素的小扫描线,然后他们在水平和垂直方向上操作内核来计算梯度,我很想知道它是如何完成的,即:
他们得到的操作是:
[ -3 -5 0 5 3] * A
我认为它是水平衍生物?
那么垂直的那个,只是乘以这样的转置?:
A * ([ -3 -5 0 5 3]^T)
对于计算梯度方向的另一方,他们使用3x3 Sobel内核,但扫描线是5x5,有人知道它是如何完成的吗?
提前致谢。
答案 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扫描线:我不知道这意味着什么。我认为他们以某种方式对图像进行子采样以提高性能。更少的像素=更快的计算。