【MQ筆記】Harris角點檢測1:算法詳解

目錄

什麼是角點?

Harris角點檢測算法

Harris角點的性質


什麼是角點?

正如我們描述一個物體,需要點明顏色、形狀、材質等“關鍵詞”一樣,當我們處理圖片的時候,也要着重關注能反映或描述圖像本質的“ 特徵(feature)”。這裏的特徵包括全局特徵(直方圖、方差)和局部特徵(角點、邊緣點)等。

角點檢測(Corner Detection)是計算機視覺系統中用來獲得圖像特徵的一種重要方法,也稱爲特徵點檢測(Feature Point Detection)。如果某一點在任意方向的一個微小變動都會引起灰度很大的變化,那麼我們就把這個點稱爲圖像的一個角點(Corner)。更形象一點的話,我們可以把角點理解爲平面的交匯處或者邊的交點,導致交點的局部區域具有多個不同區域的不同方向的邊界。比如說下圖中,在窗格A-F中,EF即爲我們要找的交點。

角點在保留圖像圖形重要特徵的同時,可以有效地減少信息的數據量,有效地提高了計算的速度,有利於圖像的可靠匹配,該方法也是特徵檢測與匹配的基礎。

識別角點

在當前的圖像處理領域中,角點檢測算法可以分爲:(1)基於灰度圖像的角點檢測;(2)基於二值圖像的角點檢測;(3)基於輪廓曲線的角點檢測。

近年來提出的角點檢測方法大多是基於灰度圖像的角點檢測,又可以分爲:

(1)基於邊緣特徵的角點檢測。主要分三個步驟:首先,對圖像進行預分割;然後,對預分割後得到的圖像中邊界輪廓點進行順序編碼,得到邊緣輪廓鏈碼;最後,根據邊緣輪廓鏈碼對圖像中的角點進行描述和提取。Wallg和Braday提出了一種基於表面曲率的角點檢測算法。爲了改善角點檢測的穩定性,首先將圖像和高斯濾波器卷積,然後計算整個圖像的表面曲率,當曲率高於一定閾值,併爲局部最大值的點被認爲是候選角點。

(2)基於模板的角點檢測。一般首先建立一系列具有不同角度的角點模板,然後在一定的窗口內比較待測圖像與標準模板之間的相似程度,以此來檢測圖像中的角點。基於模板的方法主要考慮像素鄰域點的灰度變化,即圖像亮度的變化,將與鄰點亮度對比足夠大的點定義爲角點。首先設計一系列角點模板,然後計算模板與所有圖像子窗口的相似性,以相似性判斷在子窗口中心的像素是否爲角點。

(3)基於亮度變化的角點檢測。該算法基於角點相應函數(CRF)對每個像素基於其模板鄰域的圖像灰度計算CRF值,如果大於某一閾值且爲局部極大值,則認爲該點爲角點。


Harris角點檢測算法

Chris Harris 和 Mike Stephens 於1988年Proc of 4th Alvey Vision Conference發表的“A Combined Corner and Edge Detector”中提出了Harris 角點提取算法,又稱Plessey算法。harris角點檢測是一種直接基於灰度圖像的角點提取算法。

Harris角點檢測的基本思想是,使用一個固定穿擴在圖像上進行任意方向的滑動,比較滑動前與滑動後窗口中的像素灰度變化程度,如果對於任意方向的滑動,都有較大程度的灰度變化,那麼我們可以認爲該窗口中存在角點。

平坦區域、邊緣、角點的區別

對於一張灰度圖片中的點(x,y),其灰度值爲I{(x,y)}。我們選擇一個合適大小的窗口\boldsymbol{W}

當窗口發生移動時,移動前後對應的窗口中的像素點灰度變化如下所示:

E(u,v)=\sum _{(x,y)\in \boldsymbol{W}}w(x,y)[I(x+u,y+u)-I(x,y)]^2

