2017-05-20 15 views
1

5 가지 가장 비슷한 이미지를 입력 이미지와 비교하고 싶습니다. 이렇게하려면 SIFT (VLFeat library)를 사용하여 각각의 설명자를 비교하는 것이 좋습니다. 그래서 vl_ubcmatch (doc here) 방법을 사용하여 이미지 간의 유사성 측정 값을 계산합니다. 가장 비슷한 5 개의 이미지 가져 오기

코드입니다 : 당신이 코드에서 볼 수 있듯이, 내가 유사성의 척도로 평균을 사용하지만 얻을 만족스러운 결과를 얻지 생각

path_dir = './img/'; 
imgs = dir(path_dir); 
imgs = imgs(3 : end); 
numImgs = size(imgs); 
numImgs = numImgs(1); 
path1 = './img/car01.jpg'; 
Ia = imread(path1); 
Ia = single(rgb2gray(Ia)); 
[fa, da] = vl_sift(Ia); 

results = struct; 
m = 0; 
j = 1; % indice dell'img (del for) 

for img = imgs' 

    path = strcat(path_dir, img.name); 
    if(strcmp(path1, path) == 0) 
     Ib = imread(path); 
     Ib = single(rgb2gray(Ib)); 
     [fb, db] = vl_sift(Ib); 

     [matches, scores] = vl_ubcmatch(da, db); 

     s = sum(scores); 
     [r, c] = size(scores); 
     m = s ./ c; 

     results(j).measure = m; 
     results(j).img = path; 
     j = j + 1; 
    end 
end 

(예를 들어, 알려줍니다 나는 컵의 입력 이미지가 다른 컵보다 나무와 더 비슷하다는 것을 알았다.)

당신에 따르면 더 많은 수의 동등한 서술자를 갖고 있지만 유사하거나 덜 유사한 서술자를 사용하는 것이 더 좋지만 유사성은 더 큽니까? 5 가지 카테고리 (컵, 나무, 사람, 테이블 및 자동차)의 50 개 이미지가 있으며 이미지를 입력하면 프로그램은 5 개의 가장 비슷한 이미지를 반환하고 선호하는 동일한 카테고리에 속합니다.

더 정확한 분류를 얻기 위해 평균 대신에 어떤 측정을 사용할 수 있습니까? 감사합니다.

답변

0

코드에 따르면 이미지 (Ia)와 다른 모든 이미지 (Ib) 사이의 유사성을 측정합니다. 따라서 Ia의 SIFT 설명자와 모든 Ib의 SIFT 설명자를 비교합니다. 각 이미지 쌍 (matches)에 대한 기능 일치 목록과 각 기능 쌍의 유클리드 거리 (scores)를 제공합니다.

이제는 이미지 쌍의 평균값을 유사성 측정으로 사용하면 매우 강력한 방법이 아닙니다. 단 하나의 기능 일치가있는 이미지 쌍이 (우연히) 이미지보다 더 나은 "유사성"을 나타낼 수 있기 때문입니다 많은 기능과 쌍을 이룬다. 나는 당신의 작업에 비현실적인 해결책이라고 생각한다.

귀하의 질문에 관해서는 의미가없는 설명자를 많이 가지고있는 것보다 의미가 있고 강력한 설명자를 가지고있는 것이 좋습니다. 물론 그 수가 적을지라도 (물론 더 좋습니다!).

제안 : inliers 수 (= 각 이미지 쌍의 기능 일치 수, numel(matches))를 계산하면 어떨까요?

이렇게하면 다른 객체와 동일한 객체의 이미지 사이에 더 많은 inliers를 줄 수 있으므로 가장 많은 inliers를 가진 쌍을 가져 오는 것이 가장 비슷한 것입니다.

컵을 나무와 구별하기 만하면 효과가 있습니다. 분류 작업이 점점 어려워지고 다른 유형의 나무를 구별해야하는 경우 SIFT는 사용할 수있는 최상의 알고리즘이 아닙니다. 학습 방식을 사용하면 더 나은 결과를 얻을 수 있지만 작업에 따라 다릅니다.