日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV中的尺度不变特征变换(SIFT Scale-Invariant Feature Transform)

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。