角點檢測——發現圖像的特徵

寫在最前

不知不覺,漫談計算機視覺也寫了四篇了,我們從最基本的除噪引出計算機圖形學的各種技術,然後又學會了發現圖像的輪廓發現圖像的邊緣,等等,但是始終沒有接觸一個核心的問題——特徵。我們肯定經常在數據科學或者人工智能領域不斷的聽到這個詞彙,我們之前做的內容比如輪廓發現,計算輪廓面積周長,發現圖像邊緣等等其實也都或多或少能夠在很多牽扯到圖像的領域中用來發現或者創造特徵,但是卻始終沒有直接接觸計算機視覺中的特徵這一概念。而角點檢測算得上是第一次真正的接觸。

角點檢測是什麼?有什麼用?

角點檢測,一如其名,就是檢測圖像中的角點的。本質上角點是一種很容易在圖像中定位的局部特徵,並且廣泛存在於人造物體中,如桌子椅子車子房子等等(自然界中多曲線,這個你可以在散步的時候觀察一下)。另外角點可以被精確地檢測(即使是亞像素級精度)這點對於實用也非常有價值。

至於角點的用處,本質上來說,角點是作爲圖像的一種特徵來使用的。我們可以想象一下拼圖,很明顯角點信息對於圖像的拼接,對齊都有極大的價值,而圖像或者圖像中的物體發生變化時,如圖像檢測,運動追蹤等也同樣具有不小的價值。

OpenCV中的角點檢測

我們的主要工具還是OpenCV,所以還是要主講OpenCV中的角點檢測。比較簡單的角點檢測,OpenCV中的角點檢測主要有Harris角點檢測,Shi-Tomasi角點檢測。除了一般性的角點檢測外,OpenCV中還有一些更正式的基於角點檢測的特徵點檢測算法,如ORB,ASIFT等等。這些正式的特徵點檢測器更適合我們直接使用。不過由淺入深,我們還是需要從最基本的角點檢測器講起。

Harris角點檢測

Harris角點檢測的基本假設來自於人眼對角點的識別,對於整個圖像我們選擇一個小窗作爲我們實際觀察的部分,如果一個點上下左右移動後他周圍的灰度變化比較大,那麼他應該就是一個角點,如果延一個方向變化大一個方向變化小,那麼他就很可能是一條線。這樣我們通過設定一個固定窗口,對比其左右變化就可以得到區域中的角點了。

同樣也因此,我們需要設定三個參數,觀察窗口的大小,需要考慮領域(也就是角點範圍,或者說這個角點可能有多大)的大小,以及閾值。對於Harris算法,我們可以直接調用OpenCV中的cornerHarris算法,而這三個關鍵參數,則是

  • blockSize —— 角點檢測中要考慮的領域大小。

  • ksize —— Sobel 求導中使用的窗口大小

  • k ——Harris 角點檢測方程中的自由參數,取值參數爲 [0.04,0.06].

下面是有關代碼,這裏我們使用了opencv的github項目中的一張圖片,你可以到opencv的github下載原圖片或者fongtian的github項目–漫談計算機視覺下載所有代碼和圖片:

