2015-05-17 2 views
1

Я пытаюсь пройти и понять некоторые из кода VLFeat, чтобы увидеть, как они генерируют точки функции SIFT. Одна вещь, которая меня озадачила на ранней стадии, заключается в том, как они вычисляют количество октав в их вычислении SIFT.VLFeat: вычисление числа октав для SIFT

Таким образом, согласно документации, если вы указываете отрицательное значение для начального числа октав, она будет вычислять максимум, который задается log2 (min (ширина, высота)). Код для соответствующего бита:

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

Этот код находится в функции находится в vl_sift_new функции. Здесь o_min должен быть индексом первой октавы (думаю, не нужно начинать с изображения с полным разрешением). Я предполагаю, что это может быть установлено в 0 в большинстве случаев использования.

Итак, все же я не понимаю, почему они вычитают 3 из этого значения. Это кажется очень запутанным. Я уверен, что есть веская причина, но я не смог понять это.

ответ

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 из общего количества октав, мы прекратим анализировать вещи на октаву , и поэтому самый маленький патч для анализа составляет 8 х 8.

Таким образом, это вычитание обычно выполняется при просмотре масштабные пробелы в изображениях, потому что это гарантирует, что последняя октава имеет хороший размер для анализа функций. Число 3 произвольно. Я видел, как люди вычитают 4 и даже 5. Из всего кода обнаружения функции, который я видел, 3, по-видимому, является самым широко используемым номером. Итак, с тем, что я сказал, на самом деле не имеет смысла смотреть на октаву, размер которой равен 1 х 1, правильно?

+0

Ах да. В этом есть смысл. Я как бы понял это сегодня. Я установил минимальный размер патча 32 x32 и, похоже, дал неплохие результаты. – Luca

+1

@ Luca - Ах круто! Это имеет смысл, что вы поняли это. Вы задали этот вопрос около 24 часов назад. Жаль, что я не понял этого раньше. BTW, 32 x 32 - хороший размер, поэтому придерживайтесь его, и спасибо за принятие! – rayryeng