Как работает KNearestNeighborMatching.Match

Я просмотрел документацию по этому методу здесь: http://accord-framework.net/docs/html/M_Accord_Imaging_KNearestNeighborMatching_1_Match_1.htm

Описание довольно краткое: «Соответствует двум наборам характерных точек». Я пробовал это пару раз, во-первых, используя результат серфинга одного и того же изображения дважды, а во-вторых, серфинг двух разных изображений. Первый тест вернул, как я и ожидал, немного меньше совпадающих точек, чем точки, найденные SURF. Второй заставил меня почесать голову, я получил больше очков, чем наибольшее количество очков, найденных SURF. Так что, очевидно, я не знаю, чего ожидать от этого метода. Может ли кто-нибудь дать мне более подробное описание того, что я могу ожидать?

Я пытаюсь определить, насколько похожи два изображения разных размеров. Вы можете увидеть предыдущий связанный вопрос, который я задал здесь: Accord.NET Comparing два изображения для определения сходства


person Jaquio    schedule 19.10.2016    source источник


Ответы (1)


Метод использует алгоритм классификации k-ближайших соседей для изучения сопоставления между дескрипторами в одном изображении и вектором целочисленных индексов, указывающих их положение. Из исходный код класса KNearestNeighborMatch, вы можете увидеть:

/// <summary>
///   Creates a nearest neighbor algorithm with the feature points as
///   inputs and their respective indices a the corresponding output.
/// </summary>
/// 
protected virtual IMulticlassScoreClassifier<T> CreateNeighbors(T[] features)
{
    int[] outputs = Vector.Range(0, features.Length);

    // Create a k-Nearest Neighbor classifier to classify points
    // in the second image to nearest points in the first image
    return new KNearestNeighbors<T>(K, Distance).Learn(features, outputs);
}

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

Что касается наблюдения о количестве точек, возвращаемых функцией, это объяснено в строках 144–154:

 // We should build the classifiers with the highest number
 // of training points. Thus, if we have more points in the
 // second image than in the first, we'll have to swap them

 if (points2.Length > points1.Length)
 {
     var aux = points1;
     points1 = points2;
     points2 = aux;
     swap = true;
 }

Как видите, метод будет использовать в качестве «якоря» изображение с наибольшим количеством дескрипторов SURF. Это необходимо, чтобы ни одна характерная точка на изображении с меньшим количеством дескрипторов не осталась неклассифицированной.

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

person Cesar    schedule 09.07.2017