Lukas-Kanade光流法
光流是圖像亮度的運(yùn)動(dòng)信息描述。光流法計(jì)算最初是由Horn和Schunck于1981年提出的,創(chuàng)造性地將二維速度場(chǎng)與灰度相聯(lián)系,引入光流約束方程,得到光流計(jì)算的基本算法.光流計(jì)算基于物體移動(dòng)的光學(xué)特性提出了2個(gè)假設(shè):
①運(yùn)動(dòng)物體的灰度在很短的間隔時(shí)間內(nèi)保持不變;
②給定鄰域內(nèi)的速度向量場(chǎng)變化是緩慢的。
算法原理
假設(shè)圖像上一個(gè)像素點(diǎn)(x,y),在t時(shí)刻的亮度為E(x+Δx,y+Δy,t+Δt),同時(shí)用u(x,y)和v(x,y)來表示該點(diǎn)光流在水平和垂直方向上的移動(dòng)分量:
u=dx/dt
v=dy/dt
在經(jīng)過一段時(shí)間間隔Δt后該點(diǎn)對(duì)應(yīng)點(diǎn)亮度為E(x+Δx,y+Δy,t+Δt),當(dāng)Δt很小趨近于0時(shí),我們可以認(rèn)為該點(diǎn)亮度不變,所以可以有:
E(x,y,t)=E(x+Δx,y+Δy,t+Δt)
當(dāng)該點(diǎn)的亮度有變化時(shí),將移動(dòng)后點(diǎn)的亮度由Taylor公式展幵,可得:
忽略其二階無窮小,由于Δt趨近于0時(shí),有:
式中w=(u,v),所以上式就是基本的光流約束方程。
其中令表示圖像中像素點(diǎn)灰度沿x,y,t方向的梯度,可將上式改寫成:
?
Lucas-Kanade是一種廣泛使用的光流估計(jì)的差分方法,這個(gè)方法是由Bruce D. Lucas和Takeo Kanade發(fā)明的。它假設(shè)光流在像素點(diǎn)的鄰域是一個(gè)常數(shù),然后使用最小二乘法對(duì)鄰域中的所有像素點(diǎn)求解基本的光流方程。
通過結(jié)合幾個(gè)鄰近像素點(diǎn)的信息,盧卡斯-金出方法(簡(jiǎn)稱為L(zhǎng)-K方法)通常能夠消除光流方程里的多義性。而且,與逐點(diǎn)計(jì)算的方法相比,L-K方法對(duì)圖像噪聲不敏感。不過,由于這是一種局部方法,所以在圖像的均勻區(qū)域內(nèi)部,L-K方法無法提供光流信息。
Lucas-Kanade改進(jìn)算法
Jean-Yves Bouguet提出一種基于金字塔分層,針對(duì)仿射變換的改進(jìn)Lucas-Kanade算法。
?
為什么要用金字塔?因?yàn)閘k算法的約束條件即:小速度,亮度不變以及區(qū)域一致性都是較強(qiáng)的假設(shè),并不很容易得到滿足。如當(dāng)物體運(yùn)動(dòng)速度較快時(shí),假設(shè)不成立,那么后續(xù)的假設(shè)就會(huì)有較大的偏差,使得最終求出的光流值有較大的誤差。
考慮物體的運(yùn)動(dòng)速度較大時(shí),算法會(huì)出現(xiàn)較大的誤差。那么就希望能減少圖像中物體的運(yùn)動(dòng)速度。一個(gè)直觀的方法就是,縮小圖像的尺寸。假設(shè)當(dāng)圖像為400×400時(shí),物體速度為[16 16],那么圖像縮小為200×200時(shí),速度變?yōu)閇8,8]。縮小為100*100時(shí),速度減少到[4,4]。所以在源圖像縮放了很多以后,原算法又變得適用了。所以光流可以通過生成 原圖像的金字塔圖像,逐層求解,不斷精確來求得。簡(jiǎn)單來說上層金字塔(低分辨率)中的一個(gè)像素可以代表下層的兩個(gè)。
?
假設(shè)I和J是兩幅2D的灰度圖像,對(duì)于圖像上每個(gè)像素點(diǎn)的灰度值定義為:
I(x)=I(x,y) ??和 ?J(x)=j(x,y)
其中x=(x,y)是圖像上像素點(diǎn)的圖像坐標(biāo)。
在實(shí)際場(chǎng)景中圖像I和圖像J可以代表前后兩幀圖像。對(duì)于圖像特征點(diǎn)金字塔跟蹤來說的目的是:對(duì)于前一幀的圖像I上一點(diǎn)u(ux,uy),要在后一幀圖像J上找到一點(diǎn)v(ux+dx,uy+dy)與之相匹配,即灰度值最接近。那么向量d=[dx,dy]就是圖像在點(diǎn)u處的運(yùn)動(dòng)速度,也就是所說像素點(diǎn)u的光流。為了進(jìn)一步說明向量d的含義。我們假設(shè)前一幀圖像經(jīng)歷了仿射變換到后一幀圖像,定義變換矩陣為
其中四個(gè)參數(shù)dxx,dyy,dxy,dyx表征著圖像中的仿射變形。所以光流計(jì)算的目的轉(zhuǎn)變成找到向量d和變換矩陣A使得圖像上一塊區(qū)域內(nèi)灰度差最小。
定義誤差
其中兩個(gè)整數(shù)wx和wy設(shè)定了圖像上矩形窗口的大小(2*wx+1)和(2*wy+1)。
典型的wx和wy取值為1,2,3,4,5,6,7個(gè)像素,相似度的函數(shù)被在(2ωx+1, 2ωy+1)的區(qū)域內(nèi)定義。注意在金字塔各層窗口的大小是保持恒定的尺寸
對(duì)于Lucas-Kanade改進(jìn)算法來說,主要的步驟有三步:建立金字塔,基于金字塔跟蹤,迭代過程。
?
?
金字塔的建立
令I(lǐng)0 = I 是第 0 層的圖像,它是金字塔圖像中分辨率最高的圖像,圖像的寬度和高度分別定義為nx0 = nx?和 ny0 = ny?。以一種遞歸的方式建立金字塔:從I0中計(jì)算I1,從I1中計(jì)算I2 ,···。令L =1, 2,...代表金字塔的層數(shù),L通常取2,3,4。IL?1 是第L?1層的圖像,nxL?1 和 nyL?1分別是圖像IL?1 的寬度和高度。圖像IL可按如下方式由IL?1 求得:
即用一個(gè)[0.25 0.5 0.25]的低通濾波器對(duì)IL-1進(jìn)行卷積。
?
金字塔跟蹤
總體來講,金字塔特征跟蹤算法描述如下:首先,光流和仿射變換矩陣在最高一層的圖像上計(jì)算出;將上一層的計(jì)算結(jié)果作為初始值傳遞給下一層圖像,這一層的圖像在這個(gè)初始值的基礎(chǔ)上,計(jì)算這一層的光流和仿射變化矩陣;再將這一層的光流和仿射矩陣作為初始值傳遞給下一層圖像,直到傳遞給最后一層,即原始圖像層,這一層計(jì)算出來的光流和仿射變換矩陣作為最后的光流和仿射變換矩陣的結(jié)果。
對(duì)于L=0,1,2,…L,定義是圖像中像素點(diǎn)u在第L層對(duì)應(yīng)點(diǎn)的坐標(biāo)。根據(jù)上一步中圖像金字塔的定義,可以計(jì)算出
我們用數(shù)學(xué)的思想重新描述在L層和L+1層迭代運(yùn)算,假定在第L層有對(duì)被跟蹤目標(biāo)的位置有個(gè)大致估計(jì),而從第L+1層傳遞到L層的運(yùn)動(dòng)矢量,即光流計(jì)算初值為(后面會(huì)對(duì)gL做一個(gè)解釋)并且對(duì)于最上層的變換矩陣猜測(cè)
為了在L層上計(jì)算光流和仿射變換矩陣,需要重新定義在L層上的匹配誤差ξL:
其中圖像和是原始圖像在L層上采樣出來的圖像,基于這層中的光流和仿射矩陣初值gL和GL可以計(jì)算出兩個(gè)對(duì)應(yīng)圖像和:
這里用L+1層得到的最初估計(jì)gL對(duì)L層作預(yù)平移,L層在gL的基礎(chǔ)上求該層的光流dL,這樣求得的殘余光流向量dL= [dLx, dLy]T就足夠小,因此能夠通過標(biāo)準(zhǔn)的光流法來求出這個(gè)運(yùn)動(dòng)矢量。然后得到的dL結(jié)合gL又可以對(duì)L-1層的gL-1做估計(jì)。最終的光流和就是在所有層的分段光流d的疊加。使用金字塔圖像計(jì)算光流的一個(gè)明顯的好處是,對(duì)于一個(gè)有著較大的像素偏移的矢量d,可以通過計(jì)算幾個(gè)比較小的殘余光流來得到。這里就是金字塔跟蹤算法的核心。
?
接下來就是計(jì)算該層上的光流dL和變換矩陣AL,我們將在下一步中談?wù)摗,F(xiàn)在,假設(shè)在這一層上的光流和變換矩陣己經(jīng)計(jì)算出來。接著將結(jié)果傳遞給下一層,計(jì)算出下一層的假設(shè)初值:
將gL-1和GL-1作為初值,重新循環(huán)上面的步驟,直到最上一層,計(jì)算出光流d和仿射變換矩陣A。
由于金字塔的縮放減小了光流值,最高層的光流估計(jì)值可以設(shè)為0,設(shè)頂層時(shí)的初始為:
這種算法最明顯的優(yōu)勢(shì)在于對(duì)于每一層的光流都會(huì)保持很小,但是最終計(jì)算來的光流可以進(jìn)行累積,便于有效地跟蹤特征點(diǎn)。
?
迭代過程
這一步是算法的核心步驟。在金字塔的每一層,目標(biāo)是計(jì)算出光流dL和仿射變換矩陣AL從而使誤差ξL最小。由于每一層的迭代過程是相同的,所以我們就描述從一層到下一層的迭代過程。首先將上一層的光流u和A傳給這一層,計(jì)算這一幀圖像中像素點(diǎn)的光照,同時(shí)計(jì)算出圖像在該點(diǎn)x方向和y方向上的偏導(dǎo)
Ix=[I(x+1,y)-I(x-1,y)]/2
Iy=[I(x,y+1)-I(x,y-1)]/2
在此基礎(chǔ)上,計(jì)算出空間梯度矩陣:
更新光流v=2*v
迭代過程:計(jì)算后一幀圖像中對(duì)應(yīng)像素點(diǎn)的灰度,計(jì)算兩
幀圖像間相同位置點(diǎn)的灰度值之差,在計(jì)算圖像之間的誤差
向量:
最后計(jì)算針對(duì)仿射光流
,
更新跟蹤結(jié)果
直到某個(gè)閾值,結(jié)束在這一層的迭代過程。
?
?
特征點(diǎn)選擇
因此,可按照以下的步驟選擇特征點(diǎn):
1、計(jì)算圖像 I 中每一個(gè)像素的矩陣G和最小特征值λm。
2、尋找整副圖像中最小特征值 λm?中的最大特征值λmax。
3、保留最小特征值 λm?大于給定閾值的像素點(diǎn)。閾值通常取5% λmax?~10% λmax?。
4、保留 λm?局部最大值的像素:像素特征值 λm?大于其3*3 鄰域中其他像素的特征值?λm?。
5、剔除像素密集區(qū)域中的一些像素,確保圖像中相鄰像素的距離都大于給定的閾值(常取5~10 pixels)。
上述操作完成后,圖像 I 中剩下的像素即為選擇的特征點(diǎn),并作為跟蹤特征點(diǎn)。特征點(diǎn)選擇算法的步驟5 確保了特征點(diǎn)間的最小距離。
沒有必要取一個(gè)大的綜合窗口選擇特征點(diǎn)(或計(jì)算矩陣G)。大量實(shí)驗(yàn)證明,wx = wy =1的 3*3 大小的綜合窗口能夠取得滿意的效果。
?
?
金字塔高度的選擇
在大多數(shù)的情況下,超過4的金字塔圖像層次沒有太大的意義。
?
有時(shí)為了簡(jiǎn)化可以將仿射變換矩陣G簡(jiǎn)化為單位矩陣。
?
算法流程
總結(jié)
以上是生活随笔為你收集整理的Lukas-Kanade光流法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式计算互相sayhello
- 下一篇: 服务器性能/压力测试工具http_loa