其中:

  • [u,v] 是窗口\boldsymbol{W}的偏移量;
  • (x,y)是窗口\boldsymbol{W}種包含的像素的位置座標;
  • I{(x,y)} 和I{(x+u,y+v)} 分別是像素位置(x,y)\bg_white (x+u,y+v) 對應的圖像灰度值;
  • w{(x,y)} 是窗口函數,最簡單的情形就是窗口\boldsymbol{W}中的所有像素對應的權重都是1。但是有時候,我們也會用二院高斯函數來表示窗口函數,這樣使得靠近窗口\boldsymbol{W}中心的點對灰度變換的貢獻增大,而使得原理窗口\boldsymbol{W}中心的點對灰度變換的貢獻降低,從而更好的定位角點的位置。如下圖所示:
窗口函數的形式

根據上述表達式,我們可以想到,當窗口在平坦區域移動時,窗口的灰度值基本不發生變化,對應E(u,v)\approx 0。但是窗口在圖像變化比較明顯的區域移動時,那麼灰度變化會很明顯。Harris算法的最終思想就是計算灰度發生較大變化時窗口中心對對應的位置。在這裏的移動方向是指任意方向上的移動,而不是特指的方向。

爲了化簡E(u,v),我們可以對該表達式進行泰勒展開,以逼近原函數。

一節泰勒展開的表達式爲:f(x+u,y+v)\approx f(x,y)+uf_x(x,y)+vf_y(x,y)

那麼,就有:

E(u,v)=\sum _{(x,y)\in \boldsymbol{W}}w(x,y)[I(x+u,y+u)-I(x,y)]^2\\ \approx \sum _{(x,y)\in \boldsymbol{W}}w(x,y)[I(x,y)+uI_x+vI_y-I(x,y)]^2\\ =\sum _{(x,y)\in \boldsymbol{W}}w(x,y)[u^2I_x^2+2uvI_xI_y+v^2I_y^2]\\ =\sum _{(x,y)\in \boldsymbol{W}}w(x,y)\begin{bmatrix} u& v \end{bmatrix}\begin{bmatrix} I_x^2 &I_xI_y \\ I_xI_y&I_y^2 \end{bmatrix}\begin{bmatrix} u\\ v \end{bmatrix}\\ =\begin{bmatrix} u& v \end{bmatrix}\ (\sum _{(x,y)\in \boldsymbol{W}}w(x,y)\begin{bmatrix} I_x^2 &I_xI_y \\ I_xI_y&I_y^2 \end{bmatrix}) \begin{bmatrix} u\\ v \end{bmatrix}\\

上式可以表示爲:

E(u,v)\approx \begin{bmatrix} u & v \end{bmatrix}\boldsymbol{M}\begin{bmatrix} u \\ v \end{bmatrix}

Harris角點檢測並沒有通過求每一個像素點對應的E(u,v)來判斷角點,而是通過對窗口內的每個像素在 x 方向和 y 方向上的梯度進行統計分析。跟上文一致,我們用 I_x,I_y 表示點(x,y)在 x 方向和 y 方向上的梯度值,因此,每個像素可以得到一個梯度座標(I_x,I_y)

針對平坦區域、邊緣區域和角點區域,有下面三種情形(左圖)。根據像素梯度座標繪製分佈圖像(右圖)。

像素梯度座標繪製

通過我們可以看到,和其他兩種情況相比,角點區域的x 軸、y 軸方向上的梯度分佈都比較散。因此,我們可以通過這種特徵來判斷哪些區域存在角點。

那麼具體怎麼做呢?

上面我們已經計算出了:

\boldsymbol{M}=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)\begin{bmatrix} I_x^2 &I_xI_y \\ I_xI_y & I_y^2 \end{bmatrix}=\begin{bmatrix} A &C \\ C &B \end{bmatrix}

那麼,我們可以將E(u,v)近似地表示爲二項函數:

E(u,v)\approx Au^2+2Cuv+Bv^2

其中,A=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)I_x^2B=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)I_y^2C=\sum_{ (x,y)\in\boldsymbol{W} }w(x,y)I_xI_y

