【火爐煉AI】機器學習050-提取影像的Star特徵
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
對於影像的特徵點,前面我們討論過邊緣檢測方法,Harris角點檢測演算法等,這些檢測演算法檢測的都是影像的輪廓邊緣,而不是內部細節,如果要進一步提取影像內部細節方面的特徵,需要用到SIFT特徵提取器和Star特徵提取器。上一篇我們講解了SIFT特徵提取器,下面我們來介紹Star特徵提取器。
在博文特徵點的基本概念和如何找到它們中提到,OpenCV中具有以下特徵點模型:(這些函式的使用也同樣適用於OpenCV-Python)
1、Harris-Shi-Tomasi特徵檢測器和cv :: GoodFeaturesToTrackDetector
最常用的角點定義是由哈里斯[Harris88]提出的, 這些角點,被稱為哈爾角點,可以被認為是原始的關鍵點;而後被Shi和Tomasi [Shi94]進行了進一步擴充套件,後者被證明對於大多數跟蹤應用來說是優越的。由於歷史原因,在OpenCV中叫做”GoodFeatures";
2、簡單的blob檢測器和cv :: SimpleBlobDetector
提出“斑點”的概念。斑點本質上沒有那麼明確的區域性化,而是表示可能預期隨時間具有一定穩定性的感興趣區域。
3、FAST特徵檢測器和cv :: FastFeatureDetector
最初由Rosten和Drummond [Rosten06]提出的FAST(加速段測試的特徵),其基本思想是,如果附近的幾個點與P類似,那麼P將成為一個很好的關鍵點。
4、SIFT特徵檢測器和cv :: xfeatures2d :: SIFT
由David Lowe最初於2004年提出的SIFT特徵(尺度不變特徵變換)[Lowe04]被廣泛使用,是許多隨後開發的特徵的基礎;SIFT特徵計算花銷很大,但是具有高度的表達能力。
5、SURF特徵檢測器和cv :: xfeatures2d :: SURF
SURF特徵(加速魯棒特徵)最初由Bay等人於2006年提出[Bay06,Bay08],並且在許多方面是我們剛剛討論的SIFT特徵的演變。SURF所產生的特徵不僅計算速度快得多,並且在許多情況下,它對SIFT特徵觀察到的方向或照明變化的魯棒性也更強。
6、Star / CenSurE特徵檢測器和cv :: xfeatures2d :: StarDetector
Star特徵,也被稱為中心環繞極值(或CenSurE)功能,試圖解決提供哈爾角點或FAST特徵的區域性化水平的問題,同時還提供尺度不變性。
7、BRIEF描述符提取器和cv :: BriefDescriptorExtractor
BRIEF,即二進位制魯棒獨立基本特徵,是一種相對較新的演算法,BRIEF不找到關鍵點;相反,它用於生成可通過任何其他可用的特徵檢測器演算法定位的關鍵點的描述符。
8、BRISK演算法
Leutenegger等人介紹的BRISK40描述符,試圖以兩種不同的方式改進Brief(Leutenegger11)。 首先,BRISK引入了自己的一個特徵檢測器(回想一下,Brief只是一種計算描述符的方法)。 其次,BRISK的特徵本身雖然與BRIEF原則相似,卻嘗試以提高整體功能的魯棒性的方式進行二值比較。
9、ORB特徵檢測器和cv :: ORB
建立了ORB功能[Rublee11],其目標是為SIFT或SURF提供更高速的替代品。ORB功能使用非常接近於FAST(我們在本章前面看到的)的關鍵點檢測器,但是使用了基本上不同的描述符,主要基於BRIEF。
10、FREAK描述符提取器和cv :: xfeatures2d :: FREAK
FREAK描述符最初是作為Brief,BRISK和ORB的改進引入的,它是一個生物啟發式的描述符,其功能非常類似於BRIEF,主要在於它計算二進位制比較的領域的方式[Alahi12]。
11、稠密特徵網格和cv :: DenseFeatureDetector類
cv :: DenseFeatureDetector class53的目的只是在影像中的網格中生成一個規則的特徵陣列。
1. 使用Star提取影像特徵點
具體程式碼和我上一篇文章很類似,可以先看看【火爐煉AI】機器學習049-提取影像的SIFT特徵點
star = cv2.xfeatures2d.StarDetector_create() # 構建Star特徵點檢測器物件
keypoints = star.detect(gray, None) # 用Star特徵點檢測器物件檢測灰度圖中的特徵點
複製程式碼
# 將keypoints繪製到原圖中
img_sift = np.copy(img)
cv2.drawKeypoints(img, keypoints, img_sift, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
#畫在原圖上,第一個是原圖,第二個image是目標圖,這個flags既包括位置又包括方向,也有隻有位置的flags
#圓圈的大小表示特徵的重要性大小,主要在桌子腿上,腿上邊緣和稜角比較多,更有代表性
# 顯示繪製有特徵點的影像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title('Raw Img')
plt.subplot(122)
img_sift_rgb=cv2.cvtColor(img_sift,cv2.COLOR_BGR2RGB)
plt.imshow(img_sift_rgb)
plt.title('Img with Star features')
複製程式碼
########################小**********結###############################
1,Star特徵點的提取方法在程式碼上很容易實現,cv2.xfeatures2d.StarDetector_create()這個函式就可以構建Star檢測器並用detect方法就可以實現。
2,Star特徵點提取器和SIFT特徵點提取器的結果有很多相似之處,都是在桌腿附近有很多特徵點。
#################################################################
注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