1. 程式人生 > >opencv 特徵點提取演算法 SIFT SURF ORB FAST LBP學習(一)

opencv 特徵點提取演算法 SIFT SURF ORB FAST LBP學習(一)

opencv 特徵點提取演算法 SIFT SURF ORB FAST LBP學習

特徵點:
又稱興趣點、關鍵點,它是影象中突出且具有代表意義的一些點,通過這些點我們可以用來表徵、識別影象、進行影象配準、進行3D重建等
旋轉不變性和尺度不變性
角點:
最直觀的印象就是在水平、豎直兩個方向上變化均較大的點,即Ix、Iy都較大,角點的具體描述有幾種:
一階導數(即灰度的梯度)的區域性最大所對應的畫素點;
兩條及兩條以上邊緣的交點;
影象中梯度值和梯度方向的變化速率都很高的點;
角點處的一階導數最大,二階導數為零,指示物體邊緣變化不連續的方向
邊緣:僅在水平、或者僅在豎直方向有較大的變化量,即Ix和Iy只有其一較大

Harris角點檢測演算法就是對角點響應函式R進行閾值處理:R > threshold,即提取R的區域性極大值

SIFT
尺度不變特徵變換演算法,特徵點的主方向是由梯度直方圖的最大值和次大值所在的bin對應的方向決定的
優點:
1)SIFT特徵具有旋轉、尺度、平移、視角及亮度不變性,有利於對目標特徵資訊進行有效表達。
2)SIFT特徵對引數調整魯棒性好,在進行特徵描述時,根據場景需要可調整適宜的特徵點數量,以便進行特徵分析。
SIFT特徵演算法對影象區域性特徵點的提取主要包括4個步驟:
疑似特徵點檢測、
去除偽特徵點、
特徵點梯度與方向匹配
特徵描述向量生成:
特徵描述通常是指把影象中的特徵點的特徵生成向量的過程。
每個SIFT特徵包含128維特徵,結構為16×8=128

SURF
Speeded Up Robust Features SURF運算元是對SIFT的改進,比SIFT效率要高,類似於SIFT特徵的一種尺度不變的特徵點。
SURF主要是把SIFT中的某些運算作了簡化。SURF把SIFT中的高斯二階微分的模板進行了簡化,使得卷積平滑操作僅需要轉換成加減運算,這樣使得SURF演算法的魯棒性好且時間複雜度低。SURF最終成生的特徵點特徵向量的維度為64維。
SURF最大的特徵在於採用了harr特徵以及積分影象的概念,這大大加快了程式的執行時間。

BRIEF
Binary Robust Independent Elementary Features,在特徵點附近隨機選取若干點對,將這些點對的灰度值的大小,
組合成一個二進位制串,並將這個二進位制串作為該特徵點的特徵描述子(即BRIEF描述子中的每一位是由隨機選取的兩個畫素點做二進位制比較得來,BRIEF描述子的所有編碼都是二進位制數的)
BRIEF的優點在於速度,缺點也相當明顯:
1:不具備旋轉不變性。
2:對噪聲敏感
3:不具備尺度不變性。

ORB
ORiented Brief,特徵點的主方向是通過矩(moment)計算而來,ORB是sift的100倍,是surf的10倍
Orient brief ORB特徵基於FAST角點的特徵點檢測與描述技術,執行時間遠優於SIFT與SURF,可用於實時性特徵檢測。
ORB特徵具有尺度與旋轉不變性,同時對噪聲及透視仿射也具有不變性

FAST角點定義:
若某畫素點與其周圍領域內足夠多的畫素點處於不同的區域,則該畫素點可能為角點
(考慮灰度影象,即若該點的灰度值比其周圍領域內足夠多的畫素點的灰度值大或者小,則該點可能為角點)

FAST
Features From Accelerated SegmentTest
FAST是比較快速的特徵點檢測方法,只利用周圍畫素比較的資訊就可以得到特徵點,比其他已知的角點檢測演算法要快很多
FAST不產生多尺度特徵而且FAST特徵點沒有方向資訊,這樣就會失去旋轉不變性

