SIFT運算元總結
1.SIFT簡介
SIFT的全稱是Scale Invariant Feature Transform,尺度不變特徵變換,由加拿大教授David G.Lowe提出的。SIFT特徵對旋轉、尺度縮放、亮度變化等保持不變性,是一種非常穩定的區域性特徵。
1.1 SIFT演算法具的特點
- 影像的區域性特徵,對旋轉、尺度縮放、亮度變化保持不變,對視角變化、仿射變換、噪聲也保持一定程度的穩定性。
- 獨特性好,資訊量豐富,適用於海量特徵庫進行快速、準確的匹配。
- 多量性,即使是很少幾個物體也可以產生大量的SIFT特徵
- 高速性,經優化的SIFT匹配演算法甚至可以達到實時性
- 擴招性,可以很方便的與其他的特徵向量進行聯合。
1.2 SIFT特徵檢測的步驟
- 尺度空間的極值檢測: 搜尋所有尺度空間上的影像,通過高斯微分函式來識別潛在的對尺度和選擇不變的興趣點。
- 特徵點定位: 在每個候選的位置上,通過一個擬合精細模型來確定位置尺度,關鍵點的選取依據他們的穩定程度。
- 特徵方向賦值: 基於影像區域性的梯度方向,分配給每個關鍵點位置一個或多個方向,後續的所有操作都是對於關鍵點的方向、尺度和位置進行變換,從而提供這些特徵的不變性。
- **特徵點描述:**在每個特徵點周圍的鄰域內,在選定的尺度上測量影像的區域性梯度,這些梯度被變換成一種表示,這種表示允許比較大的區域性形狀的變形和光照變換。
2. 尺度空間
在一定的範圍內,無論物體是大還是小,人眼都可以分辨出來。然而計算機要有相同的能力卻不是那麼的容易,在未知的場景中,計算機視覺並不能提供物體的尺度大小,其中的一種方法是把物體不同尺度下的影像都提供給機器,讓機器能夠對物體在不同的尺度下有一個統一的認知。在建立統一認知的過程中,要考慮的就是在影像在不同的尺度下都存在的特徵點。
2.1 多解析度影像金字塔
在早期影像的多尺度通常使用影像金字塔表示形式。影像金字塔是同一影像在不同的解析度下得到的一組結果,其生成過程一般包括兩個步驟:
- 對原始影像進行平滑
- 對處理後的影像進行降取樣(通常是水平、垂直方向的1/2)
降取樣後得到一系列不斷尺寸縮小的影像。顯然,一個傳統的金字塔中,每一層的影像是其上一層影像長、高的各一半。多解析度的影像金字塔雖然生成簡單,但其本質是降取樣,影像的區域性特徵則難以保持,也就是無法保持特徵的尺度不變性。
2.2 高斯尺度空間
我們還可以通過影像的模糊程度來模擬人在距離物體由遠到近時物體在視網膜上成像過程,距離物體越近其尺寸越大影像也越模糊,這就是高斯尺度空間,使用不同的引數模糊影像(解析度不變),是尺度空間的另一種表現形式。
我們知道影像和高斯函式進行卷積運算能夠對影像進行模糊,使用不同的“高斯核”可得到不同模糊程度的影像。一副影像其高斯尺度空間可由其和不同的高斯卷積得到:
其中,G(x,y,σ)是高斯核函式。
σ稱為尺度空間因子,它是高斯正態分佈的標準差,反映了影像被模糊的程度,其值越大影像越模糊,對應的尺度也就越大。L(x,y,σ)代表著影像的高斯尺度空間。
構建尺度空間的目的是為了檢測出在不同的尺度下都存在的特徵點,而檢測特徵點較好的運算元是高斯拉普拉斯(LoG)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-vdYWetZD-1607878359122)(https://cdn.jsdelivr.net/gh/niecongchong/csdn_img@master/img/2019-08-06-16.png)]
使用LoG雖然能較好的檢測到影像中的特徵點,但是其運算量過大,通常可使用**DoG(差分高斯,Difference of Gaussina)**來近似計算LoG[Marr and Hidreth]。
設k為相鄰兩個高斯尺度空間的比例因子,則DoG的定義:
其中,L(x,y,σ)是影像的高斯尺度空間。
從上式可以知道,將相鄰的兩個高斯空間的影像相減就得到了DoG的響應影像。為了得到DoG影像,先要構建高斯尺度空間,而高斯的尺度空間可以在影像金字塔降取樣的基礎上加上高斯濾波得到,也就是對影像金字塔的每層影像使用不同的引數σ進行高斯模糊,使每層金字塔有多張高斯模糊過的影像。
高斯金字塔構建成功後,將每一組相鄰的兩層相減就可以得到DoG金字塔.
3. DoG空間極值檢測
為了尋找尺度空間的極值點,每個畫素點要和其影像域(同一尺度空間)和尺度域(相鄰的尺度空間)的所有相鄰點進行比較,當其大於(或者小於)所有相鄰點時,改點就是極值點。如圖所示,中間的檢測點要和其所在影像的3×3鄰域8個畫素點,以及其相鄰的上下兩層的3×3領域18個畫素點,共26個畫素點進行比較。
從上面的描述中可以知道,每組影像的第一層和最後一層是無法進行比較取得極值的。為了滿足尺度變換的連續性,在每一組影像的頂層繼續使用高斯模糊生成3幅影像。
4. 刪除不好的極值點(特徵點)
通過比較檢測得到的DoG的區域性極值點所在離散的空間搜尋得到的,由於離散空間是對連續空間取樣得到的結果,因此在離散空間找到的極值點不一定是真正意義上的極值點,因此要設法將不滿足條件的點剔除掉。可以通過尺度空間DoG函式進行曲線擬合尋找極值點,這一步的本質是去掉DoG區域性曲率非常不對稱的點。
要剔除掉的不符合要求的點主要有兩種:
- 低對比度的特徵點
- 不穩定的邊緣響應點
4.1 剔除低對比度的特徵點
4.2 剔除不穩定的邊緣響應點
5. 求取特徵點的主方向
經過上面的步驟已經找到了在不同尺度下都存在的特徵點,為了實現影像旋轉不變性,需要給特徵點的方向進行賦值。利用特徵點鄰域畫素的梯度分佈特性來確定其方向引數,再利用影像的梯度直方圖求取關鍵點區域性結構的穩定方向。
找到了特徵點,也就可以得到該特徵點的尺度σ,也就可以得到特徵點所在的尺度影像
計算以特徵點為中心、以3×1.5σ3×1.5σ為半徑的區域影像的幅角和幅值,每個點L(x,y)的梯度的模m(x,y)以及方向θ(x,y)可通過下面公式求得
計算得到梯度方向後,就要使用直方圖統計特徵點鄰域內畫素對應的梯度方向和幅值。梯度方向的直方圖的橫軸是梯度方向的角度(梯度方向的範圍是0到360度,直方圖每36度一個柱共10個柱,或者沒45度一個柱共8個柱),縱軸是梯度方向對應梯度幅值的累加,在直方圖的峰值就是特徵點的主方向。在Lowe的論文還提到了使用高斯函式對直方圖進行平滑以增強特徵點近的鄰域點對關鍵點方向的作用,並減少突變的影響。為了得到更精確的方向,通常還可以對離散的梯度直方圖進行插值擬合。具體而言,關鍵點的方向可以由和主峰值最近的三個柱值通過拋物線插值得到。在梯度直方圖中,當存在一個相當於主峰值80%能量的柱值時,則可以將這個方向認為是該特徵點輔助方向。所以,一個特徵點可能檢測到多個方向(也可以理解為,一個特徵點可能產生多個座標、尺度相同,但是方向不同的特徵點)。Lowe在論文中指出
15%的關鍵點具有多方向,而且這些點對匹配的穩定性很關鍵。
得到特徵點的主方向後,對於每個特徵點可以得到三個資訊(x,y,σ,θ),即位置、尺度和方向。由此可以確定一個SIFT特徵區域,一個SIFT特徵區域由三個值表示,中心表示特徵點位置,半徑表示關鍵點的尺度,箭頭表示主方向。具有多個方向的關鍵點可以被複製成多份,然後將方向值分別賦給複製後的特徵點,一個特徵點就產生了多個座標、尺度相等,但是方向不同的特徵點。
6. 生成特徵描述
通過以上的步驟已經找到了SIFT特徵點位置、尺度和方向資訊,下面就需要使用一組向量來描述關鍵點也就是生成特徵點描述子,這個描述符不只包含特徵點,也含有特徵點周圍對其有貢獻的畫素點。描述子應具有較高的獨立性,以保證匹配率。
特徵描述符的生成大致有三個步驟:
- 校正旋轉主方向,確保旋轉不變性。
- 生成描述子,最終形成一個128維的特徵向量
- 歸一化處理,將特徵向量長度進行歸一化處理,進一步去除光照的影響。
為了保證特徵向量的旋轉不變性,要以特徵點為中心,在附近鄰域內將座標軸旋轉θθ(特徵點的主方向)角度,即將座標軸旋轉為特徵點的主方向。旋轉後鄰域內畫素的新座標為:
旋轉後以主方向為中心取 8×8的視窗。下圖所示,左圖的中央為當前關鍵點的位置,每個小格代表為關鍵點鄰域所在尺度空間的一個畫素,求取每個畫素的梯度幅值與梯度方向,箭頭方向代表該畫素的梯度方向,長度代表梯度幅值,然後利用高斯視窗對其進行加權運算。最後在每個4×4的小塊上繪製8個方向的梯度直方圖,計算每個梯度方向的累加值,即可形成一個種子點,如右圖所示。每個特徵點由4個種子點組成,每個種子點有8個方向的向量資訊。這種鄰域方向性資訊聯合增強了演算法的抗噪聲能力,同時對於含有定位誤差的特徵匹配也提供了比較理性的容錯性。
與求主方向不同,此時每個種子區域的梯度直方圖在0-360之間劃分為8個方向區間,每個區間為45度,即每個種子點有8個方向的梯度強度資訊。
在實際的計算過程中,為了增強匹配的穩健性,Lowe建議
對每個關鍵點使用4×44×4共16個種子點來描述,這樣一個關鍵點就可以產生128維的SIFT特徵向量。
通過對特徵點周圍的畫素進行分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域影像資訊的一種抽象,具有唯一性。
7. 總結
SIFT特徵以其對旋轉、尺度縮放、亮度等保持不變性,是一種非常穩定的區域性特徵,在影像處理和計算機視覺領域有著很重要的作用,其本身也是非常複雜的,下面對其計算過程做一個粗略總結。
- DoG尺度空間的極值檢測: 首先是構造DoG尺度空間,在SIFT中使用不同引數的高斯模糊來表示不同的尺度空間。而構造尺度空間是為了檢測在不同尺度下都存在的特徵點,特徵點的檢測比較常用的方法是Δ2G(高斯拉普拉斯LoG),但是LoG的運算量是比較大的,Marr和Hidreth曾指出,可以使用DoG(差分高斯)來近似計算LoG,所以在DoG的尺度空間下檢測極值點。
- 刪除不穩定的極值點: 主要刪除兩類:低對比度的極值點以及不穩定的邊緣響應點。
- 確定特徵點的主方向: 以特徵點的為中心、以3×1.5σ為半徑的領域內計算各個畫素點的梯度的幅角和幅值,然後使用直方圖對梯度的幅角進行統計。直方圖的橫軸是梯度的方向,縱軸為梯度方向對應梯度幅值的累加值,直方圖中最高峰所對應的方向即為特徵點的方向。
- 生成特徵點的描述子: 首先將座標軸旋轉為特徵點的方向,以特徵點為中心的16×16的視窗的畫素的梯度幅值和方向,將視窗內的畫素分成16塊,每塊是其畫素內8個方向的直方圖統計,共可形成128維的特徵向量。
8. python-opencv 程式碼執行
import numpy as np
import cv2
img = cv2.imread('img.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray,None)
img=cv2.drawKeypoints(gray,kp,img)
cv2.imshow('img',img)
cv2.waitKey()
9.參考
相關文章
- Flink的DataSet基本運算元總結
- 位運算總結
- spark-運算元-分割槽運算元Spark
- 運算元
- 四元數的運用與總結
- 使用運算元控制公式運算公式
- Python 影像處理 OpenCV (12): Roberts 運算元、 Prewitt 運算元、 Sobel 運算元和 Laplacian 運算元邊緣檢測技術PythonOpenCV
- 【技巧總結】位運算裝逼指南
- RDD運算元
- 【Spark篇】---SparkStreaming中運算元中OutPutOperator類運算元Spark
- 運算元據庫
- python運算元據Python
- JavaScript運算元組JavaScript
- 運算元據庫表
- MySQL DML運算元據MySql
- jmeter運算元據庫JMeter
- DDL:運算元據庫
- onnx 運算元定義
- 什麼是運算元?
- Flink -- Operator操作運算元
- 全面總結 JS 中浮點數運算問題JS
- Spark常用Transformations運算元(一)SparkORM
- Python運算元據庫(3)Python
- Oracle OCP(10):運算元據Oracle
- sobel運算元,matlab實現Matlab
- 3.0 常見operators運算元
- 位運算小結
- 面試官常問的位運算問題總結面試
- Python 運維總結Python運維
- js 方法(運算元組為主JS
- 利用 Sequelize 來運算元據庫
- spark一些常用運算元Spark
- Ascend C 自定義PRelu運算元
- 三元運算+包機制
- 深入淺出PyTorch(運算元篇)PyTorch
- Spark RDD運算元(八)mapPartitions, mapPartitionsWithIndexSparkAPPIndex
- Ascend C運算元開發指南
- Flink - 運算元鏈合併方法