scale space이미지들. 출처: Computer Vision for Busy Developers ❘ by Vinny DaSilva ❘ Medium하나의 이미지를 여러 스케일로 보고 이를 쌓는다.(가우시안 블러링 적용 ) 출처: Computer Vision for Busy Developers ❘ by Vinny DaSilva ❘ Medium
스케일 공간 scale-space
영상처리시에 오직 하나의 스케일의 이미지가 아니라, 여러 스케일로 본 이미지들을 가지고 작업하는 경우가 많다. 이때 여러 스케일의 이미지들을 모아 둔 것을 scale-space라고 한다.
scale-space를 하는 방법에는 image-pyramid , gaussian blurring등이 존재
가우시안 블러의 sigma값에 따른 이미지. 출처: Computer Vision for Busy Developers ❘ by Vinny DaSilva ❘ Medium출처: Difference of Gaussian is obtained as the difference of Gaussian... ❘ Download Scientific Diagram
DoG ( differenece of Gaussian )
이미지에서 edge를 감지하거나 특징을 추출하기 위해 사용하는 간단하고 효과적인 방법
두개의 다른 스케일에서 Gaussian 필터를 적용한 이미지를 빼서 edge를 강조함
특징점 기술 descriptor
단순히 이미지위에 특징점을 그리는 것이 아니라, 각 특징점 주변의 패턴과 데이터를 수치화해서 고유한 벡터descriptor로 표현하는 과정이다. 이는 나중에 특징점을 비교하거나 매칭하는데 사용한다.
keypoints 특징점이란?
이미지 내에서 눈에 띄는 지점의 좌표,크기,방향등을 나타내는 정보이다
특징점 기술은 각 keypoint주변의 픽셀 강도 값(기울기 방향값)을 수치적으로 표현한 벡터
decsriptor는 이미지를 비교하거나 매칭을 하기 위한 고유한 서명 역할을 한다.
SIFT
이미지의 특징점을 추출하고 기술하는데 사용되는 알고리즘이다.
크기조정, 회전 , 조명 변화 등 다양한 이미지 변환에 강건한 특징점을 제공해서 객체인식,SLAM, 이미지 매칭 등 다양한 분야에서 사용
특징
불편성
스케일,회전,조명 변화등 약간의 변형에도 강건하다.
효율성
이미지의 고유한 특징을 잡아내어서, 다른 이미지와 구별할 수 있다.
고유성
대규모 데이터셋에서도 비교적 효율적으로 특징점을 추출하는 것이 가능하다.
단점
높은 계산비용
극단적 조명 변화에는 취약
단점을 개산하여 개선된 알고리즘에는 SURF , ORB , KAZE등이 존재
알고리즘 단계
1. 스케일 공간 생성
1-1. 이미지 내에서 다양한 크기의 특징점을 탐지하기 위해서 스케일 공간을 생성한다.
1-2. 이를 위해서 가우시안 블러를 반복적으로 적용하며 이미지를 부드럽게 만들고, 블러링 된 이미지 간의 차이(DOG , differnece of Gaussian)를 계산함.
1-3. DOG를 통하여 극대값과 극소값을 찾고 이들을 잠재적 특징점으로 식별
만약, 스케일 공간이 8개 레이어로 구성되어 있다면, DoG 이미지는 해당 레이어에서 7개가 생성.
2. 특징점 검출 ( 그림 1 참고 )
DoG에서 추출한 극대/극소값을 후보로 삼아서 위치와 스케일을 정확히 계산함. 만약에 극값이 안정적이지 않으면(가장자리 영역 or 노이즈에 민감한 특징점) 이를 제거함.
아래 그림1처럼, target point 주변의 26개의 pixel값과 target 지점의 pixel값을 비교한다. 만약에 target의 pixel값이 가장 크거나 작은 경우에 특징점으로 판단한다.
3. 특징점 방향 할당.
각 특징점 주변의 기울기 방향을 계산해서 주된 방향을 설정함.
위의 단계는 특징점이 회전에 대해서 불변성을 가지게 해준다.
4. 특징점 기술 ( descripor 생성 )
특징점 주변 픽셀의 기울기 및 방향 정보를 기반으로 128차원의 특징 벡터를 생성함.
위의 생성한 벡터는 특징점의 고유한 서명을 제공하며, 이미지 매칭 과정에서 사용됨
즉, Difference of Gaussian (DoG)를 기반으로 특징점(키포인트)을 검출하고, 검출된 특징점을 중심으로 방향 및 주변 정보를 분석하여 Descriptor(기술자)를 생성하는 것
5. 매칭
두 이미지에서 추출한 SIFT 특징점 벡터를 비교해서 유사도를 측정함.
주로 유클리디안 거리 or knn을 사용한다.
매칭을 왜???
만약에 이미지를 매칭한다하면, 두개의 이미지에서 동일한 객체나 장면을 찾기 위해서
ex) 한 이미지에서 다른 각도나 위치에서 찍은 이미지를 비교하고 일치하는 부분을 찾음
추적 : 비디오에서 특정 물체나 사람을 추적할 때, 특정 프레임에서 검출된 특징점들을 다른 프레임에서 추적하여 물체의 이동을 파악
로봇비전: 로봇이 주변환경을 인식하고, 장애물을 피하거나 경로를 찾을때 보다 정확하게 작업을 수행할 수 있게 도와주기 때문
장애물 감지 및 회피
경로 추적 및 네비게이션
그림1. 특징점 검출
import cv2
# 1. 이미지를 읽고 그레이스케일로 변환
img = cv2.imread( 'image.jpg' )
gray = cv2.cvtColor( img , cv2.COLOR_BGR2GRAY )
# 2. sift 검출기 초기화
# sift객체를 만들고, contrast 및 edge 감도를 설정
sift = cv2.SIFT_create()
sift.setContrastThreshold( 0.25 ) # 특징점 검출 시 constrast대비 임계값 설정
sift.setEdgeThreshold( 5 ) # edge 임계값 설정
# 3. 특징점 검출 및 디스크럽터 계산
# detectAndCompute()는 이미지에서 특징점 keypoints를 찾고 해당 descriptor를 계산한다.
keypoints , descriptor = sift.detectAndCompute( img , None ) # 이미지에서 keypoints와 descripot를 계산, none은 마스크가 없음을 의미.
# 특징점 정보 출력
for x in keypoints:
print( "({:.2f},{:.2f}) = size {:.2f} angle {:.2f}".format(x.pt[0], x.pt[1], x.size, x.angle) )
# 4. 특징점을 이미지에 그림
# drawKeypoints는 원본 이미지에 검출된 특징점을 시각적으로 표시함.
# None은 출력 이미지이다.
img_kp = cv2.drawKeypoints( gray , keypoints , None , flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS )
# 출력 이미지 크기 조정
new_width, new_height = 1200, 900 # 원하는 출력 크기 (너비, 높이)
resized_img = cv2.resize(img_kp, (new_width, new_height)) # 이미지 크기 조정
# 조정된 크기의 이미지를 출력
cv2.imshow("Keypoints (Resized)", resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()