專業(yè)簡章佛山seo優(yōu)化外包
一、說明
????????提起在OpenCV中的特征點提取,可以列出Harris,可以使用SIFT算法或SURF算法來檢測圖像中的角特征點。本篇圍繞sift的特征點提取,只是管中窺豹,而更多的特征點算法有:
- Harris & Stephens / Shi–Tomasi 角點檢測算法
- F?rstner角點檢測器;
- 多尺度 Harris 算子
- 水平曲線曲率法
- 高斯的拉普拉斯、高斯的差異和 Hessian 尺度空間興趣點的行列式
- 基于 Lindeberg Hessian 特征強度度量的尺度空間興趣點
- 仿射自適應興趣點算子
- Wang 和 Brady 角點檢測算法
- SUSAN 角點檢測器
- Trajkovic 和 Hedley 角點檢測器
- 基于 AST 的特征檢測器
- 檢測器自動合成
- 時空興趣點檢測器
二、快速(來自加速段測試的功能)
????????FAST是一種用于識別圖像中的興趣點的算法。興趣點具有較高的本地信息含量,理想情況下,它們應該在不同圖像之間可重復。FAST算法工作背后的原因是開發(fā)一種興趣點檢測器,用于實時幀速率應用,如移動機器人上的SLAM,這些應用的計算資源有限。
????????算法如下:
- 在強度IP的圖像中選擇一個像素“p?”。這是要標識為興趣點的像素。
- 設置閾值強度值 T。
- 考慮圍繞像素 p 的 16 像素圓圈。
- 如果需要將 16 個像素檢測為興趣點,則 <> 個連續(xù)像素中的“N”個連續(xù)像素需要高于或低于值 T。
- 為了使算法快速,首先將圓的像素 1、5、9 和 13 的強度與 IP 進行比較。從上圖中可以明顯看出,這四個像素中至少有三個應該滿足閾值標準,以便存在興趣點。
- 如果四個像素值中的至少三個 — I1 、I5 、I9 I13 不高于或低于 IP + T,則 P 不是興趣點(角)。在這種情況下,我們拒絕像素 p 作為可能的興趣點。否則,如果至少三個像素高于或低于 Ip + T,則檢查所有 16 個像素。
- 對圖像中的所有像素重復此過程。
2.1 機器學習方法
- 選擇一組圖像進行訓練,運行FAST算法檢測興趣點
- 對于每個像素“p?”,將其周圍的 16 個像素存儲為向量,并對所有像素重復此操作
- 現(xiàn)在這是向量 P,它包含所有用于訓練的數(shù)據(jù)。
- 向量中的每個值都可以采用三種狀態(tài)。比 p 暗,比 p 亮或與 p 相似。
- 根據(jù)狀態(tài)的不同,整個向量P將細分為三個子集,Pd,Ps,Pb。
- 定義一個變量 Kp,如果 p 是興趣點,則為 true,如果 p 不是興趣點,則為 false。
- 使用 ID3 算法(決策樹分類器)使用變量 Kp 查詢每個子集以獲取有關(guān)真實類的知識。
- ID3算法的工作原理是熵最小化。以這樣一種方式查詢 16 像素,以便以最少的查詢數(shù)找到真正的類(興趣點或非興趣點)?;蛘邠Q句話說,選擇像素x,它具有有關(guān)像素的最多信息
- 遞歸地將此熵最小化應用于所有三個子集。
- 當子集的熵為零時終止進程。
- 決策樹學習的這種查詢順序也可用于在其他圖像中更快地檢測。
2.2 用于移除相鄰拐角的非最大抑制
????????檢測彼此相鄰的多個興趣點是該算法初始版本的其他問題之一。這可以通過在檢測到興趣點后應用非最大抑制來處理。我們?yōu)槊總€檢測到的點計算一個評分函數(shù) V。評分函數(shù)定義為:“連續(xù)弧中像素與中心像素之間的絕對差值之和”。我們比較兩個相鄰的值并丟棄較低的值。
三、簡介 ( 二進制魯棒獨立基本特征 )
????????BRIEF 提供了一個快捷方式,可以直接查找二進制字符串而無需查找描述符。它采用平滑的圖像補丁,并以獨特的方式選擇一組nd(x,y)位置對(在論文中解釋)。然后對這些位置對進行一些像素強度比較。例如,設第一個位置對為 p 和 q。如果 I(p) <I(q) ,則其結(jié)果為 1,否則為 0。這適用于所有 nd 位置對以獲取 nd 維位串。此 nd 可以是 128、256 或 512。因此,一旦我們得到這個,我們就可以使用漢明距離來匹配這些描述符。
OpenCV中的簡介
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)# Initiate STAR detector
star = cv2.FeatureDetector_create("STAR")# Initiate BRIEF extractor
brief = cv2.DescriptorExtractor_create("BRIEF")# find the keypoints with STAR
kp = star.detect(img,None)# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)print brief.getInt('bytes')
print des.shape
四、SIFT(尺度不變特征變換)
????????它是一種檢測圖像中突出、穩(wěn)定的特征點的技術(shù)。對于每個這樣的點,它都提供了一組不變的旋轉(zhuǎn)和縮放特征。
????????SIFT算法有四個步驟:
?確定顯著特征點(也稱為關(guān)鍵點)的大致位置和比例
?優(yōu)化其位置和規(guī)模
?確定每個關(guān)鍵點的方向。
?確定每個關(guān)鍵點的描述符。
五、大致位置
????????SIFT算法使用高斯差,這是LoG的近似值。此過程針對高斯金字塔中圖像的不同八度音階完成。一旦找到此DoG,就會在比例和空間上搜索圖像的局部極值。這基本上意味著關(guān)鍵點在該比例中得到最好的表示。
5.1 關(guān)鍵點本地化
????????一旦找到潛在的關(guān)鍵點位置,就必須對其進行優(yōu)化以獲得更準確的結(jié)果。他們使用尺度空間的泰勒級數(shù)展開來獲得更準確的極值位置,如果該極值的強度小于閾值(根據(jù)論文為0.03),則被拒絕。此閾值在 OpenCV 中稱為?contrastThreshold。
????????DoG對邊緣的響應更高,因此也需要去除邊緣。為此,使用了類似于哈里斯角檢測器的概念。他們使用2x2的Hessian矩陣(H)來計算主曲率。所以這里我們使用一個簡單的函數(shù):如果這個比率大于閾值,則該關(guān)鍵點將被丟棄。因此,它消除了任何低對比度的關(guān)鍵點和邊緣關(guān)鍵點,剩下的就是強烈的興趣點。
5.2 指定方向
????????現(xiàn)在為每個關(guān)鍵點分配一個方向,以實現(xiàn)圖像旋轉(zhuǎn)的不變性。根據(jù)比例在關(guān)鍵點位置周圍選取鄰域,并在該區(qū)域計算梯度大小和方向。將創(chuàng)建具有 36 個箱(覆蓋 360 度)的方向直方圖。它由梯度幅度和高斯加權(quán)圓形窗口加權(quán),σ等于關(guān)鍵點刻度的 1.5 倍。取直方圖中的最高峰,任何高于 80% 的峰值也被認為是計算方向的。它創(chuàng)建具有相同位置和比例但方向不同的關(guān)鍵點。它有助于匹配的穩(wěn)定性。
5.3 每個關(guān)鍵點的描述符
????????現(xiàn)在,關(guān)鍵點描述符已創(chuàng)建。在關(guān)鍵點周圍拍攝一個 16x16 的鄰域。它分為 16 個 4x4 大小的子塊。對于每個子塊,創(chuàng)建一個 8 箱方向的直方圖。它表示為向量以形成關(guān)鍵點描述符。除此之外,還采取了一些措施來實現(xiàn)對照明變化、旋轉(zhuǎn)等的魯棒性。
六、應用:匹配SIFT描述符
????????通過識別其最近的鄰居來匹配兩個圖像之間的關(guān)鍵點。但在某些情況下,第二個最接近的匹配可能非常接近第一個。這可能是由于噪音或其他一些原因而發(fā)生的。在這種情況下,將采用最近距離與第二近距離的比率。如果大于 0.8,則拒絕它們。它消除了大約 90% 的錯誤匹配,而只丟棄了 5% 的正確匹配。
????????用于創(chuàng)建全景視圖的 SIFT
OpenCV 中的 SIFT
import cv2
import numpy as npimg = cv2.imread('home.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)sift = cv2.SIFT()
kp = sift.detect(gray,None)img=cv2.drawKeypoints(gray,kp)cv2.imwrite('sift_keypoints.jpg',img)
七、SURF(加速 - 強大的功能)
????????獲取 SURF 描述符分為兩個階段,首先檢測 SURF 點,然后在 SURF 點提取描述符。SURF點的檢測利用了尺度空間理論。為了檢測SURF點,使用快速黑森矩陣。黑森矩陣的行列式用于決定是否可以選擇一個點作為興趣點。在圖像 I 中,點 X 處的 Hessian 矩陣由下式定義:
????????在對圖像執(zhí)行卷積之前,需要對高斯二階導數(shù)進行離散化。Dxx、Dyy 和 Dxy 表示框濾波器與圖像的卷積。這些近似的二階高斯導數(shù)計算是通過使用積分圖像快速進行的。
????????通過更改框過濾器的大小來分析圖像的比例空間。通常,Box 濾波器以默認大小 9x9 開頭,對應于 σ= 1.2 的高斯導數(shù)。過濾器大小稍后會放大到 15x15、21x21、27x27 等大小。在每個尺度上計算黑森矩陣的近似行列式,并應用 333 個鄰域中的非極大抑制來求最大值。SURF 點的位置和比例 s 是用最大值獲得的。
????????獲得的SURF點的方向使用Haar小波響應進行分配。在 SURF 點附近,即半徑 6s 以內(nèi),在 x 和 y 方向上計算哈爾小波響應。使用這些響應,確定主要方向。在主導方向上,構(gòu)建了一個以SURF點為中心的20s大小的正方形。這分為44個子區(qū)域。在這些子區(qū)域中,在55個規(guī)則放置的采樣點處計算水平和垂直Haar小波響應dx和dy。這些響應以特定的區(qū)間相加,得到 Σdx , Σdy。此外,這些響應的絕對值以特定區(qū)間求和,得到 Σ|dx|, Σ|dy|.使用這些值,為每個子區(qū)域構(gòu)造一個 4 維特征向量 V = (Σdx, Σdy, Σ|dx| , Σ|dy|)。因此,每個提取的 SURF 點都與一個 4x(4x4) 描述符相關(guān)聯(lián),該描述符是一個 64 維描述符。此 64 維描述符用于執(zhí)行匹配操作。
八、ORB (定向快速和旋轉(zhuǎn)簡報)
????????ORB基本上是FAST關(guān)鍵點檢測器和BRIEF描述符的融合,并進行了許多修改以增強性能。首先,它使用 FAST 查找關(guān)鍵點,然后應用 Harris 角度量來查找其中的前 N 個點。它還使用金字塔來生成多尺度特征。
ORB的算法:
????????它計算角位于中心的修補程序的強度加權(quán)質(zhì)心。矢量從此角點到質(zhì)心的方向給出了方向。為了提高旋轉(zhuǎn)不變性,用 x 和 y 計算彎矩,它們應該在半徑為 r 的圓形區(qū)域中,其中 r 是補丁的大小?,F(xiàn)在對于描述符,ORB 使用 BRIEF 描述符。BRIEF是旋轉(zhuǎn)不變的,因此ORB根據(jù)關(guān)鍵點的方向來操縱BRIEF。對于位置 xi,yi 處的 n 個二進制測試的任何特征集,定義一個 2 x n 矩陣 S,其中包含這些像素的坐標。然后利用貼片的方向θ,找到它的旋轉(zhuǎn)矩陣,旋轉(zhuǎn)S得到轉(zhuǎn)向(旋轉(zhuǎn))版本Sθ。
????????隨著輪換的不變,BRIEF變得更加分散。ORB 在所有可能的二元檢驗中運行貪婪搜索,以找到方差高且均值接近 0.5 且不相關(guān)的檢驗。結(jié)果稱為?rBRIEF。對于描述符匹配,使用了在傳統(tǒng)LSH基礎上改進的多探針LSH。
OpenCV 中的 ORB:
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)# Initiate STAR detector
orb = cv2.ORB()# find the keypoints with ORB
kp = orb.detect(img,None)# compute the descriptors with ORB
kp, des = orb.compute(img, kp)# draw only keypoints location,not size and orientation
img2 = cv2.drawKeypoints(img,kp,color=(0,255,0), flags=0)
plt.imshow(img2),plt.show()
使用 ORB 進行圖像匹配