SIFT는 컴퓨터 비전 분야에서 이미지 내 특징점을 검출하고 기술하는 알고리즘이다. 2004년 David Lowe가 제안한 이 알고리즘은 이미지의 스케일(크기), 회전, 밝기 변화에 강인한 특성으로 사용된다.
import cv2 as cv
img = cv.imread('./.data/frieren.png') # 이미지 로드
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) # 그레이스케일 변환(SIFT는 그레이스케일 이미지에서 동작)
sift = cv.SIFT_create() # SIFT 객체 생성
kp, des = sift.detectAndCompute(gray,None) # 키포인트 검출과 기술자 계산
# kp: 키포인트 정보(위치, 크기, 방향 등)
# des: 기술자(각 키포인트마다 128차원 벡터)
gray = cv.drawKeypoints(gray,kp,None,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # 키포인트 시각화
# DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: 원의 크기는 키포인트 스케일, 선은 방향을 표시
cv.imshow('sift',gray) # 결과 표시
k = cv.waitKey() # 키 입력 대기
cv.destroyAllWindows() # 창 닫기
SIFT는 계산 비용이 높다는 단점이 있어 실시간 처리가 필요한 경우에는 SURF, ORB 등의 경량 알고리즘이 대안으로 사용되기도 한다.