二次函數本質上是一個橢圓函數,橢圓的長和寬是由的特徵值\lambda _1,\lambda _2 決定的(橢圓的長短軸分別是最大、最小特徵值平方根的倒數),橢圓的方向是由M 的最大、最小特徵值對應的特徵向量決定的,如下圖所示:

二次函數圖像示意圖

那也就是說,我們又加了一個約束條件,也就是橢圓的方程:

\begin{bmatrix} u &v \end{bmatrix}\boldsymbol{M}\begin{bmatrix} u\\ v \end{bmatrix}=1

在這個約束條件下,我們再對剛剛的像素梯度座標分佈圖進行分析處理,繪製得到的圖像如下圖所示:

可以看到,包含角點的圖像中,得到的座標分佈圖擬合出的“橢圓”相對來說,比較圓一點,也就是長短軸相對接近,而且較大。剛剛我們說了,橢圓的長短軸長度主要取決於其最大、最小特徵值的大小,也就是說,包含角點的窗口對應的M 的特徵值較大。類似地,我們可以總結出窗口處於不同區域時矩陣的特徵值的規律,如下圖所示:

總結來說,就是:

  • 像素點梯度座標分佈較散、梯度變化程度較大、對應矩陣的特徵值都較大時,窗口中含有角點;
  • 像素點的梯度在某一個方向上變化較大、另一個方向上變化較小,相應的特徵值一個較大一個較小時,窗口中含有邊緣;
  • 像素點的梯度座標分佈集中在原點附近、梯度變化幅度非常小、對應M 的特徵值都比較小時,窗口處於平坦區域。

通過剛纔的討論我們知道,可以通過矩陣的性質判斷窗口所處的區域。但是,如何量化這種“較大”、“較小”的特徵呢?

我們可以定義一個角點相應函數(corner response function) R

R=det(\boldsymbol{M})-k(trace(\boldsymbol{M}))^2

其中,det(\boldsymbol{M})=\lambda _1\lambda _2 ,trace(\boldsymbol{M})=\lambda _1+\lambda _2,  \lambda _1,\lambda _2是矩陣M 的2個特徵值。k是一個指定的值,它是一個經驗參數,一般在0.04~0.06之間。總體來說,增大k的值,角點檢測的靈敏度降低,被檢測出的角點數量減少;降低k值,角點檢測的靈敏度提高,被檢測出的角點數量增大。

那麼針對上述的三種區域,R的取值如下圖所示:

Harris角點檢測算法就是對角點響應函數R進行閾值處理,也就是說,我們設定一個閾值,當R > threshold時,提取R的局部極大值,或者提取最大的n個點,從而得到角點。


Harris角點的性質

1. Harris角點具有旋轉不變性。

Harris角點檢測通過窗口對應的二階矩陣的特徵值得到角點響應值R,從而判斷角點。當圖像轉動時,角點區域的像素點梯度座標和擬合橢圓對應地發生旋轉,但是矩陣的特徵值(也可以理解爲數據點區域的擬合橢圓)不變,因此圖像旋轉不影響角點的檢測。

2. Harris角點檢測算子對亮度和對比度的變化不靈敏

這是因爲在進行Harris角點檢測時,使用了微分算子對圖像進行微分運算,而微分運算對圖像密度的拉昇或收縮和對亮度的擡高或下降不敏感。換言之,對亮度和對比度的仿射變換並不改變Harris響應的極值點出現的位置,但是,閾值的選擇可能會影響角點檢測的結果。

3. Harris角點檢測算子不具有尺度不變性

當圖像被縮小或放大時,在檢測窗口尺寸不變的前提下,在窗口內所包含圖像的內容是完全不同的,角點檢測的性能也會發生改變。


參考:

  1. https://www.cnblogs.com/zyly/p/9508131.html

  2. https://www.cnblogs.com/mikewolf2002/p/3547436.html

  3. https://wenku.baidu.com/view/f876c35d6c175f0e7dd13742.html?sxts=1568166574210


關於harris角點檢測的理論介紹就到這裏啦,該算法的具體實現記得查看下一篇博文:【MQ筆記】Harris角點檢測2:算法實現(OpenCV+自主實現)​​​​​​​

拜~ 

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