VLFeat:计算 SIFT 的八度音程数

VLFeat: computation of number of octaves for SIFT

我正在尝试通读并理解一些 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。这看起来很混乱。我确定有一个很好的理由,但我一直无法弄明白。

他们减去 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,我们将停止分析八度音程 4 处的事物,因此要分析的最小补丁是 8 x 8.

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