光流法小結

1. 定義

空間運動物體在觀察成像平面上的像素運動的瞬時速度,是利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關係,從而計算出相鄰幀之間物體的運動信息的一種方法。也就是說,由空間域到圖像平面的投影。而通俗來講,把圖像中的每一個點的瞬時速度和方向找出來就是光流。

2. 光流有什麼用

通過光流判斷物體距離我們的遠近。 一般而言,遠景的物體相對來說光流較小,而近景物體光流較大,尤其是動態場景中的運動物體。

3. 如何計算光流

光流法的第一層推導

3.1 計算光流的幾個假設
(1)相鄰幀之間的亮度恆定;
(2)相鄰視頻幀的取幀時間連續,或者,相鄰幀之間物體的運動比較“微小”;
(3)保持空間一致性;即,同一子圖像的像素點具有相同運動

3.2 光流的基本方程
假設位於(x,y,t) 的像素的亮度是 I(x,y,t) , 該像素在兩個圖像幀之間移動了Δx Δy Δt ,由泰勒展開式我們可以得到:

I(x+Δx,y+Δy,t+Δt)=I(x,y,t)+IxΔx+IyΔy+ItΔt+o

由假設1可知
I(x+Δx,y+Δy,t+Δt)=I(x,y,t)

故有:
IxΔx+IyΔy+ItΔt=0
或者
IxΔxΔt+IyΔyΔt+It=0
這個方程便是我們計算光流的基本方程。

其中ΔxΔtΔyΔt 爲該點在x和y方向上的瞬時速度,也就是光流。
It 代表 像素點在時間上的變化。 可以通過在像素位置(x,y)處兩張圖像之間的像素差。

但是這個我們要計算一個點的光流,有兩個未知數,只有一個方程,該如何解呢?針對這個問題,有很多解決方法:
- 基於梯度的方法
- 基於匹配的方法
- 基於能量的方法
- 基於相位的方法

下面我們介紹一個很經典的算法, LK光流提取算法

LK-光流算法

基本假設:光流在像素點的鄰域是一個常數
然後使用最小二乘法對鄰域中的所有像素點求解基本的光流方程。因爲方程個數已經超過了爲未知量個數
假定像素位置p周圍的領域像素由q1q2q3... ,那麼就有
Ix(q1)Vx+Iy(q1)Vy+It(q1)=0 ;
Ix(q2)Vx+Iy(q2)Vy+It(q2)=0 ;
Ix(q3)Vx+Iy(q3)Vy+It(q3)=0 ;

將其寫爲矩陣的形式,則有

這裏寫圖片描述

然後通過僞逆的形式解最小二乘就可以求解到光流v
v=(ATA)1ATb

L-K 光流算法的缺點

我們首先要設置一個鄰域的窗口,之後計算光流
當窗口較大時,光流計算更魯棒
當窗口較小時,光流計算更正確
原因在於,當圖像中每一個部分的運動都不一致的時候,如果開的窗口過大,很容易違背假設:窗口(鄰域)內的所有點光流一致,這可能與實際不一致,所以窗口小,包含的像素少,更精確些。當運動較爲劇烈的時候,無法實現光流的基本假設,即I(x+Δx,y+Δy,t+Δt)=I(x,y,t) ,因爲Δx Δy 而我們的領域小於實際運動的位移,所以當我們的領域加大的時候,算法更魯棒。

如何解決這一問題,我們採用了金字塔的方法,即窗口固定,將圖像生成金字塔,在每一層金字塔上都用同一個大小的窗口來進行光流計算。那麼在圖像大小較小的時候,窗口顯得較大,此時的光流可以跟蹤速度較快的目標,而在原始圖像的時候,光流窗口相對較小,得到的光流就更準確。這是一個由粗到精的過程。

以上是光流的第一層推導



光流法的第二層推導

光流法的基本方程

