目錄
特徵點/關鍵點
試想,從不同的距離,不同的方向、角度,不同的光照條件下觀察一個物體時,物體的大小、形狀、明暗都會有所不同。但我們依然可以判斷它是同一件物體。 這是因爲什麼呢?特徵點!
特徵點可以看作是不同視角圖片之間的映射,穩定的局部特徵點應該具有以下特性:
1)可重複性、顯著性
2)抗圖片變換(包括外貌變換(亮度、光照)和幾何變換(平移、選擇、尺度))
其中,在大小、方向、明暗不同的圖像中,同一特徵點應具有足夠相似的描述,就稱之爲可復現性。
特徵點(關鍵點)的應用場景:
- 圖片的配準/拼接
- 運動跟蹤
- 物體識別
- 機器人導航
- 3D重建
Harris角點
Harris角點檢測算子的原理是基於特徵點具有局部差異性。
假設現在有一個足夠小的觀察窗口,在任何方向上移動小觀察窗,導致大的像素變動的區域就是Harris角點。
如圖所示,第一張圖在平滑區域移動,則任何方向都不會出現像素的變動,第二張圖在垂直方向移動,則不會出現像素變動,直到第三張圖,觀察窗口移動到角點區域,則在任何方向上的移動都會出現像素的大的變動!
數學模型
1)求偏移(u, v)後窗內圖像變化
2)取E(u, v)最大的區域
判斷
將上面的公式進行泰勒式展開:
其中H被稱爲Harris矩陣:
進而可以得到Harris矩陣的兩個特徵值(x、y方向上的變化情況),根據這兩個特徵值就可以判斷觀察到的是什麼樣的區域:
- 直線(邊緣區域):一個特徵值大,另一個特徵值小(t1大於0,t2約等於0或者相反)。
- 平面(光滑區域):兩個特徵值都小,且近似相等(t1約等於t2約等於0)。
- 角點(特徵點區域):兩個特徵值都大,且近似相等(t1和t2等大於0)。
Harris角點響應
只有當兩個特徵值同時取得最大值,C才取得較大值,k越小,檢測越敏感。
Harris算子的處理流程
代碼
import numpy as np
import cv2 as cv
filename = 'pic/chessboard.png'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray, 2, 3, 0.04)
#result is dilated for marking the corners, not important
dst = cv.dilate(dst,None)
# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255]
# cv.namedWindow("dst", cv.WINDOW_NORMAL)
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
cv.destroyAllWindows()
FAST角點
FAST(Feature from Accelerated Segment Test)
若某像素點與其周圍領域內足夠多的像素點處於不同的區域,則該像素點可能爲角點,也就是某些屬性與衆不同。
數學模型
1)確定一個閾值t,觀察某像素點爲中心的一個半徑等於3像素的離散化的圓,這個圓的邊界上有16個像素。
2)如果在這個大小爲16個像素的圓上有n個連續的像素點,它們的像素值要麼都比Ip+t大,要麼都比Ip−t小,則p就是一個角點。
角點檢測算子對比
Moravec算子[1977]
它是一種基於灰度方差的角點檢測方法,該算子計算圖像中某個像素點沿水平、垂直方向上的灰度差異,以確定角點位置,是第一個角點檢測算法,也是角點家族的開山鼻祖。
Harris算子[1988]
Harris不止是考察水平、垂直4個方向上的灰度差異,而是考察了所有方向上的灰度差異,並且具有旋轉不變性和對部分仿射變換的穩定性。
Shi-Tomasi算子[1994]
它是對Harris角點算子的改進,並且有一個直接“叫囂”Harris算子的名字——“Good Features to Track”,在opencv中實現函數是goodfeaturesToTrack。它通過考察自相關矩陣M的兩個特徵值中的較小者來確定就角點,大部分情況下,有比Harris更好的檢測效果。
FAST算子[2006]
它通過考察像素點與其鄰域內16個像素點的差異來確定特徵點(角點),並且通過分割測試算法對檢測效率做了極大的提升。基本可以滿足實時檢測系統的要求,在現今計算機視覺領域賺足了眼球。