您好,登錄后才能下訂單哦!
這篇文章主要介紹python如何利用opencv實現SIFT特征提取與匹配,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、SIFT
1.1、sift的定義
SIFT,即尺度不變特征變換(Scale-invariant feature transform,SIFT),是用于圖像處理領域的一種描述。這種描述具有尺度不變性,可在圖像中檢測出關鍵點,是一種局部特征描述子。
1.2、sift算法介紹
SIFT由David Lowe在1999年提出,在2004年加以完善 。SIFT在數字圖像的特征描述方面當之無愧可稱之為最紅最火的一種,許多人對SIFT進行了改進,誕生了SIFT的一系列變種。SIFT已經申請了專利(所以現在opencv使用這個算法,需要低的版本)。
SIFT特征是基于物體上的一些局部外觀的興趣點而與影像的大小和旋轉無關。對于光線、噪聲、微視角改變的容忍度也相當高。基于這些特性,它們是高度顯著而且相對容易擷取,在母數龐大的特征數據庫中,很容易辨識物體而且鮮有誤認。使用SIFT特征描述對于部分物體遮蔽的偵測率也相當高,甚至只需要3個以上的SIFT物體特征就足以計算出位置與方位。在現今的電腦硬件速度下和小型的特征數據庫條件下,辨識速度可接近即時運算。SIFT特征的信息量大,適合在海量數據庫中快速準確匹配。
SIFT算法具有如下一些特點:
1)SIFT特征是圖像的局部特征,其對旋轉、尺度縮放、亮度變化保持不變性,對視角變化、仿射變換、噪聲也保持一定程度的穩定性;
2)區分性(Distinctiveness)好,信息量豐富,適用于在海量特征數據庫中進行快速、準確的匹配;
3)多量性,即使少數的幾個物體也可以產生大量的SIFT特征向量;
4)高速性,經優化的SIFT匹配算法甚至可以達到實時的要求;
5)可擴展性,可以很方便的與其他形式的特征向量進行聯合。
1.3、特征檢測
SIFT特征檢測主要包括以下4個基本步驟:
1)尺度空間極值檢測:搜索所有尺度上的圖像位置。通過高斯微分函數來識別潛在的對于尺度和旋轉不變的興趣點。
2)關鍵點定位:在每個候選的位置上,通過一個擬合精細的模型來確定位置和尺度。關鍵點的選擇依據于它們的穩定程度。
3)方向確定:基于圖像局部的梯度方向,分配給每個關鍵點位置一個或多個方向。所有后面的對圖像數據的操作都相對于關鍵點的方向、尺度和位置進行變換,從而提供對于這些變換的不變性。
4)關鍵點描述:在每個關鍵點周圍的鄰域內,在選定的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。
1.4、特征匹配
SIFT特征匹配主要包括2個階段:
第一階段:SIFT特征的生成,即從多幅圖像中提取對尺度縮放、旋轉、亮度變化無關的特征向量。
第二階段:SIFT特征向量的匹配。
SIFT特征的生成一般包括以下幾個步驟:
1)構建尺度空間,檢測極值點,獲得尺度不變性。
2)特征點過濾并進行精確定位。
3)為特征點分配方向值。
4)生成特征描述子。以特征點為中心取16×16的鄰域作為采樣窗口,將采樣點與特征點的相對方向通過高斯加權后歸入包含8個bin的方向直方圖,最后獲得4×4×8的128維特征描述子。當兩幅圖像的SIFT特征向量生成以后,下一步就可以采用關鍵點特征向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取圖1的某個關鍵點,通過遍歷找到圖像2中的距離最近的兩個關鍵點。在這兩個關鍵點中,如果最近距離除以次近距離小于某個閾值,則判定為一對匹配點。
2、python實現
2.1、準備工作
由于SIFT已經申請了專利,所以在高版本的opencv中,會出現錯誤,以前是opencv4.0.1,然后安裝版本為opencv3.4.2.16
卸載以前的版本(低版本,可以試試直接運行代碼):
pip uninstall opencv-python pip uninstall opencv-contrib-python
用命令行(CMD),采用pip方式:
pip install opencv_python==3.4.2.16 pip install opencv-contrib-python==3.4.2.16
2.2、代碼實現
#!/usr/bin/env python3 # -*- coding:utf-8 -*- u''' Created on 2019年6月14日 @author: wuluo ''' __author__ = 'wuluo' __version__ = '1.0.0' __company__ = u'重慶交大' __updated__ = '2019-06-14' from matplotlib import pyplot as plt from imagedt.decorator import time_cost import cv2 print('cv version: ', cv2.__version__) def bgr_rgb(img): (r, g, b) = cv2.split(img) return cv2.merge([b, g, r]) def orb_detect(image_a, image_b): # feature match orb = cv2.ORB_create() kp1, des1 = orb.detectAndCompute(image_a, None) kp2, des2 = orb.detectAndCompute(image_b, None) # create BFMatcher object bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Match descriptors. matches = bf.match(des1, des2) # Sort them in the order of their distance. matches = sorted(matches, key=lambda x: x.distance) # Draw first 10 matches. img3 = cv2.drawMatches(image_a, kp1, image_b, kp2, matches[:100], None, flags=2) return bgr_rgb(img3) @time_cost def sift_detect(img1, img2, detector='surf'): if detector.startswith('si'): print("sift detector......") sift = cv2.xfeatures2d.SURF_create() else: print("surf detector......") sift = cv2.xfeatures2d.SURF_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # BFMatcher with default params bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) # Apply ratio test good = [[m] for m, n in matches if m.distance < 0.5 * n.distance] # cv2.drawMatchesKnn expects list of lists as matches. img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2) return bgr_rgb(img3) if __name__ == "__main__": # load image image_a = cv2.imread('G:/2018and2019two/qianrushi/wuluo1.jpg')#絕對路徑 image_b = cv2.imread('G:/2018and2019two/qianrushi/wuluo2.jpg') # ORB # img = orb_detect(image_a, image_b) # SIFT or SURF img = sift_detect(image_a, image_b) plt.imshow(img) plt.show()
2.3、運行結果
采用同一張圖片:
兩張有重疊部分的代碼:
python的五大特點:1.簡單易學,開發程序時,專注的是解決問題,而不是搞明白語言本身。2.面向對象,與其他主要的語言如C++和Java相比, Python以一種非常強大又簡單的方式實現面向對象編程。3.可移植性,Python程序無需修改就可以在各種平臺上運行。4.解釋性,Python語言寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序。5.開源,Python是 FLOSS(自由/開放源碼軟件)之一。
以上是“python如何利用opencv實現SIFT特征提取與匹配”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。