影象特徵檢測描述(一):SIFT、SURF、ORB、HOG、LBP特徵的原理概述及OpenCV程式碼實現
什麼叫特徵檢測?就是檢測影象中目標的特徵唄,所謂特徵,不管你怎麼旋轉目標,離目標遠近,它的特徵都應不變才對,這兩個特性稱為叫旋轉不變性和尺度不變性。當然還有其它特徵,如光照不一樣,也不應該變化嘛,只是旋轉不變性和尺度不變性是最基本的兩個要求。
對特徵的描述有很多種方法和運算元,常見的有SIFT特徵描述運算元、SURF特徵描述運算元、ORB特徵描述運算元、HOG特徵描述、LBP特徵描述以及Harr特徵描述。本文先介紹SIFT特徵描述運算元、SURF特徵描述運算元、ORB特徵描述運算元、HOG特徵描述、LBP特徵描述的原理及OpenCV程式碼襪現,當然我只能大概介紹,如果要了解詳細原理,請檢視相應的論文及資料。
一、SIFT特徵描述運算元
SIFT是目前應用最廣泛的關鍵點檢測和描述演算法(PS:具體是不是這樣,博主也不清楚,只是資料上是這麼寫得,因為它的演算法複雜度是很高的?這樣也能用最字來描述麼?那你讓後面我要提到的ORB特徵描述怎麼想?),SITFT演算法首先被David.G.Lowe提出並發表在文章“Distinctive Image Features from Scale-Invariant Keypoints”中,其中Scale-Invariant的意思是尺度不變性,尺度不變性的概念我在本博文的第一段已經敘述了。SIFT特徵提取充分利用了影象區域性資訊,它包含以下優點:
⑴SIFT特徵具有旋轉、尺度、平移、視角及亮度不變性,有利於對目標特徵資訊進行有效表達。
⑵SIFT特徵對引數調整魯棒性好,在進行特徵描述時,根據場景需要可調整適宜的特徵點數量,以便進行特徵分析。
SIFT特徵演算法對影象區域性特徵點的提取主要包括4個步驟:疑似特徵點檢測、去除偽特徵點、特徵點梯度與方向匹配及特徵描述向量生成。
SITF的缺點是如果不借助硬體加速或專門的影象處理器很難達到實現。
步驟1-疑似特徵點檢測
特徵點在某些情況下是影象中的角點,然而由於SIFT特徵需要特徵點包含尺度及方向,因此需要建立相應的影象尺度空間,高斯函式是唯一可以產生尺度空間的核因子。讓影象與高斯函式卷積可以實現多尺度操作(你可以聯想前面介紹的影象縮放中的高斯金字塔來理解這一點)。對原始特徵點作進一步過濾時不被濾掉的條件是:該點需要滿足上下尺度平面集在進行差分高斯操作時對應的26個點中的極值,26個點分別是上平面對應的9個檢測點,待檢測平面鄰域點8個,下平面對應的9個檢測點。(PS:不需要完全看懂判斷條件,因為你不懂原理是不可能看懂的
步驟2-去除偽特徵點
上一步驟得到的疑似特徵點,高斯差分運算元對邊緣及噪聲相對敏感,會產生偽邊緣資訊和偽極值響應資訊。可以通過分析高斯差分運算元的特性來去除因上述原因造成的偽特徵點。具體怎麼分析,我這裡就不作介紹了,有需要了解的可以去查閱相關論文和資料。
步驟3-特徵點梯度及方向分配
通過前面兩步只實現了影象尺度不變性的特徵提取,在這一部實現旋轉不變性特徵的提取。具體的計算方法我這裡就不多說了,因為不是一兩句話能說清楚的,沒有學習過演算法本身的話根本是理解不到的,所以大家如果要知道還不如去看演算法提出的論文。
步驟4-特徵描述:特徵向量生成
特徵描述通常是指把影象中的特徵點的特徵生成向量的過程。每個SIFT特徵包含128維特徵。具體這128維特徵的結構為16×8=128
OpenCV提供了類SiftFeatureDetector和SiftDescriptorExtractor來實現SIFT特徵檢測,具體怎麼用,大家一看程式碼就知道了,這裡就不再敘述了。值得注意的是,SIFT和下面要介紹的SURF的原始碼都在OpenCV的nonfree模組中,意思是這是有知識版權保護的演算法,如果要使用,可能要向原作者給版權費哦,在OpenCV的3.0.0版中,還沒有SIFT和SURF演算法,所以我只好換回到了2.4.13版,實現程式碼如下:
執行結果如下圖所示:
二、SURF特徵描述運算元
前面提到SITF的缺點是如果不借助硬體加速或專門的影象處理器很難達到實現,所以人們就要想辦法對SITF運算元進行改進,SURF運算元便是對SIFT的改進,不過改進之後在演算法的執行時間上還是沒有質的飛躍,後文要介紹的ORB特徵描述運算元在執行時間上才是一種質的飛躍,後文會介紹ORB特徵描述運算元,說回來,這一部分咱們說SURF運算元。
SURF特徵描述子是Herbert Bay等人在2006年發表的論文“SURF:Speeded Up Robust Features”中提出的,正如我上一段所述,該演算法對經典SIFT特徵進行了改進,但是改進之後效能提升還是有限的。
SURF主要是把SIFT中的某些運算作了簡化。SURF把SIFT中的高斯二階微分的模板進行了簡化,使得卷積平滑操作僅需要轉換成加減運算,這樣使得SURF演算法的魯棒性好且時間複雜度低。SURF最終成生的特徵點特徵向量的維度為64維。
OpenCV提供了類SurfFeatureDetector和SurfDescriptorExtractor來實現SURF特徵檢測,具體怎麼用,大家一看程式碼就知道了,這裡就不再敘述了。值得注意的是,SIFT和下面要介紹的SURF的原始碼都在OpenCV的nonfree模組中,意思是這是有知識版權保護的演算法,如果要使用,可能要向原作者給版權費哦,在OpenCV的3.0.0版中,還沒有SIFT和SURF演算法,所以我只好換回到了2.4.13版,實現程式碼如下:
執行結果如下圖所示:
三、ORB特徵描述
ORB特徵描述演算法的執行時間遠優於SIFT與SURF,可用於實時性特徵檢測。ORB特徵基於FAST角點的特徵點檢測與描述技術,該演算法是Ethan Rubleed 在論文“ORB:An efficient alternative to SIFT or SURF”中提出的。ORB特徵具有尺度與旋轉不變性,同時對噪聲及透視仿射也具有不變性,良好的效能使得得用ORB在進行特徵描述時的應用場景十分廣泛。
ORB特徵檢測主要分為以下兩個步驟。
步驟①方向FAST特徵點檢測
FAST角點檢測是一種基於機器學習的快速角點特徵檢測演算法,具有方向的FAST特徵點檢測是對興趣點所在圓周上的16個畫素點進行判斷,若判斷後的當前中心畫素點為暗或亮,將瘊定其是否為角點。前面我已經寫了一篇博文(moravec、harris、Shi-Tomasi角點檢測的簡介及OpenCV程式碼實現)介紹角點檢測的常用方法,FAST角點檢測相對於這些方法來說,計算的時間複雜度小,檢測效果突出。FAST角點檢測為加速演算法實現,通常先對回週上的點集進行排序,排序使得其計算過程大大得到了優化。FAST對多尺度特性的描述是還是通過建立影象金字塔實現的,而對於旋轉不變性即方向的特徵則引入灰度質心法用於描述特徵點的方向。
步驟②BRIEF特徵描述
BRIEF描述子主要是通過隨機選取興趣點周圍區域的若干點來組成小興趣區域,將這些小興趣區域的灰度二值化並解析成二進位制碼串,將串特徵作為該特徵點的描述子,BRIEF描述子選取關鍵點附近的區域並對每一位比較其強度大小,然後根據影象塊中兩個二進位制點來判斷當前關鍵點編碼是0還是1.因為BRIEF描述子的所有編碼都是二進位制數的,這樣就節省了計算機儲存空間。
OpenCV提供了類ORB來實現ORB特徵檢測,程式碼如下:
程式碼執行結果如下圖所示:
四、方向梯度直方圖HOG
方向梯度直方圖(Histogram of Oriented Gradient,HOG)特徵是Dalal於2005年針對行人檢測問題提出的直方圖特徵,常應用於目標物體檢測與特徵分析,HOG特徵描述在行人檢測演算法中效能表現優秀,結合SVM分類技術已廣泛應用在影象識別與分析領域。HOG是通過計算和統計影象區域性區域的梯度方向直方圖來實現特徵描述的。至於有沒有旋轉不變性和尺度不變性,博主暫且不知。
影象梯度方向直方圖將影象劃分成小部分連通區域,對這些劃分出來的細胞單元各個畫素點進行梯度方向的的直方圖描述,最後級合成相應的特徵描述器。梯度方向直方圖特徵提取步驟如下:
①歸一化處理。歸一化操作是為了提高影象特徵描述對光照及環境變化的魯棒性,降低影象區域性的陰影、區域性曝光過多及紋理失真,儘可能抵制噪聲干擾。歸一化處理操作是先將影象轉換為灰度影象,再利用伽馬校正實現。
②計算影象梯度。
③統計梯度方向。
④特徵向量歸一化。為克服光照不均勻變化及前景與背景的對比差異,需要對塊內的特徵向量進行歸一化處理。
⑤生成特徵向量。
OpenCV中提供了專門用於HOG特徵檢測的類HOGDescriptor,該類提供了多種成員函式方法,HOGDesciptor方法完成HOG初始化引數,行人檢測預設引數實現方法getDefaultPeopleDetector,目標單尺度檢測方法是detect,目標多尺度檢測方法是detectMultiScale。在這篇博文中,不用OpenCV提供的這個現成的類實現HOG實現檢測,等會兒貼出的程式碼是使用者自己寫的程式碼,以後有空再上使用類HOGDescriptor實現HOG檢測的程式碼。下面說下等兒貼出的程式碼的實現思路(PS:思路只是作個大概描述,如果真要看懂,還是要先把原理搞清楚的)。
步驟① 在進行HOG特徵描述實現時,需要完成對積分圖的計算。首先對源影象進行水平與豎直方向的Sobel邊緣檢測;初始化直方圖bins,將Sobel檢測結果利用cartToPolar進行座標轉換,再將對應的矩陣角度進行分段變換;然後遍歷影象,計算對應角度下的bins幅值,進而生成對應的區域積分圖。這部分在程式碼中對應的函式名為CalculateIntegralHOG.
步驟② HOG特徵計算。傳統HOG特徵計算的時間複雜度較高,在實際進行特徵描述時一般採用積分直方圖來代替,畫素點(x,y)積分直方圖為梯度影象中滿足矩形區域所有畫素點的梯度方向直方圖。這部分在程式碼中對應的函式名為cacHOGinCell.
步驟③ 利用前面兩步的結果生成相應的方向梯度直方圖牲,繪製HOG特徵圖。
HOG特徵提取演算法流程如下圖所示:
執行結果如下圖所示:
五、區域性二值模式LBP
LBP(Local Binary Pattern),區域性二值模式是一種描述影象區域性紋理的特徵運算元,該運算元是由T.Ojala等人於1994年首次提出的,後經過發展改進可應用於影象特徵分析,該運算元具有旋轉不變性與灰度不變性等顯著優點。LBP特徵描述的是一種灰度範圍內的影象處理操作技術,針對的是輸入源為8位或16位的灰度影象。LBP特徵是高效的影象特徵分析方法,經過改進與發展已經應用於多個領域之中,特別是人臉識別、表情識別、行人檢測領域已經取得了成功。LBP牲徵將視窗中心點與鄰域點的關係進行比較,重新編碼形成新特徵以消除對外界場景對影象的影響,因此一定程度上解決了複雜場景下(光照變換)特徵描述問題。
LBP演算法根據視窗領域的不同分為經曲LBP和圓形LBP兩種。下面分別介紹:
①經典LBP
經典LBP的運算元視窗為3×3的正方形視窗,以視窗中心畫素為閾值,將其相鄰8領域畫素灰度與中心畫素值比較,若中心畫素值小於周圍畫素值,則該中心畫素位置被標記為1,否則為0(顯然這種規則下,對於中心點大於或等於這兩種情況,演算法無法區分,後續經過改進引入LBP+與LBP-因子用來區分這兩種情況)。影象經過這種遍歷操作後,影象就被二值化了,每一個視窗中心的8鄰域點都可以由8位二進位制數來表示,即可產生256種LBP碼,這個LBP碼值可以用來反映視窗的區域紋理資訊。LBP具體在生成的過程中,先將願意影象劃分為若干個子區域,子區域視窗可根據原影象的尺寸進行調整,而不一定非得為3×3的正方形視窗。一般對於512×640的影象,子區域視窗區域選取大小為16×16.
②圓形LBP
經典LBP用正方形8-領域來描述影象的紋理特徵,其缺點是難以滿足不同尺寸和頻率的需求。Ojala等人對經典LBP進行了改進,提出了將3×3的正方形視窗領域擴充套件到任意圓形領域。由於圓形LBP取樣點在圓形邊界上,那麼必然會導致部分計算出來的取樣點座標不是整數,因此這裡就需要對得到的座標畫素點值進行處理,常用的處理方法是最近鄰插值或雙線性插值。
OpenCV中提供了模板類LBP來實現LBP演算法,LBP的相關操作存放在facerec.cpp中。這裡我們不使用LBP類來實現LBP演算法,因為經典LBP演算法實現起來很簡單,於是自己寫程式碼,以後有緣再補充使用OpenCV的LBP類來實現LBP演算法的程式碼。
經典LBP的實現程式碼如下:
執行結果如下圖所示: