OpenCV4學習筆記(40)——FAST特徵提取算法與BRIEF特徵描述算法

在上一篇博文《OpenCV4學習筆記(38)》中記錄的SIFT算法是一種包含了特徵提取和描述的算法,而今天要整理記錄的是分別對應於圖像特徵的提取和描述兩個方面的FAST特徵提取算法和BRIEF特徵描述算法。

  • FAST特徵提取算法
    FAST(Features from Accelerated Segment Test-加速段測試特徵)特徵點提取算法,是一種簡單快速的特徵提取算法,因爲其具有比較快的運算速度和還算不錯的特徵提取效果而被廣泛應用於實時檢測系統中。但是對於某些由於光照不均勻或存在陰影等因素而導致局部對比度不同的圖像,FAST算法提取特徵的適應性和特徵提取效果都很不理想。

    FAST特徵點提取算法的主要思想如下,通過檢測某一個像素點的鄰域中是否存在足夠多的、連續的、大於或小於該中心像素點灰度值的像素點,如果存在則表明該中心像素點可以作爲被檢測出的特徵點,如果鄰域中不存在這樣連續的滿足條件的像素點,則該中心像素點作爲非特徵點被淘汰掉。

    假設一箇中心像素點p,以半徑爲3的離散圓選擇其鄰域像素,則中心像素點p被16個像素點包圍,並將這十六個鄰域像素點編號如下:

     				         			16  1  2
								 15					3										
							  14						4		
							  13		   p			5
							  12						6
								 11					7
									    10  9  8

如果在p點的16個鄰域像素點中存在n個連續的像素點,每個像素點的灰度值都比 I(p)+t 要大,或者是都比 I(p)-t 要小,則中心像素點p爲特徵點。(t爲閾值,I(p)爲p點灰度值)

而當選擇 n = 12 纔可以滿足條件時,可以通過以下兩個步驟快速排除非特徵點:
(1)計算 delta1 = | I(1)- I(p) | , delta9 = | I(9)- I(p) | ,如果delta1和delta9都小於閾值t,則中心像素點p作爲非特徵點被淘汰,否則作爲候選特徵點進入下一步檢測;

(2)計算 delta5 = | I(5)- I(p) | , delta13 = | I(13)- I(p) | ,如果delta5、delta13、delta1、delta9中有三項大於閾值t,則中心像素點p作爲特徵點,否則作爲非特徵點被淘汰。

經過上述兩個步驟,就得到使用FAST算法提取出來的特徵點了。

算法過程中的閾值t,是FAST算法所能檢測到的特徵點的最小對比度,也是接受噪聲的最大限度。由於傳統FAST算法中的閾值t是固定值,導致其魯棒性較差,對於光照不均勻、局部對比度不同的圖像,很難達到比較好的檢測效果。可以通過自適應閾值來優化FAST算法,使閾值t隨着圖像局部對比度的變化而變化,從而改進FAST算法的特徵點提取效果。

在OpenCV中,已經封裝好了FAST算法的API,也就是FastFeatureDetector這一個類。當我們使用這個算法時,需要先通過FastFeatureDetector::create()這個方法來創建一個FAST特徵檢測器,其參數含義如下:

第一個參數thresh:就是算法過程中的閾值t,默認值爲10;

第二個參數nonmaxSuppresiion:布爾值,默認值爲true,表示是否使用非極大值抑制,如果爲true則當某個中心像素點的灰度值不是其鄰域中的最大值時,則將其淘汰掉,只保留在鄰域中是最大值的中心像素點;如果爲false則表示不使用非極大值抑制;

第三個參數DetectorType:檢測鄰域類型,有TYPE_5_8 、TYPE_7_12 、TYPE_9_16這幾種可選類型,默認值爲TYPE_9_16。

當我們創建好FAST特徵檢測器後,就可以通過detect()方法來對圖像進行FAST特徵點檢測,得到一幅圖像的KeyPoint類型的FAST特徵點。