Shi-Tomasi演算法
Shi-Tomasi演算法是Harris 演算法的改進。Harris 演算法最原始的定義是將矩陣 M 的行列式值與 M 的跡相減,再將差值同預先給定的閾值進行比較。
後來Shi 和Tomasi 提出改進的方法,若兩個特徵值中較小的一個大於最小閾值,則會得到強角點

class CV_EXPORTS_W FastFeatureDetector : public FeatureDetector {
public:
    enum{ // Define it in old class to simplify migration to 2.5
      TYPE_5_8 = 0, TYPE_7_12 = 1, TYPE_9_16 = 2
    };
    CV_WRAP FastFeatureDetector( int threshold=10, bool nonmaxSuppression=true );
    AlgorithmInfo* info() const;
protected:
    virtual void detectImpl( const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const;
    int threshold;
    bool nonmaxSuppression;
};

//! computes Harris cornerness criteria at each image pixel
CV_EXPORTS_W void cornerHarris( InputArray src, OutputArray dst, int blockSize,
                                int ksize, double k,
                                int borderType=BORDER_DEFAULT );

src輸入影象
dst輸出影象,輸入是一個灰度影象,輸出是一個浮點影象,
blockSize
指定角點分析的鄰域,
ksize
實際上在角點求取過程中計算梯度影象的核視窗大小,
k 一個係數
borderType 邊框型別

//! finds the strong enough corners where the cornerMinEigenVal() or cornerHarris() report the local maxima
CV_EXPORTS_W void goodFeaturesToTrack( InputArray image, OutputArray corners,
                                     int maxCorners, double qualityLevel, double minDistance,
                                     InputArray mask=noArray(), int blockSize=3,
                                     bool useHarrisDetector=false, double k=0.04 );

進行角點檢測
image
要進行檢測的影象,須為8位或32位單通道影象
corners
儲存檢測到的角點座標,Point2f型別
maxCorners
檢測到的角點的最大數目
qualityLevel
角點的閾值條件,即角點的質量等級:qualityLevel*max(min(e1,e2))
minDistance
容忍距離,單位畫素
mask
一幅畫素值為bool型別的影象,用於指定輸入影象中參與角點計算的畫素點。如果mask為NULL,則選擇整個影象
blockSize
計算導數的自相關矩陣時指定的鄰域
useHarrisDetector
是否使用Harris檢測器Shi-Tomasi
k
一個係數,cornerHarris中的K

LBP
Local Binary Pattern 區域性二值模式,是一種描述影象區域性紋理的特徵運算元,可應用於影象特徵分析,如:人臉識別、表情識別、行人檢測領域
LBP特徵描述的是一種灰度範圍內的影象處理操作技術,針對的是輸入源為8位或16位的灰度影象。
LBP牲徵將視窗中心點與鄰域點的關係進行比較,重新編碼形成新特徵以消除對外界場景對影象的影響,一定程度上解決了複雜場景下(光照變換)特徵描述問題。
LBP特徵具有旋轉不變性與灰度不變性等優點。

LBP演算法根據視窗領域的不同分為:
經曲LBP
經典LBP的運算元視窗為3×3的正方形視窗,以視窗中心畫素為閾值,將其相鄰8領域畫素灰度與中心畫素值比較,若中心畫素值小於周圍畫素值,則該中心畫素位置被標記為1,否則為0
圓形LBP
取樣點在圓形邊界上

對LBP特徵向量進行提取的步驟
1)首先將檢測視窗劃分為16×16的小區域(cell);
2)對於每個cell中的一個畫素,將相鄰的8個畫素的灰度值與其進行比較,若周圍畫素值大於中心畫素值,則該 畫素點的位置被標記為1,否則為0。這樣3*3鄰域內的8個點經比較可產生8位二進位制數,即得到該視窗中心畫素點的LBP值;
3)計算每個cell的直方圖,即每個數字(假定是十進位制數LBP值)出現的頻率;然後對該直方圖進行歸一化處理
4)最後將得到的每個cell的統計直方圖進行連線成為一個特徵向量,也就是整幅圖的LBP紋理特徵向量;
然後便可利用SVM或者其他機器學習演算法進行分類了

