OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)
生活随笔
收集整理的這篇文章主要介紹了
OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV中的尺度不變特征變換(SIFT Scale-Invariant Feature Transform)
- 1. 效果圖
- 2. 原理
- 2.1 步驟
- 2.2 opencv實現方法
- 2.3 SIFT算法獲取
- 3. 源碼
- 參考
這篇博客將介紹尺度不變特征變換算法(SIFT Scale-Invariant Feature Transform),并學習如何使用SIFT來尋找關鍵點和描述符。
Scale-Invariant Feature Transform(SIFT 尺度不變特征變換)
- Harris角點檢測器具有旋轉不變性,然而圖像放大縮小,角點會發生變化。
- 尺度不變特征變換(SIFT)從尺度不變的關鍵點,提取關鍵點和計算其描述符。
1. 效果圖
原圖 VS SIFT關鍵點檢測效果圖如下:
原圖 VS SIFT帶方向效果圖如下:
如圖可見,右圖繪制了SIFT關鍵點大小的圓,并且帶方向;
2. 原理
2.1 步驟
SIFT算法主要包括四個步驟:
1)SIFT算法采用了高斯差分的近似對數。高斯差是由兩個不同的∑圖像的高斯模糊差得到的,設為∑和k∑。
2)關鍵點定位。一旦找到了潛在的關鍵點位置,就必須對其進行細化,以獲得更準確的結果。它消除了任何低對比度的關鍵點和邊緣關鍵點,剩下的是強烈的興趣點。
3)定向作業,為每個關鍵點指定一個方向,以實現對圖像旋轉的不變性。
4)關鍵點描述符,采取了一些措施來實現對光照變化、旋轉等的魯棒性。
5)關鍵點匹配,兩幅圖像之間的關鍵點通過識別它們的近鄰來匹配。它消除了大約90%的錯誤匹配,而只丟棄了5%的正確匹配。SIFT算法已獲得專利,因此包含在非免費模塊中;
2.2 opencv實現方法
- sift.detectAndCompute() 找到關鍵點;
- desc=sift.compute(gray,kp) 計算描述符;
- cv2.drawKeyPoints() 該函數在關鍵點的位置上繪制小圓圈
2.3 SIFT算法獲取
由于SIFT算法已獲得專利,因此包含在非免費模塊中。
也可以通過安裝以下倆個包獲取此算法;
opencv-contrib-python 4.5.1.48
opencv-python 4.1.2.30
3. 源碼
# SIFT(Scale Invariant Feature Transform)尺度不變特征(關鍵點檢測并繪制它們)import cv2
import imutils
import numpy as npimg = cv2.imread('zly.jpg')
img = imutils.resize(img, width=300)
origin = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 找到關鍵點并計算描述符,也可以用這倆方法:sift.detectAndCompute()找到關鍵點;des=sift.compute(gray,kp) 計算描述符
# 找到關鍵點并計算描述符
# kp是一個關鍵點列表,des是一個numpy數組
# kp, des = sift.detectAndCompute(gray,None)
sift = cv2.xfeatures2d.SIFT_create()
(kp, descs) = sift.detectAndCompute(gray, None)# cv2.drawKeyPoints()函數,該函數在關鍵點的位置上繪制小圓圈。
# 如果你傳遞了flag:cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,它會畫一個關鍵點大小的圓,甚至會顯示它的方向。
cv2.drawKeypoints(img, kp, img)
# 傳遞flag,繪制關鍵點大小的圓,并且顯示它的方向
# cv2.drawKeypoints(img, kp, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("origin VS sift_keypoints_res", np.hstack([origin, img]))
cv2.waitKey(0)cv2.imwrite('images/sift_keypoints.jpg', img)
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html#sift-intro
總結
以上是生活随笔為你收集整理的OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV从静态背景
- 下一篇: OpenCV中的快速特征检测——FAST