1. 程式人生 > >OpenCv學習筆記11--SURF特徵提取演算法

OpenCv學習筆記11--SURF特徵提取演算法

此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特徵檢測的步驟

  1. 尺度空間的極值檢測:搜尋所有尺度空間上的影象,通過Hessian來識別潛在的對尺度和選擇不變的興趣點。
  2. 特徵點過濾並進行精確定位。
  3. 特徵方向賦值:統計特徵點圓形鄰域內的Harr小波特徵。即在60度扇形內,每次將60度扇形區域旋轉0.2弧度進行統計,將值最大的那個扇形的方向作為該特徵點的主方向。
  4. 特徵點描述:沿著特徵點主方向周圍的鄰域內,取4×44×4個矩形小區域,統計每個小區域的Haar特徵,然後每個區域得到一個4維的特徵向量。一個特徵點共有64維的特徵向量作為SURF特徵的描述子。

 請注意,這裡並未對SURF演算法詳細原理進行介紹,感興趣的同學可以移步去大神的部落格瀏覽觀看,下面給出連結: