728x90
반응형
1. SIFT (Scale-Invariant Feature Transform)
SIFT는 이미지에서 스케일 및 회전에 불변한 특징을 추출하는 데 사용된다. 주로 객체 인식, 매칭, 추적 등에 활용.
import cv2
# 이미지 불러오기
image = cv2.imread('/my_dir/image.jpg', cv2.IMREAD_GRAYSCALE)
# SIFT 객체 생성
sift = cv2.SIFT_create()
# 키포인트와 디스크립터 추출
keypoints, descriptors = sift.detectAndCompute(image, None)
# 결과를 이미지에 그리기
img_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 결과 출력
cv2.imwrite('/my_dir/shift_img.jpg',img_with_keypoints)
cv2.imshow('SIFT Keypoints', img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. ORB (Oriented FAST and Rotated BRIEF)
ORB는 FAST 키포인트 검출기와 BRIEF 디스크립터를 결합한 방법으로, 빠르고 괜찮은 성능을 가지고 있다.
- 키포인트 검출: FAST 알고리즘을 사용하여 이미지에서 키포인트를 검출.
- 방향 할당: 각 키포인트에 대해 방향을 계산하여 회전 불변성을 제공.
- 디스크립터 생성: BRIEF를 사용하여 각 키포인트의 디스크립터를 생성합니다. 방향 정보를 반영하여 디스크립터를 회전시킨다.
import cv2
# 이미지 불러오기
image = cv2.imread('/my_dir/image.jpg', cv2.IMREAD_GRAYSCALE)
# ORB 객체 생성
orb = cv2.ORB_create()
# 키포인트와 디스크립터 추출
keypoints, descriptors = orb.detectAndCompute(image, None)
# 결과를 이미지에 그리기
img_with_keypoints = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0))
# 결과 출력
cv2.imwrite('/my_dir/orb_img.jpg',img_with_keypoints)
cv2.imshow('ORB Keypoints', img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. AKAZE (Accelerated KAZE)
AKAZE는 KAZE의 가속화된 버전으로, 비선형 스케일 공간에서 특징을 추출하며 다양한 스케일과 회전에서 강력한 특징을 제공한다.
import cv2
# 이미지 불러오기
image = cv2.imread('/my_dir/image.jpg', cv2.IMREAD_GRAYSCALE)
# AKAZE 객체 생성
akaze = cv2.AKAZE_create()
# 키포인트와 디스크립터 추출
keypoints, descriptors = akaze.detectAndCompute(image, None)
# 결과를 이미지에 그리기
img_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 결과 출력
cv2.imwrite('/my_dir/akaze_img.jpg',img_with_keypoints)
cv2.imshow('AKAZE Keypoints', img_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. HOG (Histogram of Oriented Gradients)
HOG는 객체 검출에서 많이 사용되는 방법으로, 이미지의 방향성 있는 그라디언트 정보를 기반으로 특징을 추출한다.
import cv2
import numpy as np
# 이미지 로드
image = cv2.imread('/my_dir/image.jpg', cv2.IMREAD_GRAYSCALE)
# HOG Descriptor 객체 생성
hog_custom = cv2.HOGDescriptor(
winSize=(64, 128),
blockSize=(16, 16),
blockStride=(8, 8),
cellSize=(8, 8),
nbins=9
)
# HOG 특징 추출
hog_features_custom = hog_custom.compute(image)
# 특징 시각화 함수
def visualize_hog_features(features, image_shape, cell_size=(8, 8)):
hog_image = np.zeros(image_shape, dtype=np.float32)
cell_size_x, cell_size_y = cell_size
cells_per_row = image_shape[1] // cell_size_x
cells_per_col = image_shape[0] // cell_size_y
idx = 0
for y in range(cells_per_col):
for x in range(cells_per_row):
if idx >= features.shape[0]:
break
# 위치와 크기 계산
x0 = x * cell_size_x
y0 = y * cell_size_y
x1 = x0 + cell_size_x
y1 = y0 + cell_size_y
# HOG 이미지를 업데이트
hog_image[y0:y1, x0:x1] = features[idx]
idx += 1
# HOG 이미지 정규화
hog_image = cv2.normalize(hog_image, None, 0, 255, cv2.NORM_MINMAX)
return hog_image.astype(np.uint8)
# 시각화
hog_image = visualize_hog_features(hog_features_custom, image.shape)
# 결과를 파일로 저장 & 보여주기
cv2.imwrite('/my_dir/hog_img.jpg', hog_image)
cv2.imshow('HOG Features Visualization', hog_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
오늘은 여기까지
728x90
반응형
'OpenCV' 카테고리의 다른 글
[OpenCV] 이미지 처리 (concat) (0) | 2024.08.18 |
---|---|
[OpenCV] 이미지 처리 (색상변환) (0) | 2024.08.18 |
[OpenCV] 이미지 처리 (GrabCut) (0) | 2024.08.18 |
[OpenCV] 이미지 처리 (Canny) (0) | 2024.08.18 |
[OpenCV] 이미지 처리 (Laplacian) (0) | 2024.08.18 |