我试图了解一些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。这看起来很混乱。我确信有充分的理由,但我无法弄明白。
答案 0 :(得分: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,我们将停止分析八度 4 的事物,因此要分析的最小补丁是8 x 8。
因此,这种减法通常在查看图像中的比例空间时执行,因为这会强制最后一个八度音程具有良好的大小来分析特征。数字3是任意的。我见过人们减去4甚至5。从我看到的所有特征检测代码中,3似乎是使用最广泛的数字。因此,根据我的说法,看一个尺寸为1 x 1的八度音程真的没什么意义,对吗?