img = cv2.imread('/home/fonttian/Data/image/OpenCV/blox.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cornerHarris函數圖像格式爲 float32 ,因此需要將圖像轉換 float32 類型
gray = np.float32(gray)

blockSize = 2  # 領域尺寸
ksize = 3 # 口徑尺寸
k = 0.04 # Harris
dst = cv2.cornerHarris(src=gray, blockSize=blockSize, ksize=ksize, k=k)
# 變量a的閾值爲0.01 * dst.max(),如果dst的圖像值大於閾值,那麼該圖像的像素點設爲True,否則爲False
# 將圖片每個像素點根據變量a的True和False進行賦值處理,賦值處理是將圖像角點勾畫出來
a = dst > 0.01 * dst.max()
img[a] = [0, 0, 255]
# 顯示圖像
cv2.imshow('corners', img)

harris 角點檢測

上面的代碼中我們並沒有直接使用獲取的焦點數據,而是對數據進行了過濾,然後再繪製角點,這樣避免了角點過多的問題,除此之外,我們也可以使用一個更合適的角點檢測器來簡化我們的代碼,那就是——goodFeaturesToTrack函數,具體使用請看接下來的代碼。

Shi-Tomasi 角點檢測

Shi-Tomasi 角點檢測是對Harris角點檢測的改進。由於 Harris 角點檢測算法的穩定性和與k 值這個經驗數值有關,因此並不能太好的直接獲得最佳數值。但是Shi-Tomasi 發現,角點的穩定性其實和矩陣 M 的較小特徵值有關,於是直接用較小的那個特徵值作爲分數,於是便有了不需要調整k值的新算法。

下面的第一個公式是Harris的原始分數公式,第二個是《Good_Features_to_Track》論文中改進後的分數公式
R=λ1λ2k(λ1+λ2)2 R=\lambda_1\lambda_2-k(\lambda_1+\lambda_2)^2

R=min(λ1λ2) R=min(\lambda_1-\lambda_2)

至於Shi-Tomasi 角點檢測的使用,我們可以直接在OpenCV中使用goodFeaturesToTrack函數獲取最好的幾個點,並選定角點檢測方法爲Shi-Tomasi算法,該函數具體參數如下:

  • maxCorners:返回角點的最大數目,值爲0表表示沒有設置最大值限制,返回所有檢測到的角點。
  • qualityLevel:質量係數(小於1.0的正數,一般在0.01-0.1之間),表示可接受角點的最低質量水平。該係數乘以最好的角點分數(也就是上面較小的那個特徵值),作爲可接受的最小分數;例如,如果最好的角點分數值爲1500且質量係數爲0.01,那麼所有質量分數小於15的角都將被忽略。
  • minDistance:角之間最小歐式距離,忽略小於此距離的點。
  • mask:可選的感興趣區域,指定想要檢測角點的區域。
  • blockSize:默認爲3,角點檢測的鄰域大小(窗口尺寸)
  • useHarrisDetector:用於指定角點檢測的方法,如果是true則使用Harris角點檢測,false則使用Shi-Tomasi算法。默認爲False。
  • k:默認爲0.04,Harris角點檢測時使用,Shi-Tomasi不需要。

這個函數的特殊之處就在於,他幫助我們完成了點的篩選,之前我們通過自己設定的dst > 0.01 * dst.max()進行參數篩選。而該函數首先獲取所有右焦點,然後忽略低於質量係數的角點並排序。之後保留質量最高的一個焦點,然後刪除最小距離內的角點,並依次進行該步驟並獲得最終的N個最佳角點。代碼和效果如下:

img = cv2.imread('/home/fonttian/Data/image/OpenCV/blox.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)

# print(len(corners))
# print(corners)
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 2, (0, 0, 255), -1)

cv2.imshow('Shi-Tomasi', img)

Shi-Tomasi 角點檢測

特徵檢測,從ORB說起

我們之前所說的都是直接的角點檢測,而角點本質是一種圖像的特徵點,而除了這些直接獲取角點的算法外,我們還有需要很多其他的特徵點檢測算法可以直接使用,而這些特徵點檢測算法同樣都離不開各種基礎算子。比如ORB算法。

RB特徵是將FAST特徵點的檢測方法與BRIEF特徵描述子結合起來,並在它們原來的基礎上做了改進與優化。

首先,它利用FAST特徵點檢測的方法來檢測特徵點,然後利用Harris角點的度量方法,從FAST特徵點從挑選出Harris角點響應值最大的N個特徵點。

除了上述的描述外,ORB算法本身還牽扯到很多內容,比如旋轉不變性(FAST特徵本身沒有),多尺度不變性,非極大值抑制等等,需要想要詳細的瞭解類似ORB算法的特徵提取算法,是需要大量筆墨的所以我們放在下一章節再來講。不過在OpenCV中使用起來卻十分簡單:

img = cv2.imread('/home/fonttian/Data/image/OpenCV/blox.jpg')

orb = cv2.ORB_create()

kp = orb.detect(img, None)

kp, des = orb.compute(img, kp)

img = cv2.drawKeypoints(img, kp, img, color=(0, 255, 0), flags=0)

cv2.imshow('p', img)

上面的第一行代碼是讀取圖片,第二行代碼就是ORB的創建,之後使用detect進行特徵檢測,並使用compute進行特徵的計算,最終繪製。這裏des實際上並沒有用到,之後我們再講解具體怎麼使用。但是僅從代碼分析,我們可以很清楚的看到創建,檢測,繪製各只需要一行代碼,而繪製這一步,我們甚至只需要調用OpenCV中封裝好的類即可,可以說非常簡單了。效果則如下所示,具體繪製效果我們也可以通過參數修改:

特徵點檢測 rob ORB算法

與orb類似的事,opecv中還有很多其他的有用的特徵檢測器,使用起來同樣十分方便。我們將會在下一篇文章中講解。

寫在最後

往期文章

下載

fongtian的github項目–漫談計算機視覺

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