天天看點

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

opencv-python SIFT尺度不變特征變換算法筆記

用DoG(高斯差分算法)提取特征點,并用SIFT描述關鍵點。

DoG(高斯函數差分算法)提取特征點

高斯函數定義:

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

對兩幅圖像分别進行高斯濾波:

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

DoG可以表示為:

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

第一步,計算不同參數下的DoG:

(1)一個高斯平滑參數為0.3,另一個高斯平滑參數為0.4

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

(2)一個高斯平滑參數為0.6,另一個高斯平滑參數為0.7

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

(3)一個高斯平滑參數為0.7,另一個高斯平滑參數為0.8

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

第二步,根據DoG結果,求角點:

三維圖中的最大值和最小值點是角點。

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

紅色點為目前像素點,可與最多26個相鄰尺度的點(上層9個+本層8個+下層9個)進行比較,如果它是所鄰接像素點的最大值或最小值點,則标記為特征點。依次進行可以完成圖像特征點的提取。

通過圖1,2,3提取出圖2中的極值點。黑色為極小值,白色為極大值。

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

在原圖像上顯示DoG角點檢測結果

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

SIFT(尺度不變特征變換算法)

SIFT特征是圖像的局部特征 對平移、旋轉、尺度縮放、亮度變化、遮擋和噪聲等具有良好的不變性,對視覺變化、仿射變換也保持一定程度的穩定性。

·獨特性好 資訊量豐富,适用于在海量特征資料庫中進行快速、準确的比對。

·多量性 即使少數的幾個物體也可以産生大量Sift特征向量。

·速度相對較快 經優化的Sift比對算法甚至可以達到實時的要求。

·可擴充性強 可以很友善的與其他形式的特征向量進行聯合。

Lowe将SIFT算法分解為如下四步:

(1)尺度空間極值檢測:搜尋所有尺度上的圖像位置。通過高斯微分函數來識别潛在的對于尺度和旋轉不變的興趣點。(通過DoG方法提取特征點)

(2)關鍵點定位:在每個候選的位置上,通過一個拟合精細的模型來确定位置和尺度。

關鍵點的選擇依據于它們的穩定程度。由第①步檢測得到的極值點是離散空間的極值點。下面,通過拟合三維二次函數來精确确定關鍵點的位置和尺度,同時去除低對比度的關鍵點和不穩定的邊緣響應點(因為DoG算子會産生較強的邊緣響應),以增強比對穩定性、提高抗噪聲能力。他們使用泰勒級數展開式空間來獲得更精确的極值位置,如果這個極值點的強度小于門檻值,它就會被拒絕。這個門檻值在Opencv中為contrastThreshold。

與Harris角點檢測的思路相似,擷取特征點處的Hessian矩陣,主曲率(principal curvature)通過一個2x2 的Hessian矩陣H求出:

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記
opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

其中α和β分别代表x和y方向的梯度。這裡,Tr(H)為主對角線元素之和,Det(H)表示矩陣H的行列式。假設是α較大的特征值,而β為較小的特征值,令α=rβ,則

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

D的主曲率和H的特征值成正比,跟上面一樣,讓α為最大特征值,β為最小特征值,

則公式

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

的值在兩個特征值相等時最小,随着r的增大而增大。r值越大,說明兩個特征值的比值越大,即在某一個方向的梯度值越大,而在另一個方向的梯度值越小,邊緣恰恰就是一個方向梯度大,一個方向梯度小的情況。是以為了剔除邊緣響應點,需要讓該比值小于一定的門檻值(論文給的r值為10)将滿足條件的關鍵點保留,否則則扔掉。是以,低對比度和邊緣的關鍵點在本步驟中被去除,隻保留最感興趣的那些點。

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

(3)方向确定:每個點L(x,y)的梯度的模m(x,y)和方向θ(x,y)

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記
opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

對其中八個方向進行直方圖統計

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

為了保證特征矢量的旋轉不變性,要以特征點為中心,在附近鄰域内将坐标軸旋轉θ角度,即将坐标軸旋轉為特征點的主方向。

opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記
opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

(4)關鍵點描述:在每個關鍵點周圍的鄰域内,在標明的尺度上測量圖像局部的梯度。這些梯度被變換成一種表示,這種表示允許比較大的局部形狀的變形和光照變化。

import cv2
import numpy as np

img = cv2.imread("img/img.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)

# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS對圖像的每個關鍵點都繪制了圓圈和方向。
img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints,
                        flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,
                        color=(51, 163, 236))

cv2.imshow('sift_keypoints', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
           
opencv-python SIFT尺度不變特征變換算法筆記opencv-python SIFT尺度不變特征變換算法筆記

參考文章及視訊:

https://blog.csdn.net/sss_369/article/details/84674639

https://blog.csdn.net/g11d111/article/details/79925827

https://www.bilibili.com/video/av61678672/?p=12