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

2022-02-16 00:29:50 字數 3374 閱讀 3665

在計算機視覺領域,經常需要檢測極值位置,比如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\)的估計值。

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

一維高斯函式如下:

\[y = y_ \cdot exp(-\frac)

\]當\(y_=\frac\pi}\)時為標準高斯函式,形如

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

\[\hat = \frac \frac

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

使用拋物線近似\(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 f''(x)\delta^2 + o(\delta^3)

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

\[f'(x+\hat) = f'(x) + f''(x)\hat = 0

\]使用一階微分和二階微分近似\(f'(x)\)和\(f''(x)\)得

\[\hat = - \frac = - \frac= \frac\frac

\]與帶入拋物線求引數的結果是一致的,加上對數則與高斯近似一致。

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

\[\sum_^n m_i(r_i - r) = 0

\]令\(m = \sum_^n m_i\),質心座標為

\[r = \frac \sum_^n m_ir_i

\]帶入得

\[x + \hat = \frac

\]\[\hat = \frac

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

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

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

\[\frac = \frac = \frac

\]解得

\[\hat=\frac\frac

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

\[\hat=\frac\frac

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

**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 = \frac

\]若\(f(x-1)>f(x+1)\),則

\[\hat = \frac - 1

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

畫素資料的儲存

乙個黑白畫素和乙個彩色畫素分別佔幾個位元組?取決於需要儲存乙個畫素的多少資訊,以及是否採用了壓縮技術。如果是非黑即白的二值影象,不壓縮的情況下乙個畫素只需要1個bit。如果是256種狀態的灰度影象,不壓縮的情況下乙個畫素需要8bit 1位元組,256種狀態 如果用256種狀態標識螢幕上某種顏色的灰度...

OpenCV畫素資料型別

1 unsigned 8bits 注 一般影象結構引數 mat資料結構引數 cv 8uc1,cv 8uc2,cv 8uc3,cv 8uc4 變數型別 空間大小 範圍uchar 8bits 0 255 unsigned char 8bits 0 255 2 signed 8bits mat資料結構引數...

VTK讀取緩衝區畫素資料

最近,我在做並行影象合成的工作,所以我需要把vtk管線中畫好的圖在顯示之前把這些畫素點取出來,並與其它程序所繪製的畫素點相融合,進行深度測試。所以需要了解vtk在畫素緩衝區的讀取上是怎麼做的。我們都知道,在opengl中我們都知道,是用glreadpixels 和glgetteximage 這樣的函...