http://blog.csdn.net/lwzkiller/article/details/54633670
關於角點的應用在圖像處理上比較廣泛,如圖像匹配(FPM特征點匹配)、相機標定等。網上也有很多博客對Harris角點檢測原理進行描述,但基本上只是描述了算法流程,而其中相關細節並未作出解釋,這里我想對有些地方做出補充說明,正所謂知其然知其所以然,如有不對,還望指正。
關於角點的應用在圖像處理上比較廣泛,如圖像匹配(FPM特征點匹配)、相機標定等。網上也有很多博客對Harris角點檢測原理進行描述,但基本上只是描述了算法流程,而其中相關細節並未作出解釋,這里我想對有些地方做出補充說明,正所謂知其然知其所以然,如有不對,還望指正。
1. 何為角點?
下面有兩幅不同視角的圖像,通過找出對應的角點進行匹配。
再看下圖所示,放大圖像的兩處角點區域:
我們可以直觀的概括下角點所具有的特征:
>輪廓之間的交點;
>對於同一場景,即使視角發生變化,通常具備穩定性質的特征;
>該點附近區域的像素點無論在梯度方向上還是其梯度幅值上有着較大變化;
2. 角點檢測算法基本思想是什么?
算法基本思想是使用一個固定窗口在圖像上進行任意方向上的滑動,比較滑動前與滑動后兩種情況,窗口中的像素灰度變化程度,如果存在任意方向上的滑動,都有着較大灰度變化,那么我們可以認為該窗口中存在角點。
3.如何用數學方法去刻畫角點特征?
當窗口發生[u,v]移動時,那么滑動前與滑動后對應的窗口中的像素點灰度變化描述如下:
公式解釋:
>[u,v]是窗口的偏移量
>(x,y)是窗口內所對應的像素坐標位置,窗口有多大,就有多少個位置
>w(x,y)是窗口函數,最簡單情形就是窗口內的所有像素所對應的w權重系數均為1。但有時候,我們會將w(x,y)函數設定為以窗口中心為原點的二元正態分布。如果窗口中心點是角點時,移動前與移動后,該點的灰度變化應該最為劇烈,所以該點權重系數可以設定大些,表示窗口移動時,該點在灰度變化貢獻較大;而離窗口中心(角點)較遠的點,這些點的灰度變化幾近平緩,這些點的權重系數,可以設定小點,以示該點對灰度變化貢獻較小,那么我們自然想到使用二元高斯函數來表示窗口函數,這里僅是個人理解,大家可以參考下。
所以通常窗口函數有如下兩種形式:
根據上述表達式,當窗口處在平坦區域上滑動,可以想象的到,灰度不會發生變化,那么E(u,v) = 0;如果窗口處在比紋理比較豐富的區域上滑動,那么灰度變化會很大。算法最終思想就是計算灰度發生較大變化時所對應的位置,當然這個較大是指針任意方向上的滑動,並非單指某個方向。
4.E(u,v)表達式進一步演化
首先需要了解泰勒公式,任何一個函數表達式,均可有泰勒公式進行展開,以逼近原函數,我們可以對下面函數進行一階展開(如果對泰勒公式忘記了,可以翻翻本科所學的高等數學)
那么,
所以E(u,v)表達式可以更新為:
這里矩陣M為,
5.矩陣M的關鍵性
難道我們是直接求上述的E(u,v)值來判斷角點嗎?Harris角點檢測並沒有這樣做,而是通過對窗口內的每個像素的x方向上的梯度與y方向上的梯度進行統計分析。這里以Ix和Iy為坐標軸,因此每個像素的梯度坐標可以表示成(Ix,Iy)。針對平坦區域,邊緣區域以及角點區域三種情形進行分析:
下圖是對這三種情況窗口中的對應像素的梯度分布進行繪制:
如果使用橢圓進行數據集表示,則繪制圖示如下:
不知道大家有沒有注意到這三種區域的特點,平坦區域上的每個像素點所對應的(IX,IY)坐標分布在原點附近,其實也很好理解,針對平坦區域的像素點,他們的梯度方向雖然各異,但是其幅值都不是很大,所以均聚集在原點附近;邊緣區域有一坐標軸分布較散,至於是哪一個坐標上的數據分布較散不能一概而論,這要視邊緣在圖像上的具體位置而定,如果邊緣是水平或者垂直方向,那么Iy軸方向或者Ix方向上的數據分布就比較散;角點區域的x、y方向上的梯度分布都比較散。我們是不是可以根據這些特征來判斷哪些區域存在角點呢?
雖然我們利用E(u,v)來描述角點的基本思想,然而最終我們僅僅使用的是矩陣M。讓我們看看矩陣M形式,是不是跟協方差矩陣形式很像,像歸像,但是還是有些不同,哪兒不同?一般協方差矩陣對應維的隨機變量需要減去該維隨機變量的均值,但矩陣M中並沒有這樣做,所以在矩陣M里,我們先進行各維的均值化處理,那么各維所對應的隨機變量的均值為0,協方差矩陣就大大簡化了,簡化的最終結果就是矩陣M,是否明白了?我們的目的是分析數據的主要成分,相信了解PCA原理的,應該都了解均值化的作用。
如果我們對協方差矩陣M進行對角化,很明顯,特征值就是主分量上的方差,這點大家應該明白吧?不明白的話可以復習下PCA原理。如果存在兩個主分量所對應的特征值都比較大,說明什么? 像素點的梯度分布比較散,梯度變化程度比較大,符合角點在窗口區域的特點;如果是平坦區域,那么像素點的梯度所構成的點集比較集中在原點附近,因為窗口區域內的像素點的梯度幅值非常小,此時矩陣M的對角化的兩個特征值比較小;如果是邊緣區域,在計算像素點的x、y方向上的梯度時,邊緣上的像素點的某個方向的梯度幅值變化比較明顯,另一個方向上的梯度幅值變化較弱,其余部分的點都還是集中原點附近,這樣M對角化后的兩個特征值理論應該是一個比較大,一個比較小,當然對於邊緣這種情況,可能是呈45°的邊緣,致使計算出的特征值並不是都特別的大,總之跟含有角點的窗口的分布情況還是不同的。
注:M為協方差矩陣,需要大家自己去理解下,窗口中的像素集構成一個矩陣(2*n,假設這里有n個像素點),使用該矩陣乘以該矩陣的轉置,即是協方差矩陣
因此可以得出下列結論:
>特征值都比較大時,即窗口中含有角點
>特征值一個較大,一個較小,窗口中含有邊緣
>特征值都比較小,窗口處在平坦區域
6. 如何度量角點響應?
通常用下面表達式進行度量:
其中k是常量,一般取值為0.04~0.06,這個參數僅僅是這個函數的一個系數,它的存在只是調節函數的形狀而已。
但是為什么會使用這樣的表達式呢?一下子是不是感覺很難理解?其實也不難理解,函數表達式一旦出來,我們就可以繪制它的圖像,而這個函數圖形正好滿足上面幾個區域的特征。 通過繪制函數圖像,直觀上更能理解。繪制的R函數圖像如下:
所以說難點不在於理解這個函數表達式,而在於如何創造出這個函數表達式。Harris也許對很多函數模型非常了解,對於創造出這樣的一個函數表達式,易如反掌,當然在我們看來感覺是很了不起的,那是因為我們見過的函數模型太少。如果你也能構造一個函數模型,更能精確滿足上述的三個特征,那么你比Harris更牛,純屬玩笑。
最后設定R的閾值,進行角點判斷。當然其中還有些后處理步驟就不再說了,比如說角點的極大值抑制等,就到這里吧,歡迎討論留言。