Реализация дескриптора функции SIFT

Согласно статье Лоу об исходном алгоритме SIFT, дескриптор признака, состоящий из гистограмм ориентации 4 x 4, вычисляется из окна 16 x 16. Масштаб дескриптора используется только для выбора уровня размытия по Гауссу для изображения.

Глядя на реализацию OpenCV, это не так. В calcSIFTDescriptor есть следующий код для расчета гистограмм:

for( k = 0; k < len; k++ )
{
  // histogram update
}

Где len — количество используемых образцов. По алгоритму Лоу всегда должно быть 256 (16 х 16), не должно быть? В реализации OpenCV len зависит от масштаба дескриптора.

Может ли кто-нибудь прояснить это?

Спасибо


person danst_18    schedule 10.03.2015    source источник
comment
Слишком глубоко и не технично. Здесь вы можете не получить ответ. Попробуйте Opencv Q and A (официальный форум).   -  person LovaBill    schedule 10.03.2015


Ответы (1)


Вы смотрите не на код, который строит гистограмму, а на код, который исследует окрестности данного пикселя для вычисления ориентации и нормы градиента.

Соответствующий код приведен ниже в исходном файле:

for( k = 0; k < len; k++ )
{
  int bin = cvRound((n/360.f)*Ori[k]);
  if( bin >= n )
    bin -= n;
  if( bin < 0 )
    bin += n;
  temphist[bin] += W[k]*Mag[k];
}

В этом отрывке строка cvRound(...) — это та, которая вычисляет целевой бин на 16-битной гистограмме.

Обычно в SIFT вы должны сначала изменить выборку окрестности характерной точки, воссоздав сетку из блоков 4x4 по 4x4 пикселя. Код, который вы показали, используется для вычисления статистики градиента без повторной выборки изображения. Переменный радиус здесь учитывает положение изображения в масштабном пространстве.

person sansuiso    schedule 10.03.2015
comment
Код, который вы показали, не выполняется в моем случае, так как я сам предоставляю ключевые точки. Однако я думаю, что понял суть. Параметр радиуса управляет количеством соседних пикселей, которые учитываются при вычислении градиента в каждом месте. - person danst_18; 10.03.2015