1

我正在尝试通过并理解一些 VLFeat 代码,以了解它们如何生成 SIFT 特征点。一开始让我困惑的一件事是他们如何计算 SIFT 计算中的八度音阶数。

因此,根据文档,如果为初始八度音阶数提供负值,它将计算由 log2(min(width, height)) 给出的最大值。对应位的代码为:

if (noctaves < 0) {
   noctaves = VL_MAX (floor (log2 (VL_MIN(width, height))) - o_min - 3, 1) ;
}

此代码在函数中是在 vl_sift_new 函数中。这里 o_min 应该是第一个八度的索引(我猜不需要从全分辨率图像开始)。我假设在大多数用例中可以将其设置为 0。

所以,我仍然不明白为什么他们从这个值中减去 3。这似乎非常令人困惑。我确信有一个很好的理由,但我一直无法弄清楚。

4

1 回答 1

2

它们减去 3 的原因是为了确保您正在查看的补丁的最小大小以获得一些可观的输出。此外,在分析补丁和提取特征时,根据您正在查看的算法,有一个最小大小的补丁,特征检测需要获得良好的输出,因此减去 3 确保满足这个最小补丁大小一旦你到达最低的八度。

让我们举一个数字的例子。假设我们有一个 64 x 64 的补丁。我们知道,在每个八度音程中,每个维度的大小都除以 2。因此,从log2理论上讲,取行和列中最小的那个将为您提供可能的八度音程总数……正如您在上面的代码中注意到的那样. 在我们的例子中,行和列都是最小值,从log2理论上讲,行或列中的 7 个八度音阶(log2(64) = 7)。八度音阶排列如下:

Octave |    Size
--------------------
   1   |  64 x 64
   2   |  32 x 32
   3   |  16 x 16
   4   |   8 x 8
   5   |   4 x 4
   6   |   2 x 2
   7   |   1 x 1

但是,查看 5、6 和 7 八度音阶可能不会给您任何有用的信息,因此实际上分析这些八度音阶毫无意义。因此,通过从八度音程总数中减去 3,我们将在 octave 4停止分析事物,因此要分析的最小块是 8 x 8。

因此,这种减法通常在查看图像中的比例空间时执行,因为这会强制最后一个八度音程具有良好的大小来分析特征。数字 3 是任意的。我见过人们减去 4 甚至 5。在我见过的所有特征检测代码中,3 似乎是使用最广泛的数字。因此,按照我所说的,查看大小为 1 x 1 的八度音阶并没有多大意义,对吧?

于 2015-05-18T21:47:55.350 回答