본문 바로가기

CyberSecurity

Computer Vision_ FAST, BRIEF, ORB

안녕하세요!

오늘은 이미지에서 특이점을 추출하는 computer vision 기술인 FAST (Features from Accelerated Segment Test), BRIEF (Binary Robust Independent Elementary Features), ORB (Oriented FAST and Rotated BRIEF)를 이용하여 이미지에서 특이점을 추출하는 방법을 소개드리겠습니다.

 

 

FAST, BRIEF, ORB 모두 이용방법은 같아서 ORB를 예시로 보여드릴게요!

import os
import cv2
import matplotlib.pyplot as plt
import numpy as np
import pickle

먼저 필요한 모듈을 import 시켜줍니다. FAST, BRIEF, ORB 모두 cv2 모듈을 통해 간단하게 사용이 가능합니다.

file_path='path_to_image'
image=cv2.imread(file_path)

특이점을 추출할 이미지의 위치를 입력하여 읽어옵니다. 저는 고양이 사진을 이용했습니다.

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

FAST, BRIEF, ORB는 흑백이미지를 받아 처리하기 때문에, 가져온 이미지를 흑백으로 바꿔줍니다.

orb = cv2.ORB_create()
fast = cv2.FastFeatureDetector_create()
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()

cv2 모듈을 통해 간단히 ORB를 만들어줄 수 있습니다.

FAST나 BRIEF 모듈을 사용하시려면 여기서 모듈 종류를 선택해주시면 됩니다!

keypoints, descriptor = orb.detectAndCompute(image_gray, None)
#keypoints= fast.detect(image_gray,None)
#keypoints, descriptor = brief.compute(image_gray, keypoints)

이미지에 대해 ORB를 적용시키면, keypoints와 descriptor를 뽑아낼 수 있어요!

여기서 keypoints는 cv2.KeyPoint class로 이루어진 list입니다.

cv2.KeyPoint는 특이점 위치를 저장하는 pt, 특이점 길이를 저장하는 size 등 다양한 정보들로 이루어져 있습니다.

자세히 알고 싶으면 https://physics.nyu.edu/grierlab/manuals/opencv/classcv_1_1KeyPoint.html 이 사이트를 참고하는 것 추천드려요!

keypoints_without_size = np.copy(image)
keypoints_with_size = np.copy(image)
cv2.drawKeypoints(image, keypoints, keypoints_without_size, color = (0, 255, 0))
cv2.drawKeypoints(image, keypoints, keypoints_with_size, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

keypoint를 이미지에 적용하여 살펴보기 위해서 cv2.drawkeypoints 모듈을 이용하여 기존 이미지에 keypoint를 그려줍니다.

위치만을 표시할 keypoint_without_size와 위치, 크기, 각도 등을 같이 나타낼 keypoints_with_size 두 개의 이미지를 준비했습니다.

fx, plots = plt.subplots(1, 2, figsize=(20,10))

plots[0].set_title("With non max suppression")
plots[0].imshow(keypoints_without_size)

plots[1].set_title("Without non max suppression")
plots[1].imshow(keypoints_with_size)

plots 모듈을 통해 이미지를 그려줍니다.

이렇게 결과가 나왔어요!

FAST의 경우 더 많은 특이점을 포함하네요.

FAST의 결과를 이용한 BRIEF의 결과입니다.

 

전체적으로 특이점 추출을 잘하는 것 볼 수 있습니다.

원하는 결과에 따라 좋은 알고리즘을 선택해서 사용하시면 될 것 같아요!

 

더 궁금한 점 있으시면 댓글달아주시면, 최대한 답변드리겠습니다.

긴 글 읽어주셔서 감사합니다 :)

'CyberSecurity' 카테고리의 다른 글

Audio Steganography (Watermark) 오디오 워터마크  (0) 2023.05.10
Audio watermark using LSB  (0) 2023.04.14
Watermarking DNN  (1) 2022.03.08