programing

SIFT 알고리즘을 사용하여 두 이미지가 얼마나 유사한 지 계산하는 방법은 무엇입니까?

projobs 2021. 1. 16. 09:13
반응형

SIFT 알고리즘을 사용하여 두 이미지가 얼마나 유사한 지 계산하는 방법은 무엇입니까?


나는 Andrea VedaldiSIFT 구현을 사용하여 두 개의 유사한 이미지의 선별 설명자를 계산했습니다 (두 번째 이미지는 실제로 다른 각도에서 동일한 개체의 확대 된 그림입니다).

이제 설명자를 비교하여 이미지가 얼마나 유사한 지 알 수 없습니다 .

이 질문은 당신이 전에 이런 종류의 것들을 실제로 해본 적이 없다면 대답 할 수 없다는 것을 알고 있지만, 전에 이것을 해본 사람이 이것을 알고있을 것이라고 생각 했기 때문에 질문을 게시했습니다.

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

>> 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에 포인트 P가 있고 F2에서 "가장 좋은"일치 항목을 찾고 싶다고 가정합니다. 이를 수행하는 한 가지 방법은 F1의 P 설명자를 D2의 모든 설명자와 비교하는 것입니다. 비교하면 유클리드 거리 (또는 두 설명 자의 차이에 대한 L2- 노름)를 찾습니다.

그런 다음 F2에서 두 점, 즉 P에서 각각 가장 낮은 거리와 두 번째로 낮은 거리 (예 : Du 및 Dv)를 갖는 U & V를 찾습니다.

Lowe가 권장하는 것은 다음과 같습니다. Dv / Du> = 임계 값 (샘플 코드에서 1.5 사용)이면이 일치가 허용됩니다. 그렇지 않으면 모호하게 일치되고 서신으로 거부되며 F2에서 P까지의 어떤 지점도 일치시키지 않습니다. 기본적으로 최고와 2 등 일치 사이에 큰 차이가있는 경우 품질이 일치 할 것으로 예상 할 수 있습니다.

이것은 이미지에서 모호한 일치에 대한 많은 범위가 있기 때문에 중요합니다. 호수 또는 여러 개의 창이있는 건물에서 일치하는 지점을 상상해보세요. 설명자는 매우 비슷해 보일 수 있지만 일치는 분명히 잘못되었습니다.

여러 가지 방법으로 매칭을 할 수 있습니다. .. MATLAB을 사용하여 매우 쉽게 할 수 있으며, OpenCV 에서 구현 된 FLANN 과 같은 KD- 트리 또는 대략적인 근사값 검색을 사용하여 속도를 높일 수 있습니다 .

편집 : 또한 MATLAB 에는 여러 kd-tree 구현이 있습니다.


정확히 어떻게해야하는지 설명하는 David Lowe의 논문을 읽어야 합니다. 똑같은 물체의 이미지를 비교하려면 충분합니다. 같은 카테고리 (예 : 자동차 또는 비행기)의 서로 다른 물체의 이미지를 일치 시키려면 Grauman과 Darrell Pyramid Match Kernel 을 살펴볼 수 있습니다 .


Try to compare each descriptor from the first image with descriptors from the second one situated in a close vicinity (using the Euclidean distance). Thus, you assign a score to each descriptor from the first image based on the degree of similarity between it and the most similar neighbor descriptor from the second image. A statistical measure (sum, mean, dispersion, mean error, etc) of all these scores gives you an estimate of how similar the images are. Experiment with different combinations of vicinity size and statistical measure to give you the best answer.


If you want just compare zoomed and rotated image with known center of rotation you can use phase correlation in log-polar coordinates. By sharpness of peak and histogram of phase correlation you can judge how close images are. You can also use euclidean distance on absolute value of Fourier coefficients.

If you want compare SIFT descriptor, beside euclidean distance you can also use "diffuse distance" - getting descriptor on progressively more rough scale and concatenating them with original descriptor. That way "large scale" feature similarity would have more weight.


If you want to do matching between the images, you should use vl_ubcmatch (in case you have not used it). You can interpret the output 'scores' to see how close the features are. This represents the square of euclidean distance between the two matching feature descriptor. You can also vary the threshold between Best match and 2nd best match as input.

ReferenceURL : https://stackoverflow.com/questions/1500498/how-to-use-sift-algorithm-to-compute-how-similar-two-images-are

반응형