1. 程式人生 > >Harris角點檢測演算法

Harris角點檢測演算法

Harris演算法是使用比較多的角點演算法之一,opencv中實現的角點檢測演算法就是Harris和它的改進。

Harris角點檢測的原理:

Harris 角點最初由HarrisA combined corner and edge detector一文中提出,該文實際上是對Moravec演算法思想的改進。Harris角點最直觀的解釋是,在兩個相互垂直的方向,都有較大變化的點。通俗一點描述該演算法就是:First find a gray value changes the direction of maximum variation, and then calculate the gray value in the direction perpendicular to the direction of the value. If the two variation is greater than a given threshold, for the corner;如果只有一個大於閥值,則為邊緣;如果都不大於,則為內部平滑點。由於兩個互相垂直的最大變化方向可以出現在任何方向,所以

Harris演算法可以統計任意方向的灰度值變化,而且對旋轉具有不變性。

這一直觀認識的數學描述如下。

首先,定義自相關函式:

該相關函式和moravec中的一樣,但是Harris首先對Wu,v進行了替換,使用的是高斯視窗,另一方面對灰度值差進行了泰勒展開,然後進行推導。

注:該公式中的x,ymoravec中的意義不同。moravec演算法中表示的畫素的座標,而這裡表示的變化量,例如這裡(1,0)表示視窗右移一個單位後灰度值的變化,這樣E ( x, y ) 實際上刻畫的是影象偏移造成的視窗內畫素的平均變化。顯然,視窗固定之後E ( x, y ) x, y的函式。所以Harris的思想是對

E(x,y)求極大值,所得的(x,y)代表灰度值變化最大的方向;然後求出該方向的垂直方向的灰度值變化,最後比較得出結論。為了加快求解速度,HarrisE(x,y)中的灰度值變化部分進行泰勒展開。若令D= I (x +u , y + v) − I (u ,v ),則有D ( x, y )可以在原點(0, 0) Taylor展開,最後得到


A 可以理解為 x變化時,視窗內影象一階差分的平方和。同理,B可以理解為 y方向一階差分的平方和,C理解為 x方向一階差分y方向一階差分的乘積。一介差分可以根據sobel運算元求的,Harris給的差分公式是卷積公式,


個人理解為用函式差代替差分,即

x方向的差分近似等於1/2[f(x+1,y)-f(x-1,y)].這樣可以很容易求得每個畫素的H矩陣。求得H矩陣的目的是因為Harris通過計算髮現,E(x,y)的兩個互相垂直的灰度值變化方向是H的特徵向量方向,而相應的特徵值就是其灰度值變化量。即它的解為H的最大特徵值λ1的特徵向量( x1 , y1 )並且有此時E ( x1 , y1 ) = λ1由矩陣論知識,(x1 , y1 )垂直方向為H的另一個特徵值λ2對應的特徵向量。相應的有E ( x2 , y2 ) =λ2。所以只要求得H的兩個特徵值就可以判斷該點是不是角點。由於H是一個hessian矩陣,求其特徵值比較有很簡單的方法,從而可以快速得到角點的判斷。具體方法不在詳述。