SURF 算法概述
SURF,英文全稱為 SpeededUp Robust Features,直譯為“加速版的具有魯棒性的特征”算法,由 Bay 在 2006 年首次提出。SURF 最大特征在於采用了 harr 特征以及積分圖像的概念,這大大加快了程序的運行時間。SURF 可以應用於計算機視覺的物體識別以及 3D 重構中。
SURF 算法原理
SURF 算法主要包含 7 步:
- 構建 Hessian 矩陣
- 構建尺度空間
- 生成 Hessian 行列式圖像
- 利用非極大值抑制初步確定特征點
- 精確定位極值點
- 計算特征點的主方向
- 生成特征點描述算子
- 構建 Hessian 矩陣
Hessian 矩陣是 Surf 算法的核心。在數學中,Hessian 矩陣是一個二階偏導數組成的方塊矩陣,描述了函數的局部曲率。對於圖像 f(x,y) ,其 Hessian 矩陣 為

但噪聲的存在可能會引起像素突變,所以在構造 Hessian 矩陣前需要對圖像進行高斯濾波,經過濾波后的圖像為 L(x,σ),Hessian 矩陣表述為:

Hessian 矩陣的判別式為:

當判別式在(x,y)位置上取得局部極大值或極小值時(當前點比周圍鄰域內其他點更亮或更暗),(x,y)為關鍵點位置。
為了提高運算速度,Surf使用了盒式濾波器(Boxfilter)來近似替代高斯濾波器。盒式濾波器(Boxfilter)將對圖像的濾波轉化成計算圖像上不同區域間像素和的加減運算問題,只需要簡單幾次查找積分圖就可以完成。https://www.cnblogs.com/bjxqmy/p/12294444.html
![]()
其中,Dxy 乘上 0.9,目的是為了平衡因使用盒式濾波器近似所帶來的誤差,而 0.9 是論文作者給出的一個經驗值。
- 構建尺度空間
SIFT 算法通過下采樣的方式來獲取不同尺度的圖像。在 SURF 中,我們保持圖像大小不變,通過改變濾波窗口的大小來獲得不同尺度的圖像,即構成尺度空間。初始的盒子濾波器是 σ 為 1.2 的高斯二階微分函數經過離散和減裁后的濾波模板。



- 生成 Hessian 行列式圖像
Bay 建議將尺度空間分為四組,每組中包括四層。每一層對應的 σ 與濾波模板尺寸之間的關系式為:
。
每一組中任意一層都包括 Dx Dy Dxy 三種盒子濾波器。對一幅輸入圖像進行濾波后通過 Hessian 行列式計算公式可以得到對應尺度坐標下的 Hessian 行列式的值。

- 利用非極大值抑制初步確定特征點
在每一組中選取相鄰的三層 Hessian 行列式圖像,對於中間層的任意一點,在空間中選取該點周圍的 26 個點進行比較大小,

若該點大於其他 26 個點,則該點為特征點。從上述過程可以知道,當尺度空間每組由四層構成時,非極大值抑制只會在中間兩層進行,相鄰的組之間不進行比較。
- 精確定位極值點
設定 Hessian 行列式的閥值,低於 Hessian 行列式閥值的點不能作為最終的特征點。在實際選擇閥值時,根據實際應用中對特征點數量和精確度的要求改變閥值。閥值越大,得到的特征點的魯棒性越好。在處理場景簡單的圖像時,其閥值可以適當的調低。在復雜的圖像中,圖像經旋轉或者模糊后特征點變化的數量較大,測試需要適當提高閥值。
- 計算特征點的主方向
① 首先,賦予每一個興趣點方向特征:在以某個興趣點為圓心,6S(S為該特征尺度)為半徑的圓形領域里,用尺寸為 4S 的 Haar 小波模板對圖像進行處理,求 x,y 兩個方向的 Haar 小波響應。然后用以興趣點為中心的高斯函數(σ = 2 s)對這些響應進行加權,結果即為某個興趣點的方向特征。
Haar 小波的模板如圖所示:

其中左側模板計算 x 方向的響應,右側模板計算 y 方向的響應,黑色表示 -1,白色表示 +1。
② 然后,在特征點的圓形鄰域內,統計 60 度扇形內所有點的方向特征總和,接着扇形以一定間隔進行旋轉並再次統計該區域內所有點的方向特征總和,最后將值最大的那個扇形的方向作為該特征點的主方向。

- 生成特征點描述算子
在SURF中,我們在關鍵點周圍選取一個正方形框,方向為關鍵點的主方向,邊長為 20S。將其划分為 16 個區域(邊長為 5S),每個區域統計 25S 個像素的水平方向和垂直方向的 Haar 小波特性(均相對於正方形框的主方向確定的)

該小波特征包括水平方向值之和,水平方向絕對值之和,垂直方向值之和和垂直方向絕對值之和(為了把強度變化的極性信息也包括描述符中,所以對絕對值進行累加)。這樣每個區域有 4 個值,則每個正方形框有 4×16 = 64 維,即每個關鍵點描述是 64 維,比SIFT描述少了一半。
總結
SURF 采用 Hessian 矩陣獲取圖像局部最值十分穩定,但是在求主方向階段太過依賴於局部區域像素的梯度方向,有可能使找到的主方向不准確。而后面的特征向量提取以及匹配又都嚴重依賴於主方向,可能造成偏差的進一步加大,從而使匹配不成功。另外圖像金字塔的層取的不夠緊密也會造成尺度的誤差,發明者在這個問題上的這種解決辦法是取適量的層,然后進行插值。
opencv4.0 及 4.0 以上版本已經沒有 SIFT 和 SURF 算法了,他們因為專利的原因不能用於商業。所以不做代碼演示了,用到的時候再說吧。
借鑒博客:https://www.cnblogs.com/jinjidexuetu/p/90ace4e8de574e3d5f4e6ac16a0dc157.html
