【火爐煉AI】機器學習049-提取影像的SIFT特徵點

煉丹老頑童發表於2019-03-04

【火爐煉AI】機器學習049-提取影像的SIFT特徵點

(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

影像中的特徵點,就是某一幅影像區別於其他影像的關鍵點位,在進行這些關鍵點位的檢測時,我們要考慮幾個問題,即1,不管怎麼旋轉目標,要保持目標的特徵點不變(即旋轉不變性),2,不管這個目標是變大還是變小,其特徵點也要保持不變(即尺度不變性),還有比如要求光照不變性等等。

目前對於特徵點位的描述有很多種方法和運算元,常見的有SIFT特徵描述運算元、SURF特徵描述運算元、ORB特徵描述運算元、HOG特徵描述、LBP特徵描述以及Harr特徵描述。關於這幾種運算元和特徵描述的區別,可以參考博文:影像特徵檢測描述(一):SIFT、SURF、ORB、HOG、LBP特徵的原理概述及OpenCV程式碼實現

SIFT特徵點,即尺度不變特徵變換(Scale-invariant feature transform,SIFT),是用於影像處理領域的一種描述。SIFT特徵點在影像處理和計算機視覺領域有著很重要的作用。

SIFT特徵點具有很多優點:

1.SIFT特徵是影像的區域性特徵,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;

2.區分性好,資訊量豐富,適用於在海量特徵資料庫中進行快速、準確的匹配;

3.多量性,即使少數的幾個物體也可以產生大量的SIFT特徵向量;

4.高速性,經優化的SIFT匹配演算法甚至可以達到實時的要求;

5.可擴充套件性,可以很方便的與其他形式的特徵向量進行聯合。

對SIFT特徵點的提取主要包括以下四個步驟:

1.尺度空間極值檢測:搜尋所有尺度上的影像位置。通過高斯微分函式來識別潛在的對於尺度和旋轉不變的興趣點。

2.關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據於它們的穩定程度。

3.方向確定:基於影像區域性的梯度方向,分配給每個關鍵點位置一個或多個方向。所有後面的對影像資料的操作都相對於關鍵點的方向、尺度和位置進行變換,從而提供對於這些變換的不變性。

4.關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量影像區域性的梯度。這些梯度被變換成一種表示,這種表示允許比較大的區域性形狀的變形和光照變化。

關於SIFT的數學推導和具體含義,可以參考這篇博文:SIFT特徵詳解

1. 提取SIFT特徵點

1.1 安裝opencv-contrib-python模組

一般我們使用的是opencv-python模組,但是這個模組中沒有xfeatures2d這個方法,因為SIFT演算法已經被申請專利,故而從opencv-python中剔除了。

關於這個模組的安裝,網上有很多個版本,我也踩了好幾個坑,最後發現下面的方法是可用的,先解除安裝原先的opencv-python模組(如果原先的opencv-python模組的版本號是3.4.2.16,則不需要解除安裝)。然後安裝3.4.2.16這個版本的opencv-python和 opencv-contrib-python即可。

安裝方法:

pip install opencv-python==3.4.2.16

pip install opencv-contrib-python==3.4.2.16

1.2 提取SIFT特徵點

首先構建SIFT特徵點檢測器物件,然後用這個檢測器物件來檢測灰度圖中的特徵點

sift = cv2.xfeatures2d.SIFT_create() # 構建SIFT特徵點檢測器物件
keypoints = sift.detect(gray, None) # 用SIFT特徵點檢測器物件檢測灰度圖中的特徵點
複製程式碼
# 將keypoints繪製到原圖中
img_sift = np.copy(img)
cv2.drawKeypoints(img, keypoints, img_sift, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 顯示繪製有特徵點的影像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title(`Raw Img`)

plt.subplot(122)
img_sift_rgb=cv2.cvtColor(img_sift,cv2.COLOR_BGR2RGB)
plt.imshow(img_sift_rgb)
plt.title(`Img with SIFT features`)
複製程式碼
【火爐煉AI】機器學習049-提取影像的SIFT特徵點

########################小**********結###############################

1, SIFT特徵點的提取只需要使用cv2.xfeatures2d.SIFT_create().detect()函式即可,但是要事先安裝opencv-contrib-python模組。

#################################################################

注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章