문제

나는 그것을 사용했다 체로 치다 구현 Andrea Vedaldi, 두 개의 유사한 이미지의 SIFT 디스크립터를 계산하기 위해 (두 번째 이미지는 실제로 다른 각도에서 동일한 객체의 그림에서 확대 된 것입니다).

이제 나는 알아낼 수 없습니다 디스크립터를 비교하여 이미지가 얼마나 비슷한 지 알리는 방법?

나는 당신이 실제로 이런 종류의 것들을 실제로 가지고 놀지 않았다면이 질문은 대답 할 수 없다는 것을 알고 있지만, 나는 전에 이것을 한 사람이 이것을 알고있을 것입니다, 그래서 질문을 게시했습니다.

내가 설명자를 생성하기 위해 한 작은.

>> i=imread('p1.jpg');
>> j=imread('p2.jpg');
>> i=rgb2gray(i);
>> j=rgb2gray(j);
>> [a, b]=sift(i);  % a has the frames and b has the descriptors
>> [c, d]=sift(j);
도움이 되었습니까?

해결책

첫째, Sift 대신 VL_SIFT를 사용해야하지 않습니까?

둘째, SIFT 기능 일치를 사용하여 두 이미지에서 서신을 찾을 수 있습니다. 샘플 코드는 다음과 같습니다.

    I = imread('p1.jpg');
    J = imread('p2.jpg');

    I = single(rgb2gray(I)); % Conversion to single is recommended
    J = single(rgb2gray(J)); % in the documentation

    [F1 D1] = vl_sift(I);
    [F2 D2] = vl_sift(J);

    % Where 1.5 = ratio between euclidean distance of NN2/NN1
    [matches score] = vl_ubcmatch(D1,D2,1.5); 

    subplot(1,2,1);
    imshow(uint8(I));
    hold on;
    plot(F1(1,matches(1,:)),F1(2,matches(1,:)),'b*');

    subplot(1,2,2);
    imshow(uint8(J));
    hold on;
    plot(F2(1,matches(2,:)),F2(2,matches(2,:)),'r*');

vl_ubcmatch ()는 본질적으로 다음을 수행합니다.

F1에 Point P가 있고 F2에서 "최고의"경기를 찾고 싶다고 가정 해 봅시다. 이를 수행하는 한 가지 방법은 F1의 P의 디스크립터를 D2의 모든 설명자와 비교하는 것입니다. 비교함으로써, 나는 유클리드 거리 (또는 두 설명자의 차이의 L2-norm)를 찾습니다.

그런 다음 F2에서 두 가지 점을 찾았습니다. U & V는 각각 P에서 가장 낮고 두 번째로 낮은 거리 (예 : DU 및 DV)를 갖습니다.

LOWE가 권장 한 내용은 다음과 같습니다. DV/DU> = 임계 값 (샘플 코드에서 1.5를 사용한 경우) 은이 일치가 허용됩니다. 그렇지 않으면, 그것은 모호하게 일치하고 서신으로 거부되며 F2에서 P에서 P에서 P에서 P에서 P까지의 지점과 일치하지 않습니다. 본질적으로, 최고와 두 번째 경기 사이에 큰 차이가 있으면 품질 매치가 될 것으로 예상 할 수 있습니다.

이미지에 모호한 경기에 대한 범위가 많이 있기 때문에 중요합니다. 호수 나 여러 창이있는 건물의 매칭 지점을 상상해보십시오. 디스크립터는 매우 유사 해 보일 수 있지만 서신은 분명히 잘못되었습니다.

여러 가지 방법으로 일치하는 작업을 수행 할 수 있습니다. Matlab으로 직접 쉽게 할 수 있거나 KD-Tree 또는 대략적인 가장 가까운 숫자 검색을 사용하여 속도를 높일 수 있습니다. 플란 구현되었습니다 Opencv.

편집 : 또한 몇 가지가 있습니다 MATLAB에서 KD-Tree 구현.

다른 팁

David Lowe 's를 읽어야합니다 종이, 정확히하는 방법에 대해 이야기합니다. 동일한 객체의 이미지를 비교하려면 충분해야합니다. 동일한 범주 (예 : 자동차 또는 비행기)의 다른 객체의 이미지를 일치 시키려면 피라미드 일치 커널 Grauman과 Darrell에 의해.

첫 번째 이미지의 각 디스크립터를 두 번째 이미지의 서술자와 비교해보십시오 (유클리드 거리를 사용). 따라서, 두 번째 이미지에서 가장 유사한 이웃 디스크립터 사이의 유사성 정도에 따라 첫 번째 이미지에서 각 디스크립터에 점수를 할당합니다. 이 모든 점수의 통계적 측정 (합, 평균, 분산, 평균 오류 등)은 이미지가 얼마나 유사한 지에 대한 추정치를 제공합니다. 인근 크기와 통계적 측정의 다양한 조합을 실험하여 최상의 답변을 제공하십시오.

확대 및 회전 된 이미지를 알려진 회전 중심과 비교하려면 로그 폴라 코디네이트에서 위상 상관 관계를 사용할 수 있습니다. 피크의 선명도와 위상 상관의 히스토그램으로 이미지가 얼마나 가까운 지 판단 할 수 있습니다. 푸리에 계수의 절대 값에서 유클리드 거리를 사용할 수도 있습니다.

Sift Discriptor를 비교하려면 Euclidean 거리 외에도 "확산 거리"를 사용할 수도 있습니다. 서술자를 점차 거친 규모로 가져 와서 원래 디스크립터와 연결하십시오. 그렇게하면 "대규모"기능 유사성은 더 많은 무게를 가질 것입니다.

이미지간에 일치하려면 vl_ubcmatch를 사용해야합니다 (사용하지 않은 경우). 출력 '점수'를 해석하여 기능이 얼마나 가까운 지 확인할 수 있습니다. 이것은 두 일치하는 기능 디스크립터 사이의 유클리드 거리의 제곱을 나타냅니다. 또한 Best Match와 INPUT의 두 번째 Best Match 간의 임계 값을 변경할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top