두 이미지간의 특징점을 매칭하기위해서는 distance function을 정의해준 후, 가까운 것을 매칭해주면된다. 하지만, 가까운 것이 여러개 나올 수도 있고, 아래에 오른쪽 사진과 같이 동일한 형상이 반복될때는 잘못 매칭될 수 있다.
최종적으로 특징점을 찾아 매칭하는 목적은 image stiching을 해보기 위함이므로, 두 이미지간의 모든 특징점을 빠짐없이 찾을 필요는 없다. 확실한 것만 고르면 된다. 따라서 Nearest Neighbor search, Ratio Test, Bi-directional consistency test와 같은 방식을 사용해 아닐거 같은 것은 제거한다.


본 글에서는 두 사진의 특징점을 찾은 후, 어떻게 Feature Matching을 수행하는지 알아본다.


SIFT를 사용해 feature point 및 descriptor 구하기
Feature point를 선정하기 위해서는 총 세 가지 테스트를 통과해야합니다.
1. Distance threshold
2. Ratio threshold
3. bi-directional matching
Distance threshold
cv2.SIFT_create()를 사용해 SIFT객체를 생성하고, SIFT.detectAndCompute(image, mask=None)을 사용해 이미지의 Feature point와 descriptor를 구할 수 있습니다. 각 이미지의 Feature point와 descriptor를 구한 후, descriptor의 L2 Norm을 사용해 가장 가까운 feature point와 두 번째로 가까운 feature point를 찾습니다.
이때 Distance threshold를 정해 그 이상의 값을 가진 feature point는 무시합니다.
Ratio threshold
두 번째로 가까운 feature point까지 구하는 이유는 Nearest neighbor distance ratio (NNDR)을 사용하기 위함입니다. NNDR은 가장 가까운 feature point의 거리를 두 번째로 가까운 feature point의 거리로 나눕니다. 그리고 이 값이 미리 정해둔 Threshold보다 낮다면 해당 feature point는 사용하지 않습니다. 실제로 이 방법을 적용하면 이상한 매칭이 없어집니다.

bi-directional matching
왼쪽에서 오른쪽으로의 매칭과 오른쪽에서 왼쪽으로의 매칭이 같아야 올바른 feature point는 당연합니다. 그래서 이것까지 체크를 해서 다르다면 feature point에서 제외합니다.
결과
ratio threshold를 사용하지 않은 위 사진 같은 경우 중간에 사선과 같은 이상한 matching이 생김을 확인할 수 있습니다.


'Robot > Computer Vision' 카테고리의 다른 글
| [Computer vision] Table of contents (0) | 2025.10.10 |
|---|---|
| [컴퓨터비전] SIFT(Scale Invariant Feature Transform) 알고리즘 설명 및 구현 (0) | 2025.09.27 |