Сопоставление признаков изображений с использованием PCA-SIFT

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

%des1 and des2 are the PCA-SIFT descriptors obtained from two images
% Precompute matrix transpose
des2t = des2';                  
matchTable = zeros(1,size(des1,1));
cnt=0; %no. of matches
%ration of ditances
distRatio = 0.5;
%normalising features
m1=max(max(des1));
m2=max(max(des2));
m=max(m1,m2);
des1=des1./m;
des2=des2./m;
for i = 1 : size(des1,1)
    %finding eucledian distance of a vector in one image to all features in second image
    A=des1(i,:);
    D = des2-repmat(A,size(des2,1),1);
    [vals,indx] = sort((sum(D.^2,2)).^(1/2)); %sort distances

   % Check if nearest neighbor has angle less than distRatio times 2nd.
   if (vals(1) < distRatio * vals(2))
      matchTable(i) = indx(1);
      cnt=cnt+1;
   else
      matchTable(i) = 0;
   end
end
cnt

Приведенный выше код отлично работает для функций SIFT. Но я не могу получить правильные результаты для функций PCA-SIFT даже после того, как попробовал несколько значений distRatio(0-1). Я также не уверен, выполняет ли центральный код Matlab для PCA-SIFT (упомянутый выше) точный процесс, как указано в эта статья Если у кого-то есть какие-либо идеи по поводу вышеуказанной проблемы, пожалуйста, прокомментируйте.


person Richa    schedule 19.04.2016    source источник


Ответы (1)


Проблема в том, что PCA не сохраняет евклидово расстояние между двумя векторами. Возьмем простой пример, когда ваши данные расположены вдоль линии y = x. Расстояние между 2-мя точками вдоль линии будет зависеть от обеих координат, даже если все ваши данные 1-мерные, т.е. лежащие вдоль линии. Когда вы применяете PCA, новое евклидово расстояние будет учитывать только главный компонент, который будет линией y = x, поэтому расстояние между (1,1), (2,2) будет просто 1 вместо sqrt (2 ).

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

https://en.wikipedia.org/wiki/Cosine_similarity

Поэтому я бы сначала рекомендовал вам проверить, работает ли сопоставление для просеянных функций, если вы нормализуете их по их норме L2. Если да, вы можете применить PCA к этим функциям, снова нормализовать функции PCA по их норме L2, а затем вычислить евклидово расстояние. Насколько я помню, норма L2 вектора просеивания равна 1. Итак, вам нужно только нормализовать ваши функции PCA-SIFT по их норме L2 и вычислить евклидово расстояние.

person Bharat    schedule 20.04.2016