# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import cv2
"""
SIFT 尺度不變特徵
1. 通過高斯模糊來獲取圖像金子塔:
1.1 高斯模糊的前提認爲像素點與周圍的相似性關係滿足高斯分佈,即越近越像,因此有得到如下5*5高斯卷積核:
kernel = [[0.015026, 0.028569, 0.035391, 0.028569, 0.015026],
[0.028569, 0.054318, 0.067288, 0.054318, 0.028569],
[0.035591, 0.067288, 0.082255, 0.067288, 0.035391],
[0.028569, 0.054318, 0.067288, 0.054318, 0.028569],
[0.015026, 0.028569, 0.035391, 0.028569, 0.015026]]
1.2 用高斯模糊處理當前圖像後,進行1/2採樣;之後在重複該操作;
1.3 結果形成一個金字塔,假設原圖爲512*512,則後續分別有
層1(512*512), 層2(256*256), ...., 層9(1*1)
2. 構建高斯差分圖像(DOG)
2.1 將高斯金字塔各層的圖像全部進行插值操作,回到512*512;
2.2 將相鄰的兩張圖進行差分操作,例如L9/L8之間
2.3 最終形成8張512 * 512的差分圖像
3. 空間極值點的檢測
3.1 每一個尺度(理解應不包含第一層和最後一層)找空間極值點;
3.2 這裏找的極值點除了找本層(如L2)的相鄰8個點,還有找(L1和L3)的18個點,相當於是
一個三維立方體空間裏找極值點,這個機制點就是SIFT的特徵點備選
3.3 由於當前的備選點不一定是真正精確的極值點,實際還通過基於這些點的擬合來獲取進一步真正的極值點,
在擬合過程中通過閾值取出一些對比度低的點
3.4 由於高斯差分算子的極值在橫跨邊緣的地方有較大的主曲率,而在垂直邊緣的方向有較小的主曲率。
DOG算子會產生較強的邊緣響應,需要剔除不穩定的邊緣響應點
4. 結論:
通過SIFT算法得到的特徵點,在圖像放大、縮小、旋轉過程中都會保持不變
"""
path = '/XXX/'
img = cv2.imread(path + 'logo.jpeg')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
# 計算出圖像的關鍵點和sift特徵向量
kp1, kv1 = sift.detectAndCompute(img_gray, None)
kp_mask = np.zeros(img_gray.shape)
w = img_gray.shape[0]
h = img_gray.shape[1]
for i in range(len(kp1)):
x_idx = int(kp1[i].pt[0])
y_idx = int(kp1[i].pt[1])
if x_idx >= w or y_idx >= h:
continue
kp_mask[y_idx][
x_idx] = 1
img[kp_mask == 1, 0] = 255
plt.imshow(img)
plt.show()
【圖像處理8】SIFT特徵
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.