目錄
- 概述
- 圖像尺度空間
- 多分辨率金字塔
- 高斯差分金字塔
- 計(jì)算極值點(diǎn)
- SIFT 算法
概述
OpenCV 是一個(gè)跨平臺(tái)的計(jì)算機(jī)視覺庫, 支持多語言, 功能強(qiáng)大. 今天小白就帶大家一起攜手走進(jìn) OpenCV 的世界. (第 24 課)
圖像尺度空間
在一定的范圍內(nèi), 無論物體是大還是小, 人眼都可以分辨出來. 而計(jì)算機(jī)要有相同的能力卻很難, 所以要讓機(jī)器能夠?qū)ξ矬w在不同尺度下有一個(gè)統(tǒng)一的認(rèn)知, 就需要考慮圖像在不同的尺度下都存在的特點(diǎn).
多分辨率金字塔
使用高斯模糊, 不同的 σ 決定了圖像的平滑程度, 越大的 σ 值對(duì)應(yīng)的圖像越模糊. 通過使用不同的 σ 我們可以實(shí)現(xiàn)多分辨率金字塔.
高斯模糊:
cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
- src: 需要濾波的圖片
- ksize: 卷積核大小
- sigmaX: 高斯核函數(shù)在 X 方向的的標(biāo)準(zhǔn)偏差
- sigmaY: 高斯核函數(shù)在 Y 方向的的標(biāo)準(zhǔn)偏差
例子:
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)
# 計(jì)算子圖
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)建起來的. 通過對(duì)高斯金字塔逐層相減, 得到 t-1 的高斯差分金字塔:
計(jì)算極值點(diǎn)
DoG 空間極值檢測(cè): 將每個(gè)像素點(diǎn)和同一層周圍的 8 個(gè)像素點(diǎn)以及上下兩層的 18 個(gè)像素點(diǎn), 共 26 個(gè)像素點(diǎn)進(jìn)行比較. 如果一像素點(diǎn)大于或小于鄰近的 26 個(gè)像素點(diǎn)的時(shí)候, 就成為了極值點(diǎn).
SIFT 算法
SIFT (Scale Invariant Feature Transform), 即尺度不變特征變換匹配算法. SIFT 算法對(duì)于旋轉(zhuǎn)和尺度具有不變性.
函數(shù)
實(shí)例化 SHIFT 算法:
獲取特征點(diǎn):
sift.detect(img_gray, None)
繪制特征點(diǎn):
cv2.drawKeypoints(image, keypoints, outImage, color=None, flags=None)
- image: 輸入圖像
- keypoints: 特征點(diǎn)
- outImage: 輸出圖像
將特征點(diǎn)轉(zhuǎn)換為128 維的向量:
實(shí)戰(zhàn)
例子:
import numpy as np
import cv2
# 讀取圖片
img = cv2.imread("face.jpg")
key_points = img.copy()
# 實(shí)例化SIFT算法
sift = cv2.SIFT_create()
# 得到特征點(diǎn)
kp = sift.detect(img, None)
print(np.array(kp).shape)
# 繪制特征點(diǎn)
cv2.drawKeypoints(img, kp, key_points)
# 圖片展示
cv2.imshow("key points", key_points)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存圖片
cv2.imwrite("key_points.jpg", key_points)
# 計(jì)算特征
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半小時(shí)掌握基本操作之SIFT算法的文章就介紹到這了,更多相關(guān)OpenCV SIFT內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- python利用opencv實(shí)現(xiàn)SIFT特征提取與匹配
- opencv-python 提取sift特征并匹配的實(shí)例
- 應(yīng)用OpenCV和Python進(jìn)行SIFT算法的實(shí)現(xiàn)詳解
- python opencv之SIFT算法示例