圓形LBP運算元
LBP旋轉不變模式
LBP等價模式:
等價模式類
混合模式類

LBP的應用中,如紋理分類、人臉分析等,一般都不將LBP圖譜作為特徵向量用於分類識別,而是採用LBP特徵譜的統計直方圖作為特徵向量用於分類識別

HOG
Histogram of Oriented Gradient HOG 方向梯度直方圖, 常應用於目標物體檢測與特徵分析,HOG特徵描述在行人檢測演算法中效能表現優秀,結合SVM分類技術已廣泛應用在影象識別與分析領域。
HOG是通過計算和統計影象區域性區域的梯度方向直方圖來實現特徵描述的。

影象梯度方向直方圖將影象劃分成小部分連通區域,對這些劃分出來的細胞單元各個畫素點進行梯度方向的的直方圖描述,最後級合成相應的特徵描述器。梯度方向

HOG特徵提取演算法實現過程:
HOG特徵提取方法就是將一個image(你要檢測的目標或者掃描視窗):
1)影象灰度化;
2)採用Gamma校正法對輸入影象進行顏色空間的標準化(歸一化),目的是調節影象的對比度,降低影象區域性的陰影和光照變化所造成的影響,同時可以抑制噪音的干擾;
3)計算影象每個畫素的梯度(包括大小和方向),主要是為了捕獲輪廓資訊,同時進一步弱化光照的干擾。
4)將影象劃分成小cells(例如6*6畫素/cell);
5)統計每個cell的梯度直方圖(不同梯度的個數),即可形成每個cell的descriptor;
6)將每幾個cell組成一個block(例如3*3個cell/block),一個block內所有cell的特徵descriptor串聯起來得到該block的HOG特徵descriptor。
7)將影象image內的所有block的HOG特徵descriptor串聯起來就可以得到該image(你要檢測的目標)的HOG特徵descriptor了。這個就是最終的可供分類使用的特徵向量了。

特徵向量維數N,N = ((W–wb )/stride + 1)*((H-hb)/stride+1)*bins*n
其中W為圖片的寬,H為圖片的高,wb和hb為block的寬與高,stride為cell的大小,bins為投影的區塊,n為一個block中包含的cell的個數

//HOG檢測器,用來計算HOG描述子: HOG描述子的維數,由圖片大小、檢測視窗大小、塊大小、細胞單元中直方圖bin個數決定

CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
                  Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
                  int _histogramNormType=HOGDescriptor::L2Hys,
                  double _L2HysThreshold=0.2, bool _gammaCorrection=false,
                  int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)

Haar
特徵分為三類:邊緣特徵(4種)、線性特徵(8種)、中心特徵(2種)和對角線特徵(2種,Haar-like矩形特徵庫作了進一步擴充套件,加入了旋轉45度),組合成特徵模板。
特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值為白色矩形畫素和減去黑色矩形畫素和。
Haar特徵值反映了影象的灰度變化情況

Haar-like特徵的計算—積分圖
積分圖就是隻遍歷一次影象就可以求出影象中所有區域畫素和的快速演算法
積分圖主要的思想:
是將影象從起點開始到各個點所形成的矩形區域畫素之和作為一個數組的元素儲存在記憶體中,當要計算某個區域的畫素和時可以直接索引陣列的元素,不用重新計算這個區域的畫素和,從而加快了計算(也叫做動態規劃演算法)

特徵值的計算過程中,黑色區域的權值為負值,白色區域的權值為正值。而且權值與矩形面積成反比(使兩種矩形區域中畫素數目一致);