OpenCv學習筆記11--SURF特徵提取演算法
阿新 • • 發佈:2019-02-18
此opencv系列部落格只是為了記錄本人對<<opencv3計算機視覺-pyhton語言實現>>的學習筆記,所有程式碼在我的github主頁https://github.com/RenDong3/OpenCV_Notes.
歡迎star,不定時更新...
上一節我們已經介紹了SIFT演算法,SIFT演算法對旋轉、尺度縮放、亮度變化等保持不變性,對視角變換、仿射變化、噪聲也保持一定程度的穩定性,是一種非常優秀的區域性特徵描述演算法。但是其實時性相對不高。
SURF(Speeded Up Robust Features)演算法改進了特徵了提取和描述方式,用一種更為高效的方式完成特徵點的提取和描述。
一 使用快速Hessian演算法和SURF來提取和檢測特徵
我們先用OpenCV庫函式演示一下快速Hessian演算法和SURF來提取的效果,然後再來講述一下SURF演算法的原理。
SURF特徵檢測演算法由Herbert Lowe於2006年發表,該演算法比SIFT演算法快好幾倍,它吸收了SIFT演算法的思想。
SURF演算法採用快速Hessian演算法檢測關鍵點,而SURF運算元會通過一個特徵向量來描述關鍵點周圍區域的情況。這和SIFT演算法很像,SIFT演算法分別採用DoG和SIFT運算元來檢測關鍵點和提取關鍵點的描述符。下面我們來演示一個例子:
# -*- coding:utf-8 -*- import os import cv2 import numpy as np ''' created on 09:05:10 2018-11-22 @author ren_dong 使用快速Hessian演算法和SURF來提取和檢測特徵 ''' img = cv2.imread('chess.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #建立一個SURF物件 surf = cv2.xfeatures2d.SURF_create(20000) #SURF演算法使用Hessian演算法計算關鍵點,並且在關鍵點周圍區域計算特徵向量,該函式返回關鍵點的資訊和描述符 keypoints, descriptor = surf.detectAndCompute(gray, None) print descriptor.shape print len(keypoints) img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints, flags=4, color=(51, 163, 236)) cv2.imshow('SURF', img) cv2.waitKey() cv2.destroyAllWindows()
我們把Hessian閾值設定為20000,閾值越高,能識別的特徵就越少,因此可以採用試探法來得到最優檢測。
SURF特徵檢測的步驟
- 尺度空間的極值檢測:搜尋所有尺度空間上的影象,通過Hessian來識別潛在的對尺度和選擇不變的興趣點。
- 特徵點過濾並進行精確定位。
- 特徵方向賦值:統計特徵點圓形鄰域內的Harr小波特徵。即在60度扇形內,每次將60度扇形區域旋轉0.2弧度進行統計,將值最大的那個扇形的方向作為該特徵點的主方向。
- 特徵點描述:沿著特徵點主方向周圍的鄰域內,取4×44×4個矩形小區域,統計每個小區域的Haar特徵,然後每個區域得到一個4維的特徵向量。一個特徵點共有64維的特徵向量作為SURF特徵的描述子。
請注意,這裡並未對SURF演算法詳細原理進行介紹,感興趣的同學可以移步去大神的部落格瀏覽觀看,下面給出連結: