Python과 OpenCV – 33 : SIFT(Scale-Invariant Feature Transform)을 이용한 이미지의 특징점 추출

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html 입니다.

이전 글에서는 이미지의 특징점을 Corner로 간주하였습니다. 이미지를 회전해도 귀퉁이(Corner)은 여전이 귀퉁이입니다. 그러나 만약 이미지의 크기를 늘렸을때는 어떨까요? 아래의 그림을 보면..

왼쪽의 이미지에서 초록색 사각형 안의 형상은 Corner입니다. 그러니 이 이미지를 확대하고 동일한 크기의 초록색 사각형 안의 형상은 더 이상 Corner라고 보기 어렵습니다. 즉, 이전 장에서 살펴본 이미지의 특징점으로써 Corner를 대상으로 했던 방법은 이미지의 확대에서 적용하기 어렵습니다. 이처럼 이미지의 회전뿐만 아니라 이미지의 크기가 변경될때에도 이미지의 특징점을 추출해 낼 수 있는 방법이 바로 SIFT 입니다.

SIFT는 다음처럼 총 4 단계의 절차를 통해 이미지의 특징점을 추출하고 추출한 특징점을 통해 매칭을 수행 합니다.

OpenCV는 SIFT를 구현하여 바로 활용할 수 있도록 함수를 제공하는데, 아래의 예제를 살펴보면..

import cv2
import numpy as np

filename = './data/home.jpg'
img = cv2.imread(filename)
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

위의 결과는 다음과 같습니다.

상당이 많은 특징점이 추출되었는데, 추출한 특징점은 11번의 코드에서 cv2.drawKeypoints 함수를 통해 그릴 수 있습니다. 그려진 특징점 각각에는 특징점의 위치, 특징점의 영향 범위에 대한 반경, 그리고 회전시 특징점을 식별할 수 있는 각도값으로써의 특징점 방향을 알 수 있습니다.

특징점으로써의 keypoint를 추출했다면, 이제 이 keypoint를 가지고 각 keypoint의 식별자(Descriptor)를 계산합니다. 2가지 방식이 있는데.. 먼저 앞의 예제처럼 먼저 키포인트를 얻고 난뒤, 이 키포인트를 가지고 식별자를 계산하는 sift.coomput() 함수를 사용하는 방법, 예를 들어 kp, des = sift.compute(gray, kp) 와 같이 실행할 수 있습니다. 그리고 앞선 예제처럼 keypoint를 먼저 추출하지 않고 keypoint의 계산과 동시에 기술자도 함께 계산할 수 있는 sift.detectAndConput() 함수가 있는데, 아래의 예처럼 함수를 호출할 수 있습니다.

sift = cv2.SIFT()
kp, des = sift.detectAndCompute(gray,None)

키포인트와 식별자를 얻었다면, 이 키포인트와 식별자를 조합하여 특징점을 사용하여 서로 다른 이미지 사이의 동일한 위치를 식별할 수 있습니다. 이는 다른 글에서 살펴 보겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다