亞畫素數值極值檢測演算法總結

Mr-Lee發表於2018-08-04

動機

在計算機視覺領域,經常需要檢測極值位置,比如SIFT關鍵點檢測、模板匹配獲得最大響應位置、統計直方圖峰值位置、邊緣檢測等等,有時只需要畫素精度就可以,有時則需要亞畫素精度。本文嘗試總結幾種常用的一維離散資料極值檢測方法,幾個演算法主要來自論文《A Comparison of Algorithms for Subpixel Peak Detection》,加上自己的理解和推導。

問題定義

給定如下離散值,求其極值位置。可知125為觀察極值。

[[60, 80, 100, 120, 125, 105, 70, 55]]

如果這些離散值是從某個分佈(f)中等間距取樣獲得,其真正的極值位置應位於120和125之間。

下面給出形式化的定義:給定一組離散值,令(x)為觀測到的極值點位置,其值為(f(x)),其左右相鄰位置的值為(f(x-1))(f(x+1)),真正的極值點位置為(x+delta),令(hat{delta})(delta)的估計值。

演算法

假設(x)的鄰域可通過某個模型進行近似,如高斯近似、拋物線近似,則可以利用(x)的鄰域資訊根據模型估計出極值。使用的模型不同就有不同的演算法,具體如下。

高斯近似

一維高斯函式如下:

[y = y_{max} cdot exp(-frac{(x-mu)^2}{2sigma^2})]
(y_{max}=frac{1}{sqrt{2sigma}pi})時為標準高斯函式,形如

標準高斯函式

假設(x)的鄰域可用高斯近似,用((x, f(x)))((x-1, f(x-1)))((x+1, f(x+1)))三點對高斯函式進行擬合,獲得模型引數(mu)即為峰值位置,(hat{delta}=mu – x)。將三點帶入上面的高斯函式兩邊同時取對數求得:

[hat{delta} = frac{1}{2} frac{ln(f(x-1)) – ln(f(x+1))}{ln(f(x-1)) – 2ln(f(x)) + ln(f(x+1))}]

下面可以看到,高斯近似相當於取對數後的拋物線近似

拋物線近似

使用拋物線近似(x)的區域性,可以將((x, f(x)))((x-1, f(x-1)))((x+1, f(x+1)))三點帶入(y=a(x-b)^2+c)求引數(b)即為估計的極值位置,也可採用泰勒展開牛頓法)來求極值。泰勒公式實際上是一種利用高階導數通過多項式近似函式的方法,下面的圖示可直觀理解這種近似,圖示為通過泰勒公式近似原點附近的正弦曲線:

泰勒近似正弦曲線

泰勒近似(x)附近,如只取到二階則為拋物線近似。假設高階可導,極值為(f(x+delta)),則根據泰勒公式,

[f(x+delta) = f(x) + f`(x)delta + frac{1}{2} f“(x)delta^2 + O(delta^3)]

極值處導數為0,這裡(x)為常數(delta)為變數,兩邊同時對(delta)求導,忽略高階項可得

[f`(x+hat{delta}) = f`(x) + f“(x)hat{delta} = 0]

使用一階微分和二階微分近似(f`(x))(f“(x))

[hat{delta} = – frac{f`(x)}{f“(x)} = – frac{(f(x+1)-f(x-1))/2}{(f(x+1)-f(x))-(f(x) – f(x-1))}= frac{1}{2}frac{f(x-1)-f(x+1)}{f(x+1)-2f(x)+ f(x-1)}]
與帶入拋物線求引數的結果是一致的,加上對數則與高斯近似一致。

質心演算法

In physics, the center of mass of a distribution of mass in space is the unique point where the weighted relative position of the distributed mass sums to zero, or the point where if a force is applied it moves in the direction of the force without rotating.——Center of mass wiki

質心

若將(x)(x-1)(x+1)看成質點,將(f(x))(f(x-1))(f(x+1))看成質點的質量,則可以把質心作為極值的估計。根據質點相對質心位置的質量加權和為零,可求得質心位置。令(R)為質心座標,(m)(r)分別為質點質量和座標,則(n)個質點的質心滿足

[sum_{i=1}^n m_i(r_i – R) = 0]

(M = sum_{i=1}^n m_i),質心座標為

[R = frac{1}{M} sum_{i=1}^n m_ir_i]

帶入得

[x + hat{delta} = frac{(x-1)f(x-1)+xf(x)+(x+1)f(x+1)}{f(x-1)+f(x)+f(x+1)}]

[hat{delta} = frac{f(x+1)-f(x-1)}{f(x-1)+f(x)+f(x+1)}]

以上考慮的是3質點系統的質心,還可考慮5質點、7質點等,甚至考慮所有點。

線性插值

這個模型假設在極值兩側是線性增長和線性下降的,且上升和下降的速度相同,即(y=kx+b),上升側(k>0),下降側(k<0),兩者絕對值相同,可以利用這個性質求解極值位置。

(f(x+1)>f(x-1))則極值位於((x, x+1))之間,可列等式

[frac{f(x) – f(x-1)}{x-(x-1)} = frac{f(x+delta)-f(x)}{x+delta – x} = frac{f(x+delta)-f(x+1)}{x+1-(x+delta)}]

解得

[hat{delta}=frac{1}{2}frac{f(x+1)-f(x-1)}{f(x)-f(x-1)}]

同理,若(f(x-1)>f(x+1))求得

[hat{delta}=frac{1}{2}frac{f(x+1)-f(x-1)}{f(x)-f(x+1)}]

數值微分濾波

這個方法是利用極值處導數為0的性質,在微分濾波結果上插值得到導數為0的位置,因已知極值點在(x)附近,因此只需在(x)附近做微分和插值即可。插值時取極值點兩側正負值連線的過零點作為極值點的估計,如下圖所示

Linear interpolation of the peak position

論文Real-time numerical peak detector中定義了4階和8階線性濾波器([1, 1, 0, -1, -1])([1,1,1,1,0,-1,-1,-1,-1]),對應的函式形式為

[g_4(x)=f(x-2)+f(x-1)-f(x+1)-f(x+2)]

[g_8(x)=f(x-4)+f(x-3)+f(x-2)+f(x-1) \
-f(x+1)-f(x+2)-f(x+3)-f(x+4)]

2階形式為(g_2(x) = f(x-1) -f(x+1)),這些濾波器的表現與數值微分濾波器相似。

(f(x+1)>f(x-1))時,極值點位於((x, x+1))之間,(g(x)<0)(g(x+1)>0),極值點位置為(g(x))(g(x+1))連線的過零點,通過斜率求得

[hat{delta} = frac{g(x)}{g(x+1)-g(x)}]

(f(x-1)>f(x+1)),則

[hat{delta} = frac{g(x-1)}{g(x-1)-g(x)} – 1]

總結

這些數值極值檢測方法均是先獲取觀測極值(x)及其鄰域資訊,然後綜合鄰域資訊在各自的模型假設下通過插值估計出極值位置。若能知道數值來自的真實分佈,則直接擬合真實分佈然後求極值即可,但往往我們並不知道真實的分佈是什麼,即使知道真實分佈,有時為了快速計算,也會採取插值的方式來估計極值,畢竟偏差可接受效果足夠好就可以了。應用時,為了抗噪可對資料先平滑然後求極值,具體採用何種方法可在準確和速度間權衡——所用模型與真實分佈越相近自然越準確,如果實在不知道怎麼選,就實踐對比吧(因為我也不知道),畢竟偉大領袖教導過我們——實踐是檢驗真理的唯一標準

參考

個人部落格地址:亞畫素數值極值檢測演算法總結

相關文章