Hamming distance
- 해밍 거리는 '두 개의 같은 길이의 이진 벡터'사이에서 서로 다른 bit의 개수를 의미한다.
- ex)
- A = 101 1101
B = 100 1001
==> hamming distance is 2
BRIEF ( 그냥 fast는 좌표로 결과를 보여준다면, 이거는 얻은 좌표를 이진 벡터로 변환해서 보여주는거 차이임 )
- 이미지의 특징점을 describe하는데 사용하는 알고리즘이다.
이는 SIFT (Scale-Invariant Feature Transform) 나 SURF (Speeded-Up Robust Features) 와 같은 기존 서술자(descriptor)에 비해서 매우 빠르고 계산량이 적음이 특징
- 특징점(feature point)을 빠르게 이진 벡터(binary vector)로 변환하여 비교 연산을 단순화하고, 효율적인 매칭을 가능하게 한다.
- 핵심 개념
- 기본적으로 patch기반의 binary descriptor이다. 즉, 특정한 특징점을 중심으로 작은 이미지 패치를 추출하고, 해당 패치 내부에서 픽셀간의 강도intensity를 비교수행하여 이진 벡터를 생성한다.
- 이진벡터는 0과 1로 구성되며, 이를 통해 hamming distance를 이용한 빠른 매칭이 가능.
- 장점
- XOR연산을 사용하기때문에 빠르다. 그리고 이로 인해서 적은 메모리를 사용한다.
- 단점
- 픽셀 비교 방식이 절대 좌표 기반이니, 이미지가 회전하면 성능이 크게 저하됨
- 스케일 변화에 약하다.
- 단순 픽셀 강도 비교이니, 이미지에 noise가 많으면 서술자가 불안정해질수있음
- 동작과정 ( 크게 4개로 나눈다. )
- 1. Keypoint Detection
- 2. Patch Extraction
- 각 keypoint에서 정해진 크기의 이미지 패치(typically 31x31)를 추출한다. 이 patch는 이후에 BRIEF 서술사 생성에 사용된다.
- 3. Binary Descriptor Computation
- 주어진 patch내에서 N개의 픽셀쌍을 무작위로 샘플링한다. ( 보통 N=128,256,512)
- 각 픽셀 쌍에 대한 intensity 비교를 수행한다.
위의 과정을 거치면, 길이가 N인 이진 벡터가 생성됨
- 4. Feature Matching
- 3번의 결과로 2개의 이미지간의 keypoint를 비교할때 Hamming Distance를 사용하여 빠르게 매칭이 가능하다.
def detect_fast_brief_features( image_path , threshold=50 , nonmax_suppression=True ):
image = cv2.imread( image_path )
gray = cv2.cvtColor( image , cv2.COLOR_BGR2GRAY )
fast = cv2.FastFeatureDetector_create( threshold=threshold , nonmaxSuppression=nonmax_suppression )
keypoints = fast.detect( gray , None )
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
keypoints , descriptors = brief.compute( gray , keypoints )
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None, color=(0, 255, 0))
plt.figure(figsize=(15, 15))
plt.imshow(cv2.cvtColor(image_with_keypoints, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.title(f"FAST + BRIEF Keypoints (Threshold={threshold}, Nonmax Suppression={nonmax_suppression})")
plt.show()
return keypoints, descriptors
detect_fast_brief_features("chess.jpg", threshold=50, nonmax_suppression=True)