天天看點

特征提取算法與圖像描述符[ORB]ORB特征算法

ORB特征算法

ORB算法綜合了FAST角點檢測算法和BRIEFF描述符。

FAST特征檢測

  1. 算法原理
  2. opencv官方文檔

FAST隻是一種特征點檢測算法,并不涉及特征點的特征描述。

fast = cv2.FastFeatureDetector_create(threshold=10)
           
img = cv2.imread("laugh.jpg", 0)
fast = cv2.FastFeatureDetector_create()
keypoints = fast.detect(img, None)
img = cv2.drawKeypoints(img, keypoints, None, (0, 0, 255))
           
特征提取算法與圖像描述符[ORB]ORB特征算法

FAST - threshold100效果圖

特征提取算法與圖像描述符[ORB]ORB特征算法

FAST - 預設threshold(10)效果圖

BRIEF特征描述符

  1. 論文
  2. opencv官方文檔
  3. 中文版

Brief是Binary Robust Independent Elementary Features的縮寫。這個特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征點附近随機選取若幹點對,将這些點對的灰階值的大小,組合成一個二進制串,并将這個二進制串作為該特征點的特征描述子。文章同樣提到,在此之前,需要選取合适的gaussian kernel對圖像做平滑處理。

缺點

1:不具備旋轉不變性。

2:對噪聲敏感

3:不具備尺度不變性。

img = cv2.imread("laugh.jpg", 0)
# Initiate FAST detector
star = cv2.xfeatures2d.StarDetector_create()
# Initiate BRIEF extractor
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
# find the keypoints with STAR
kp = star.detect(img, None)
# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)
print(brief.descriptorSize())
print(des.shape)

           

ORB

  1. ORB論文
  2. OpenCV官方文檔

ORB采用了FAST作為特征點檢測算子,特征點的主方向是通過矩(moment)計算而來解決了BRIEF不具備旋轉不變性的問題。

ORB還做了這樣的改進,不再使用pixel-pair,而是使用9×9的patch-pair,也就是說,對比patch的像素值之和,解決了BRIEF對噪聲敏感的問題。

關于計算速度:

ORB是sift的100倍,是surf的10倍。

import cv2

img = cv2.imread("A.jpg", 0)
orb = cv2.ORB_create()
kp, des = orb.detectAndCompute(img, None)
           
特征提取算法與圖像描述符[ORB]ORB特征算法

ORB效果

繼續閱讀