OpenCV

[OpenCV] 이미지 처리 (Feature Extraction)

괜찮나요닝겐 2024. 8. 18. 13:36
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 디스크립터를 결합한 방법으로, 빠르고 괜찮은 성능을 가지고 있다.

  1. 키포인트 검출: FAST 알고리즘을 사용하여 이미지에서 키포인트를 검출.
  2. 방향 할당: 각 키포인트에 대해 방향을 계산하여 회전 불변성을 제공.
  3. 디스크립터 생성: 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