光流法理論背景
1.什么是光流
光流(optical flow)是空間運動物體在觀察成像平面上的像素運動的瞬時速度。
光流法是利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關系,從而計算出相鄰幀之間物體的運動信息的一種方法。
通常將二維圖像平面特定坐標點上的灰度瞬時變化率定義為光流矢量。
一言以概之:所謂光流就是瞬時速率,在時間間隔很小(比如視頻的連續前后兩幀之間)時,也等同於目標點的位移
2.光流的物理意義
一般而言,光流是由於場景中前景目標本身的移動、相機的運動,或者兩者的共同運動所產生的。
當人的眼睛觀察運動物體時,物體的景象在人眼的視網膜上形成一系列連續變化的圖像,這一系列連續變化的信息不斷“流過”視網膜(即圖像平面),好像一種光的“流”,故稱之為光流。光流表達了圖像的變化,由於它包含了目標運動的信息,因此可被觀察者用來確定目標的運動情況。
圖(1)展示的便是三維空間內物體的運動在二維成像平面上的投影。得到的是一個描述位置變化的二維矢量,但在運動間隔極小的情況下,我們通常將其視為一個描述該點瞬時速度的二維矢量u=(u,v),稱為光流矢量。
圖(1) 三維運動在二維平面內的投影
3.光流場
在空間中,運動可以用運動場描述,而在一個圖像平面上,物體的運動往往是通過圖像序列中不同圖像灰度分布的不同體現的,從而,空間中的運動場轉移到圖像上就表示為光流場(optical flow field)。
光流場是一個二維矢量場,它反映了圖像上每一點灰度的變化趨勢,可看成是帶有灰度的像素點在圖像平面上運動而產生的瞬時速度場。它包含的信息即是各像點的瞬時運動速度矢量信息。
研究光流場的目的就是為了從序列圖像中近似計算不能直接得到的運動場。光流場在理想情況下,光流場對應於運動場。
圖(2)三維空間的矢量場及其在二維平面內的投影
圖(3)現實場景的可視化光流場
三言以概之:所謂光流場就是很多光流的集合。
當我們計算出了一幅圖片中每個圖像的光流,就能形成光流場。
構建光流場是試圖重現現實世界中的運動場,用以運動分析。
光流法基本原理
1.基本假設條件
(1)亮度恆定不變。即同一目標在不同幀間運動時,其亮度不會發生改變。這是基本光流法的假定(所有光流法變種都必須滿足),用於得到光流法基本方程;
(2)時間連續或運動是“小運動”。即時間的變化不會引起目標位置的劇烈變化,相鄰幀之間位移要比較小。同樣也是光流法不可或缺的假定。
2.基本約束方程
考慮一個像素I(x,y,t)在第一幀的光強度(其中t代表其所在的時間維度)。它移動了 (dx,dy)的距離到下一幀,用了dt時間。因為是同一個像素點,依據上文提到的第一個假設我們認為該像素在運動前后的光強度是不變的,即:
將(1)式右端進行泰勒展開,得:
其中ε代表二階無窮小項,可忽略不計。再將(2)代人(1)后同除dt,可得:
設u,v分別為光流分別為沿X軸與Y軸的速度矢量,得:
令分別表示圖像中像素點的灰度沿X,Y,T方向的偏導數。
綜上,式(3)可以寫為:
其中,Ix,Iy,It均可由圖像數據求得,而(u,v)即為所求光流矢量。
約束方程只有一個,而方程的未知量有兩個,這種情況下無法求得u和v的確切值。此時需要引入另外的約束條件,從不同的角度引入約束條件,導致了不同光流場計算方法。按照理論基礎與數學方法的區別把它們分成四種:基於梯度(微分)的方法、基於匹配的方法、基於能量(頻率)的方法、基於相位的方法和神經動力學方法。
3.幾種光流估計算法的簡介
1) 基於梯度的方法
基於梯度的方法又稱為微分法,它是利用時變圖像灰度(或其濾波形式)的時空微分(即時空梯度函數)來計算像素的速度矢量。
由於計算簡單和較好的結果,該方法得到了廣泛應用和研究。典型的代表是Horn-Schunck算法與Lucas-Kanade(LK)算法。
Horn-Schunck算法在光流基本約束方程的基礎上附加了全局平滑假設,假設在整個圖像上光流的變化是光滑的,即物體運動矢量是平滑的或只是緩慢變化的。
基於此思想,大量的改進算法不斷提出。Nagel采用有條件的平滑約束,即通過加權矩陣的控制對梯度進行不同平滑處理;Black和Anandan針對多運動的估計問題,提出了分段平滑的方法。
2) 基於匹配的方法
基於匹配的光流計算方法包括基於特征和區域的兩種。
基於特征的方法不斷地對目標主要特征進行定位和跟蹤,對目標大的運動和亮度變化具有魯棒性。存在的問題是光流通常很稀疏,而且特征提取和精確匹配也十分困難。
基於區域的方法先對類似的區域進行定位,然后通過相似區域的位移計算光流。這種方法在視頻編碼中得到了廣泛的應用。然而,它計算的光流仍不稠密。另外,這兩種方法估計亞像素精度的光流也有困難,計算量很大。
3)基於能量的方法
基於能量的方法又稱為基於頻率的方法,在使用該類方法的過程中,要獲得均勻流場的准確的速度估計,就必須對輸入的圖像進行時空濾波處理,即對時間和空間的整合,但是這樣會降低光流的時間和空間分辨率。基於頻率的方法往往會涉及大量的計算,另外,要進行可靠性評價也比較困難。
4)基於相位的方法
基於相位的方法是由Fleet和Jepson提出的,Fleet和Jepson最先提出將相位信息用於光流計算的思想。當我們計算光流的時候,相比亮度信息,圖像的相位信息更加可靠,所以利用相位信息獲得的光流場具有更好的魯棒性。基於相位的光流算法的優點是:對圖像序列的適用范圍較寬,而且速度估計比較精確,但也存在着一些問題:第一,基於相位的模型有一定的合理性,但是有較高的時間復雜性;第二,基於相位的方法通過兩幀圖像就可以計算出光流,但如果要提高估計精度,就需要花費一定的時間;第三,基於相位的光流計算法對圖像序列的時間混疊是比較敏感的。
5)神經動力學方法
神經動力學方法是利用神經網絡建立的視覺運動感知的神經動力學模型,它是對生物視覺系統功能與結構比較直接的模擬。
盡管光流計算的神經動力學方法還很不成熟,然而對它的研究卻具有極其深遠的意義。隨着生物視覺研究的不斷深入,神經方法無疑會不斷完善,也許光流計算乃至計算機視覺的根本出路就在於神經機制的引入。神經網絡方法是光流技術的一個發展方向。
3.稠密光流與稀疏光流
除了根據原理的不同來區分光流法外,還可以根據所形成的光流場中二維矢量的疏密程度將光流法分為稠密光流與稀疏光流兩種。
- 稠密光流
稠密光流是一種針對圖像或指定的某一片區域進行逐點匹配的圖像配准方法,它計算圖像上所有的點的偏移量,從而形成一個稠密的光流場。通過這個稠密的光流場,可以進行像素級別的圖像配准。
Horn-Schunck算法以及基於區域匹配的大多數光流法都屬於稠密光流的范疇。
圖(4) 基於區域匹配方法生成稠密光流場圖例
由於光流矢量稠密,所以其配准后的效果也明顯優於稀疏光流配准的效果。但是其副作用也是明顯的,由於要計算每個點的偏移量,其計算量也明顯較大,時效性較差。
- 稀疏光流
與稠密光流相反,稀疏光流並不對圖像的每個像素點進行逐點計算。它通常需要指定一組點進行跟蹤,這組點最好具有某種明顯的特性,例如Harris角點等,那么跟蹤就會相對穩定和可靠。稀疏跟蹤的計算開銷比稠密跟蹤小得多。
上文提到的基於特征的匹配方法是典型的屬於稀疏光流的算法。
圖(5) 基於特征匹配方法生成稀疏光流場圖例
Lucas-Kanade(LK)光流法
LK光流法於1981年提出,最初是用於求稠密光流的,由於算法易於應用在輸入圖像的一組點上,而成為求稀疏光流的一種重要方法。
LK光流法在原先的光流法兩個基本假設的基礎上,增加了一個“空間一致”的假設,即所有的相鄰像素有相似的行動。也即在目標像素周圍m×m的區域內,每個像素均擁有相同的光流矢量。以此假設解決式 無法求解的問題。
- LK光流法約束方程
在一個小鄰域內,LK光流法通過對下式的加權平方和最小化來估計光流矢量
上式中是一個窗口權重函數,該函數使得鄰域中心的加權比周圍的大。對於Ω內的n個點X1⋯Xn,設
故上面方程的解可由最小二乘法得到:
最后得:
通過結合幾個鄰近像素點的信息,LK光流法通常能夠消除光流方程里的多義性。而且,與逐點計算的方法相比,LK方法對圖像噪聲不敏感。
- 金字塔LK光流法
LK算法的約束條件即:小速度,亮度不變以及區域一致性都是較強的假設,並不很容易得到滿足。如當物體運動速度較快時,假設不成立,那么后續的假設就會有較大的偏差,使得最終求出的光流值有較大的誤差。圖像金字塔可以解決這個問題。
考慮物體的運動速度較大時,算法會出現較大的誤差。那么就希望能減少圖像中物體的運動速度。一個直觀的方法就是,縮小圖像的尺寸。假設當圖像為400×400時,物體速度為[16 16],那么圖像縮小為200×200時,速度變為[8,8]。縮小為100*100時,速度減少到[4,4]。所以在源圖像縮放了很多以后,原算法又變得適用了。所以光流可以通過生成 原圖像的金字塔圖像,逐層求解,不斷精確來求得。簡單來說上層金字塔(低分辨率)中的一個像素可以代表下層的四個。
一段以補充:我靈魂畫手在畫下圖時表達稍微不恰當Σ(っ°Д°;)っ,黑色方塊實際上應該為方框。表示的是所選區域的大小在金字塔各層中的不變,而並不代表該區域內像素點保持怎樣的狀態或是有什么聯系。沒有!在圖像縮放過程中每個區域的像素灰度值情況都會在變化。只是說我們基於LK算法假設的“空間一致”讓“一片區域具有相同的運動狀態”。這個所謂的區域並不是指某一個有相同特征的像素集合,僅僅只是一個框,一個范圍的概念,一個大小的概念而已。
一段以解釋:黑色方塊代表兩個連續的幀內同一目標的不同位置。為了觀察方便我才將其放在一張圖里。
面對“大運動”時我光流法的局限是什么?顯然是運動距離大原算法不適用。(hhh)那么其實只要通過圖片尺寸的不斷縮小,而且目標選框大小保持不變,讓運動前后兩個物體的位置看上去“不斷靠近”,直到變成小運動就可以使用光流法了。讀者可能會存在很多疑問:1.為什么圖片整體尺寸縮減時假定的目標其“尺寸”可以保持不變?2.只在分辨率很小的尺度內計算光流,有什么用?能替代真實的光流矢量的值嗎?
我先粗略解釋一下,然后下文會展示詳細的算法過程,讓讀者能有更深刻的認識。
1.不論是在什么尺寸(尺度,縮小圖片其實是模擬觀察者的遠近)的情況下,我們都堅持LK光流法的假設,即“空間一致”,不管我們看到圖像是1000x1000還是10x10,我們都認為一個像素和它周圍的一片區域內的若干個像素具有相同的速度。這是你使用LK光流法就必須承認的一個假設。這一片區域大小不一定是50x50,但始終是存在且不隨客觀情況改變只由你自己的判斷而確定。
2.在低尺度下只計算一次當然不准,為什么?你把圖片弄得很模糊又很小,丟失了很多信息,還想檢測准確?但是在低尺度下的光流矢量的測量能給我們一個指示,就像是低尺度下它綜觀全局,告訴你“運動大概是5點鍾方向,大小大概是【32,57】”之類的信息。這條信息夠粗糙,但是大體上是有用的。它使得你在進入金字塔的下一層時有一個大概的頭緒,你由此指示可以在下一層金字塔再一次順利“靠近”真實目標,強行符合“小運動”。這里可能說得很抽象,大家細細看下面的具體算法再回來看這一段或許會有所啟示。
(下面這一部分具體參照CSDN博客:https://blog.csdn.net/sgfmby1994/article/details/68489944 ,寫得非常棒,受益匪淺)
1)算法步驟簡介
a.首先,對每一幀建立一個高斯金字塔,最低分辨率圖像在最頂層,原始圖片在底層。
b.計算光流。從頂層(Lm層)開始,通過最小化每個點的鄰域范圍內的匹配誤差和,得到頂層圖像中每個點的光流。
假設圖像的尺寸每次縮放為原來的一半,共縮放了Lm層,則第0層為原圖像。設已知原圖的位移為d,則每層的位移為:
c.頂層的光流計算結果(位移情況)反饋到第Lm-1層,作為該層初始時的光流值的估計g。
d.這樣沿着金字塔向下反饋,重復估計動作,直到到達金字塔的底層(即原圖像)。
(准確值=估計值+殘差) “殘差”即本算法的關鍵對於每一層L,每個點的光流的計算都是基於鄰域內所有點的匹配誤差和最小化。
為了更好地理解金字塔LK光流法,下圖簡單展示了算法的實現過程:
一段以解釋:低尺度下找到光流矢量d0,將其扔到下一層去指引我們前行。扔下去后首先要放大兩倍,此時你開始抱怨:“上一層找到的d0根本不靠譜,差距好大”(圖2中藍方塊與右下角黑色方塊的差距)但是你也要慶幸,正是“不靠譜”的d0讓你到達了藍色方塊的位置,讓你離真實區域前進了很多,否則你還在左上角苦於“小運動”寸步難行呢。在藍色位置你就滿足“小運動”了,繼續計算光流,得到d1,然后把(2d0+d1)扔到下一層指導我們繼續前行,如此往復。
2)一些實現細節
金字塔的構建
- 利用低通濾波器平滑圖像
- 對平滑圖像進行間隔采樣,生成金字塔圖像,每一層圖像的高度與寬度均是下一層的二分之一。
金字塔跟蹤
首先,從頂層開始計算金字塔最頂層圖像上的光流。然后,根據最頂層(Lm-1) 光流的計算結果估計次頂層光流的初始值,再計算次頂層圖像上光流的精確值。最后,根據次上層光流的計算結果估計下一層(Lm-2) 光流的初始值,計算其精確值后再反饋到下一 層,直至計算出最底層 的原始圖像的光流。
- 初始化頂層圖像光流矢量估計值為0.
- 鄰域內所有像素點的匹配誤差和記為:
- 對其進行求導,得:
- 對B(x+vx,y+vy)進行泰勒展開:
- 導數公式可轉化為:
- 帶入
得:
定義:
有
- 最終得光流矢量最優解為:
觀察G與b的組成,可知δI其實是兩幀同層圖像灰度之間的差值。而Ix,Iy分別是圖像在該點處梯度的x方向分量與y方向分量。
根據δI與Ix,Iy求得空間梯度 矩陣G和b。以此得到Lm層圖像的最佳光流dLm。
解釋一下:前面說得好像很輕松,什么“然后就計算一下光流矢量”。但是具體要怎么做呢?我這里只粗略講講思路,具體結合上面的公式再來看或許才能有所感悟。
很簡單,我不是知道前一幀目標的具體位置(x,y)嗎?我還給它畫了個假定范圍內速度一致對吧?好,現在我來個遍歷,我讓光流矢量(速度)取[-100,100]到[100,100]一個一個代(比如取[10,10]),然后到后一幀里讓原來的目標x,y加上[10,10],看看得到的這一個點(x+10,y+10)和上一幀的(x,y)點的灰度值差多少(別忘了我們最基礎的假設一:同一目標運動過程中灰度值(光強)大小保持恆定,灰度值差當然越小我們就越認為找的沒錯啦),范圍w內的其他像素點小伙伴們也一樣加上[10,10]進行比較,看看誤差有多大。如果覺得[10,10]誤差太大了接受不了,就取[11,10]看看。直到取到一個(例如[73,29])使得誤差最小,那么我們就說[73,29]是(x,y)點的光流矢量了。
這種遍歷看上去是不是好low?的確如此。所以我們用的並不是這個方法。Σ(っ°Д°;)っΣ(っ°Д°;)っΣ(っ°Д°;)っ
上文中 的其實就像是這樣的一個函數:自變量是速度矢量,函數值是誤差的大小。我們要求在什么速度矢量的輸入下得到的誤差最小,直接求導嘛!!!!!就不用一個一個v傻傻代入了呀。求導讓導函數等於零,此時的v正是所求的光流矢量。此方法與上一段的“傻方法”效果一樣,但是計算十分簡便了。思路就是這么個思路,具體一些細節還是看上面。
迭代過程
將上層圖像得到的光流矢量累加值傳遞到下一層做為初始值,即:
可以看出,最終光流值就是所有層光流矢量的疊加。
最后我們可以總結一下使用金字塔圖像計算光流的好處,它對於每一次光流的都會保持很小,但是最終計算出來的光流可以進行放大然后累計。所以利用相對較小的鄰域窗口就可以處理較大的像素運動。
基於光流的運動目標檢測(前景檢測)算法
基於光流運動目標檢測是在對攝像機采集到的圖像序列進行重采樣和去噪預處理后,利用光流法計算出各點的光流值,得出各點的光流場。然后對光流場進行閾值分割,區分出前景與背景,得到清運動目標區域。一般還會再采用形態學濾波中的開、閉運算濾除孤立噪聲點,最后經過區域連通便可識別出目標區域並統計其特征信息。流程圖如下:
實現原理
使用光流法進行前景檢測是是基於這樣一個認識:
如果圖像中沒有運動目標,則光流矢量在整個圖像區域是連續變化的。當圖像中有運動物體時,目標和背景存在着相對運動。運動物體所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以計算出運動物體的位置。
圖(3)現實場景的可視化光流場
通過觀察上圖我們可以看到,發生運動的物體的光流矢量與背景光流矢量之間存在差異。使用閥值分割可以將整幅圖片的光流矢量分成兩個部分,即區分出背景與前景。閥值的選取可以使用最大類間方差法(大津算法)來確定。它是按圖像的灰度特性,將圖像分成背景和目標兩部分。背景和目標之間的類間方差越大,說明構成圖像的2部分的差別越大,當部分目標錯分為背景或部分背景錯分為目標都會導致兩部分差別變小。因此,使類間方差最大的分割意味着錯分概率最小。
光流場經過閾值分割后,有一些獨立的點或者有凹區域,影響了運動目標的提取。可先利用開運算,去除那些光流值與結構元素不相吻合的凹區域,同時保留那些相吻合的凹區域。然后,利用形態學濾波的閉運算,填充凹區域。
通過前面的處理,一幀圖像中可能的目標區域已經成為一個可以連成一體的區域,采用合理的區域連通合並和分割技術來找出最終的目標區域。
光流法的優缺點
優點
光流法的優點在於它無須了解場景的信息,就可以准確地檢測識別運動日標位置,且在攝像機處於運動的情況下仍然適用。
而且光流不僅攜帶了運動物體的運動信息,而且還攜帶了有關景物三維結構的豐富信息,它能夠在不知道場景的任何信息的情況下,檢測出運動對象。
缺點
光流法的適用條件,即兩個基本假設,在現實情況下均不容易滿足。
假設一:亮度恆定不變。
但是實際情況是光流場並不一定反映了目標的實際運動情況,如圖,所示。圖中,光源不動,而物體表面均一,且產生了自傳運動,卻並沒有產生光流圖中,物體並沒有運動,但是光源與物體發生相對運動,卻有光流產生。因此可以說光流法法對光線敏感, 光線變化極易影響識別效果。
假設二:小運動。
前文也有提到,現實情況下較大距離的運動也是普遍存在的。因此當需要檢測的目標運動速度過快是,傳統光流法也不適用。
孔徑問題
觀察上圖(a)我們可以看到目標是在向右移動,但是由於“觀察窗口”過小我們無法觀測到邊緣也在下降。LK算法中選區的小鄰域就如同上圖的觀察窗口,鄰域大小的選取會影響到最終的效果。當然,這是針對於一部分稀疏光流算法而言,屬於稠密光流范疇的算法一般不存在這個問題。
但是稠密光流法的顯著缺點主要體現在,計算量大,耗時長,在對實時性要求苛刻的情況下並不適用。
總結
對於光流法來說,時效性與精確性難以兼得。
在對於運動場景和目標無有效認知,運動模型難以預測、目標特征無法確定的情況下,若使用光流法構建稠密光流場,並且使用金字塔算法補充對於大幅度運動的檢測精度,無論是應用於前景檢測還是目標跟蹤都能起到不錯的效果,能夠較高的檢測精度。但是顯而易見,這樣的算法復雜度很高,計算量十分巨大,時效性極差。
相反,若結合特征檢測算法,針對特征點構建稀疏光流場,能夠極大提高算法的執行效率。但是相對的,由於稀疏光流場所能獲得的場景運動信息過少,檢測精度與准確性難以保證。
此外,光流法理論的基礎建立在同一物體亮度恆定的假設上,現實中較難完全滿足,這也是光流法的一大不足之處。
參考資料
https://blog.csdn.net/zhonghuan1992/article/details/38508185
http://blog.csdn.net/zouxy09/article/details/8683859
https://blog.csdn.net/conanlrj/article/details/5102481
https://blog.csdn.net/gwplovekimi/article/details/80545274
《基於光流法的運動目標檢測與跟蹤技術》裴巧娜《北方工業大學》 , 2009
《基於改進光流法的運動目標檢測》楊葉梅 《計算機與數字工程》 , 2011
《光流法簡述》孔令上,重慶郵電大學,2015