OpenCV Review 09

2400·2025년 3월 22일
post-thumbnail

SIFT 알고리즘 정리

SIFT(Scale-Invariant Feature Transform)

SIFT는 컴퓨터 비전 분야에서 이미지 내 특징점을 검출하고 기술하는 알고리즘이다. 2004년 David Lowe가 제안한 이 알고리즘은 이미지의 스케일(크기), 회전, 밝기 변화에 강인한 특성으로 사용된다.

검출 단계

  1. 스케일 공간 생성: 가우시안 필터로 블러링된 이미지를 여러 스케일로 생성
  2. DoG(Difference of Gaussian) 계산: 인접한 스케일 간 차이 이미지를 계산
  3. 극값 검출: DoG 이미지에서 지역적 극값(local extrema) 검출
  4. 키포인트 정제: 낮은 대비 지점과 엣지 응답 제거
  5. 방향 할당: 각 키포인트에 주 방향 할당으로 회전 불변성 확보

SIFT 기술자

  • 키포인트 주변 영역을 16x16 영역으로 나누고, 이를 다시 4x4 하위 영역으로 분할
  • 각 하위 영역에서 그래디언트 크기와 방향을 8방향 히스토그램으로 표현
  • 총 128개(4x4x8) 차원의 특징 벡터 생성
  • 조명 변화에 강인하도록 정규화

SIFT 검출과 기술자 추출 코드 설명

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의 주요 장점

  • 스케일, 회전, 시점, 조명 변화에 강인함
  • 부분적 가려짐(occlusion)에도 어느 정도 강인함
  • 구별력 있는 특징 기술자로 정확한 매칭 가능

활용 분야

  • 이미지 매칭 및 인식
  • 파노라마 이미지 스티칭
  • 객체 인식 및 추적
  • 3D 재구성
  • 증강현실(AR)
  • SLAM(Simultaneous Localization and Mapping)

SIFT는 계산 비용이 높다는 단점이 있어 실시간 처리가 필요한 경우에는 SURF, ORB 등의 경량 알고리즘이 대안으로 사용되기도 한다.

profile
시즌 2의 공부기록 - Artificial Intelligence & AeroSpace

0개의 댓글