OpenCV半小時掌握基本操作之SIFT算法
概述
OpenCV 是一個跨平臺的計算機視覺庫, 支持多語言, 功能強大. 今天小白就帶大家一起攜手走進 OpenCV 的世界. (第 24 課)
圖像尺度空間
在一定的范圍內(nèi), 無論物體是大還是小, 人眼都可以分辨出來. 而計算機要有相同的能力卻很難, 所以要讓機器能夠?qū)ξ矬w在不同尺度下有一個統(tǒng)一的認知, 就需要考慮圖像在不同的尺度下都存在的特點.
多分辨率金字塔
使用高斯模糊, 不同的 σ 決定了圖像的平滑程度, 越大的 σ 值對應(yīng)的圖像越模糊. 通過使用不同的 σ 我們可以實現(xiàn)多分辨率金字塔.
高斯模糊:
cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
- src: 需要濾波的圖片
- ksize: 卷積核大小
- sigmaX: 高斯核函數(shù)在 X 方向的的標(biāo)準偏差
- sigmaY: 高斯核函數(shù)在 Y 方向的的標(biāo)準偏差
例子:
import cv2 from matplotlib import pyplot as plt # 讀取圖片 img = cv2.imread("face.jpg") # 畫圖 f, ax = plt.subplots(2, 3, figsize=(12, 8)) ax[0, 0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) ax[0, 0].set_title("original") ax[0, 0].set_xticks([]) ax[0, 0].set_yticks([]) # 高斯模糊 for i in range(1, 6): # 高斯模糊 image_blur = cv2.GaussianBlur(img, (15, 15), i) # 計算子圖 ax[int(i/3), i % 3].imshow(cv2.cvtColor(image_blur, cv2.COLOR_BGR2RGB)) # 標(biāo)題 ax[int(i/3), i % 3].set_title("σ" + str(i)) ax[int(i/3), i % 3].set_xticks([]) ax[int(i/3), i % 3].set_yticks([]) # 展示圖片 plt.show()
輸出結(jié)果:
高斯差分金字塔
DoG (Difference of Gaussian) 即高斯差分金字塔, 是在高斯金字塔的基礎(chǔ)上構(gòu)建起來的. 通過對高斯金字塔逐層相減, 得到 t-1 的高斯差分金字塔:
計算極值點
DoG 空間極值檢測: 將每個像素點和同一層周圍的 8 個像素點以及上下兩層的 18 個像素點, 共 26 個像素點進行比較. 如果一像素點大于或小于鄰近的 26 個像素點的時候, 就成為了極值點.
SIFT 算法
SIFT (Scale Invariant Feature Transform), 即尺度不變特征變換匹配算法. SIFT 算法對于旋轉(zhuǎn)和尺度具有不變性.
函數(shù)
實例化 SHIFT 算法:
cv2.SIFT_create()
獲取特征點:
sift.detect(img_gray, None)
繪制特征點:
cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None)
- image: 輸入圖像
- keypoints: 特征點
- outImage: 輸出圖像
將特征點轉(zhuǎn)換為128 維的向量:
sift.compute(img, kp)
實戰(zhàn)
例子:
import numpy as np import cv2 # 讀取圖片 img = cv2.imread("face.jpg") key_points = img.copy() # 實例化SIFT算法 sift = cv2.SIFT_create() # 得到特征點 kp = sift.detect(img, None) print(np.array(kp).shape) # 繪制特征點 cv2.drawKeypoints(img, kp, key_points) # 圖片展示 cv2.imshow("key points", key_points) cv2.waitKey(0) cv2.destroyAllWindows() # 保存圖片 cv2.imwrite("key_points.jpg", key_points) # 計算特征 kp, des = sift.compute(img, kp) # 調(diào)試輸出 print(des.shape) print(des[0])
輸出結(jié)果:
(2183,)
(2183, 128)
[ 9. 18. 1. 0. 0. 0. 10. 8. 11. 18. 7. 34. 37. 14.
31. 11. 15. 6. 33. 50. 26. 9. 8. 10. 2. 1. 77. 94.
72. 17. 2. 5. 20. 44. 4. 1. 0. 0. 0. 0. 37. 63.
34. 128. 53. 4. 1. 1. 144. 11. 8. 56. 45. 25. 9. 63.
20. 1. 5. 22. 144. 144. 8. 18. 16. 3. 0. 0. 0. 0.
0. 2. 49. 7. 2. 17. 80. 35. 0. 9. 144. 39. 1. 5.
44. 19. 1. 12. 47. 9. 0. 0. 144. 126. 1. 2. 8. 0.
0. 0. 0. 0. 0. 1. 34. 2. 0. 0. 60. 25. 0. 5.
144. 38. 0. 0. 39. 14. 0. 2. 61. 13. 0. 0. 144. 50.
0. 0.]
到此這篇關(guān)于OpenCV半小時掌握基本操作之SIFT算法的文章就介紹到這了,更多相關(guān)OpenCV SIFT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
keras Lambda自定義層實現(xiàn)數(shù)據(jù)的切片方式,Lambda傳參數(shù)
這篇文章主要介紹了keras Lambda自定義層實現(xiàn)數(shù)據(jù)的切片方式,Lambda傳參數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python實用技巧之列表、字典、集合中根據(jù)條件篩選數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Python技巧之在列表、字典、集合中根據(jù)條件篩選數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧2018-07-07淺談Python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入
數(shù)據(jù)導(dǎo)入是所有數(shù)模編程的第一步,比你想象的更重要。Python 語言中數(shù)據(jù)導(dǎo)入的方法很多。對于數(shù)學(xué)建模問題編程來說,選擇什么方法最好呢?答案是:沒有最好的,只有最合適的。對于不同的問題,不同的算法,以及所調(diào)用工具包的不同實現(xiàn)方法,對于數(shù)據(jù)就會有不同的要求2021-06-06利用Django框架中select_related和prefetch_related函數(shù)對數(shù)據(jù)庫查詢優(yōu)化
這篇文章主要介紹了利用Python的Django框架中select_related和prefetch_related函數(shù)對數(shù)據(jù)庫查詢的優(yōu)化的一個實踐例子,展示如何在實際中利用這兩個函數(shù)減少對數(shù)據(jù)庫的查詢次數(shù),需要的朋友可以參考下2015-04-04Python實現(xiàn)隱馬爾可夫模型的前向后向算法的示例代碼
這篇文章主要介紹了Python實現(xiàn)隱馬爾可夫模型的前向后向算法,本文通過實例代碼給大家講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12