這裏寫圖片描述
其中I(x,y) 指原圖,J(x,y) 指參考圖。dx,dy 爲在(ux,uy) 處的光流向量。wx,wy 爲基於座標點(ux,uy) 的搜索窗口(半徑)。

默認情況下,我們認爲dx,dy 應該小於(ux,uy) ,也就是在I圖中的一個點對應J圖時,應該不會超過(ux,uy) 這個窗口的。那麼基於這個假設就出現了上面提到的關於窗口大小與光流準確性及魯棒性帶來的矛盾。下面講如何利用圖像金字塔來解決這個矛盾。

1. 如何建立圖像金字塔

這裏寫圖片描述
按照此公式建立,其中IL 代筆第L層的圖像金字塔。初始情況下使I0 爲原始圖像。按照上述公司,由第L-1層圖像到第L層圖像是通過以下步驟
- 對L-1層圖像進行低通濾波,濾波模板如下
這裏寫圖片描述
- 將濾波後的圖像抽取偶數行偶數列的像素重組爲第L層圖像,因此最後L-1層的圖像大小是L層的一半。

但是對於圖像濾波時邊緣像素怎麼辦呢?由於模板的半徑是1,那麼就首先將原始圖像的像素擴展一圈,寬度爲一個像素,擴展出來的像素值與其相近的原始圖像邊緣像素一致,即
這裏寫圖片描述

2. 根據金字塔逐層計算光流

首先引入兩個光流量:剩餘光流量dL 和猜測光流量gL
核心思想在於:對第L層的光流,是通過由第L-1層的精確光流得到的導出光流量gL 以及這一層以gL 爲基準再次進行匹配微調後得到的剩餘光流量dL 。即第L層的光流kL

kL=gL+dL

gL 由上一層的精確光流猜測得來

gL=2×kL1=2×(gL1+dL1)

基於的事實是:既然第L-1到第L層是降採樣一半,那麼光流量也應該減一半。
但是這樣粗略的估算是不準確的,所以第L層還需要通過基本的光流方程得出剩餘光流量dL 去修正這個值,使得第L層的光流更精確.怎麼得到dL ,就是基本的光流方程
這裏寫圖片描述

這裏可以發現,關於最終光流的搜索範圍事實上是變大了的,如圖所示
這裏寫圖片描述

所有都歸功於上一層光流提供的先驗信息使得光流跳出了wx,wy 的約束,可以到更遠的地方,這樣就解決了上面提到的關於窗口大小的矛盾。事實上,對於在原始圖像(L=0)上開一個d*d的搜索框,在金字塔的情況下,總的搜索半徑可以達到

dfinal=(2lm+11)d

對於一般的視頻做光流而言,採用3*3的窗口,圖像金字塔的層數有2-3層就夠了。因爲覆蓋範圍以及很廣了

最後得到的原始圖像的光流按照一下公式計算而來
這裏寫圖片描述

3. 計算光流基本方程

首先光流基本方程是一個最優化的問題,可以通過求導求其最優解
這裏寫圖片描述
對基本光流方程求導
這裏寫圖片描述

這裏寫圖片描述
B(x+vx,y+vy) 進行一階泰勒展開

這裏寫圖片描述

計算兩張圖像的差

這裏寫圖片描述

計算圖像在wx,wy 鄰域內的差分,這裏可以採用Sharr算子代表差分
這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這樣就算出了LK光流。但是這一光流的假設是泰勒一階展開足夠精確。那麼爲了進一步使得計算出來的光流更加精確,我們採用牛頓逼近法進行迭代。

核心思想在於:在上一次計算出LK光流後,將得到的光流vk 用來更新參考圖像的像素位置(平移),之後再次計算光流。重新更新vk 。如此循環直到迭代次數達到上限或者誤差量ε 小於設定的閾值時停止。 按照上述情況來看,停止迭代後,A圖和B圖兩張圖在(x,y) 點處像素完全重合的。

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏是最終迭代結束後的精確光流量
這裏寫圖片描述

總結算法

這裏寫圖片描述

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