2010-06-30 3 views
2

Я столкнулся с реализацией алгоритма ближайшего соседа для поиска совпадений между определенными ключевыми точками в двух похожих изображениях. Ключевые точки были сгенерированы алгоритмом SIFT. Точки описываются вектором размерности 128, и на обоих изображениях много таких точек.Альтернатива метрике расстояния в алгоритме ближайшего соседа?

Алгоритм сопоставления использует поиск ближайшего соседа и для каждой точки на одном изображении вычисляет соответствующую ближайшую точку на другом изображении. «Близость» изображается минимальным евклидовым расстоянием между векторами точек. Лучшие такие матчи выбираются, беря только те пары точек, расстояние которых находится ниже определенного порога.

Однако реализация, с которой я столкнулась, умножает все векторы ключевых точек на одном изображении, а также на других изображениях, формируя таким образом матрицу продуктов. Затем он находит точки, продукт которых превышает заданный порог.

Эта реализация дает правильные результаты, но я хотел бы знать, как это работает. Использует ли он корреляцию между векторами как метрику или что-то еще происходит здесь.

+0

Я не очень разбираюсь в обработке изображений, но то, что я знаю о внутренних продуктах и ​​метрических пространствах, заставляет меня задаться вопросом, реализует ли реализация какой-то необычный внутренний продукт .... Мне нечего делать на работе сейчас, поэтому я мог бы также изучить его. Кажется довольно интересным. – JAB

+0

Какая реализация это? Также вы могли бы разместить соответствующую часть кода? – Jacob

+0

Это часть исходного кода SIFT GPU http://www.cs.unc.edu/~ccwu/siftgpu/ и находится в файле ProgramCU.cu под частью для сопоставления SIFT. Я не размещал его здесь, потому что он несколько огромный и сложный, поскольку он является частью функции ядра CUDA. – Slartibartfast

ответ

2

В любом случае, это не вопрос отличительных внутренних продуктов, и это не вопрос самого продукта-точки. Оказывается, это вопрос простой математики.

В основном ...

Предположим, ABS (а + б) = С, где С есть некоторая постоянная. Максимально возможное значение a * b всегда будет результатом (ы), где a == b == + - C/2. Следовательно, расстояние между a и b будет минимальным, когда их произведение будет максимальным, и наоборот. Это работает для всех действительных чисел (как положительных, так и отрицательных), а также распространяется на несколько измерений, поэтому он, вероятно, также работает со сложными числами (хотя я не тестировал его с такими).

Пример с С = 20:

((а, б), расстояние, продукт)

((0,   20),   20,0, 0)
((1,   19),   18,0, 19)
((2,   18),   16.0, 36)
((3,   17),   14.0, 51)
((4,   16),   12,0, 64)
((5,   15),   10.0, 75)
((6,   14),   8.0,     84)
((7,   13),   6,0,     91)
((8,   12),   4.0,     96)
((9,   11),   2.0,     99)
((10, 10), 0,0,   100)             (Как можно видеть, расстояние минимальное время как продукт является максимальным.)
((11, 9),     2.0,     99)
((12, 8),     4.0,     96)
((13, 7),     6.0,     91)
((14, 6),     8.0,     84)
((15, 5),     10.0, 75)
((16, 4),     12,0, 64)
((17, 3),     14.0, 51)
((18, 2),     16.0, 36)
((19, 1),     18,0, 19)
((20, 0),     20,0, 0)

+0

Ах !! Теперь я чувствую себя глупо, спрашивая об этом. На самом деле это работает непосредственно из формулы евклидова расстояния. Большое вам спасибо – Slartibartfast

+0

Вы очень желанны. – JAB

+0

Ну, используя точечные произведения: | a + b |^2 = (a + b). (a + b) = a.a + 2 a.b + b.b, а все SIFT-векторы имеют одинаковую длину a.a = b.b, поэтому минимизация a.b минимизирует | a + b | , – denis

Смежные вопросы