下面是代碼演示:

	auto fast = FastFeatureDetector::create(20,true,FastFeatureDetector::DetectorType::TYPE_9_16);
	Mat image = imread("D:\\opencv_c++\\opencv_tutorial\\data\\images\\tem.jpg");
	vector<KeyPoint> keyPoints;
	fast->detect(image, keyPoints, Mat());
	Mat result;
	drawKeypoints(image, keyPoints, result, Scalar::all(-1), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
	imshow("image", image);
	imshow("result", result);
	

看一下提取出的FAST特徵點:
在這裏插入圖片描述
在這裏插入圖片描述

完成了特徵提取後,還需要對特徵點起個別名,也就是進行特徵描述的工作。

  • BEIEF特徵描述算法
    BRIEF(Binary Robust IndependentElementary Features-二進制健壯獨立特徵)特徵描述算法僅僅是一種計算特徵描述子的算法,它的作用就是來給特徵點起別名,所以需要事先提取出特徵點。

    可以利用FAST特徵點提取算法或Harris、shi-tomas角點檢測算法或SIFT、SURF等算法事先提取出圖像特徵點,接下來再在特徵點鄰域利用BRIEF算法建立特徵的二進制描述子。

    在OpenCV官方文檔中,推薦使用STAR特徵檢測算法與BRIEF特徵描述算法相結合使用。其中,STAR是派生自CenSurE的特徵檢測器。但是與CenSurE不同,CenSurE使用正方形,六邊形和八邊形等多邊形逼近一個圓,而Star模擬一個具有2個重疊正方形的圓:1個垂直正方形和1個45度旋轉角度。這些多邊形是雙層的。可以將它們視爲具有粗邊框的多邊形。邊界和封閉區域的權重爲相反的符號。與其他尺度空間檢測器相比,它具有更好的計算特性,並且能夠實時實現。與SIFT和SURF相比,在子採樣像素處發現極值會損害較大尺度的精度,與此相反,CenSurE使用金字塔中所有尺度的完整空間分辨率來創建特徵向量。在官方文檔中建議使用STAR特徵檢測,它是一種快速檢測器,對於STAR特徵點,BRIEF的效果甚至比SURF點略好。

    BRIEF特徵描述算法的主要步驟如下:

    1、對圖像進行高斯模糊,消除噪聲干擾,由於BRIEF算法是以具體像素值爲基礎來計算的,所以對噪聲很敏感;

    2、以每個特徵點爲中心像素點,選取其尺寸爲SxS的鄰域(如9x9),並且在鄰域中通過某些隨機算法來隨機抽取兩個點組成一個點對<p , q>,假如p像素點的像素值大於q像素點的像素值,則返回1;如果p像素點的像素值小於q像素點的像素值,則返回0;
    有研究表明,當選取的兩個隨機點p、q都符合[ 0, (1 / 25) * S^2 ]的高斯分佈時,最後獲得的效果比較好;

    3、重複步驟2 N次,獲取一段N bit的二進制編碼。一般選擇重複256次來獲得一段256bit的二進制編碼,這就是該特徵點的二進制描述子。

    BRIEF算法的優勢是利用二進制編碼來獲取描述子,只是進行簡單的灰度值對比而不涉及大量複雜的計算,所以其運算速度很快。但是也正是因爲它基於圖像的具體像素值來運算,所以導致該算法對噪聲非常敏感,而且不具有旋轉不變性和尺度不變性,其魯棒性會比較差一些。

如果今天整理將FAST特徵提取算法和BRIEF特徵描述算法結合起來,就可以對圖像實現簡單的目標檢測、目標匹配等操作了,下次的筆記就來整理記錄一下基於上述兩種算法改進而來的特徵提取描述算法——ORB算法。那麼今天的筆記內容就到此爲止了,謝謝閱讀~

PS:本人的註釋比較雜,既有自己的心得體會也有網上查閱資料時摘抄下的知識內容,所以如有雷同,純屬我向前輩學習的致敬,如果有前輩覺得我的筆記內容侵犯了您的知識產權,請和我聯繫,我會將涉及到的博文內容刪除,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章