1. 定義
空間運動物體在觀察成像平面上的像素運動的瞬時速度,是利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關係,從而計算出相鄰幀之間物體的運動信息的一種方法。也就是說,由空間域到圖像平面的投影。而通俗來講,把圖像中的每一個點的瞬時速度和方向找出來就是光流。
2. 光流有什麼用
通過光流判斷物體距離我們的遠近。 一般而言,遠景的物體相對來說光流較小,而近景物體光流較大,尤其是動態場景中的運動物體。
3. 如何計算光流
光流法的第一層推導
3.1 計算光流的幾個假設
(1)相鄰幀之間的亮度恆定;
(2)相鄰視頻幀的取幀時間連續,或者,相鄰幀之間物體的運動比較“微小”;
(3)保持空間一致性;即,同一子圖像的像素點具有相同運動
3.2 光流的基本方程
假設位於
由假設1可知
故有:
或者
這個方程便是我們計算光流的基本方程。
其中
但是這個我們要計算一個點的光流,有兩個未知數,只有一個方程,該如何解呢?針對這個問題,有很多解決方法:
- 基於梯度的方法
- 基於匹配的方法
- 基於能量的方法
- 基於相位的方法
下面我們介紹一個很經典的算法, LK光流提取算法
LK-光流算法
基本假設:光流在像素點的鄰域是一個常數
然後使用最小二乘法對鄰域中的所有像素點求解基本的光流方程。因爲方程個數已經超過了爲未知量個數
假定像素位置p周圍的領域像素由
…
將其寫爲矩陣的形式,則有
然後通過僞逆的形式解最小二乘就可以求解到光流
L-K 光流算法的缺點
我們首先要設置一個鄰域的窗口,之後計算光流
當窗口較大時,光流計算更魯棒
當窗口較小時,光流計算更正確
原因在於,當圖像中每一個部分的運動都不一致的時候,如果開的窗口過大,很容易違背假設:窗口(鄰域)內的所有點光流一致,這可能與實際不一致,所以窗口小,包含的像素少,更精確些。當運動較爲劇烈的時候,無法實現光流的基本假設,即
如何解決這一問題,我們採用了金字塔的方法,即窗口固定,將圖像生成金字塔,在每一層金字塔上都用同一個大小的窗口來進行光流計算。那麼在圖像大小較小的時候,窗口顯得較大,此時的光流可以跟蹤速度較快的目標,而在原始圖像的時候,光流窗口相對較小,得到的光流就更準確。這是一個由粗到精的過程。
以上是光流的第一層推導
光流法的第二層推導
光流法的基本方程
其中
默認情況下,我們認爲
1. 如何建立圖像金字塔
按照此公式建立,其中
- 對L-1層圖像進行低通濾波,濾波模板如下
- 將濾波後的圖像抽取偶數行偶數列的像素重組爲第L層圖像,因此最後L-1層的圖像大小是L層的一半。
但是對於圖像濾波時邊緣像素怎麼辦呢?由於模板的半徑是1,那麼就首先將原始圖像的像素擴展一圈,寬度爲一個像素,擴展出來的像素值與其相近的原始圖像邊緣像素一致,即
2. 根據金字塔逐層計算光流
首先引入兩個光流量:剩餘光流量
核心思想在於:對第L層的光流,是通過由第L-1層的精確光流得到的導出光流量
基於的事實是:既然第L-1到第L層是降採樣一半,那麼光流量也應該減一半。
但是這樣粗略的估算是不準確的,所以第L層還需要通過基本的光流方程得出剩餘光流量
這裏可以發現,關於最終光流的搜索範圍事實上是變大了的,如圖所示
所有都歸功於上一層光流提供的先驗信息使得光流跳出了
對於一般的視頻做光流而言,採用3*3的窗口,圖像金字塔的層數有2-3層就夠了。因爲覆蓋範圍以及很廣了
最後得到的原始圖像的光流按照一下公式計算而來
3. 計算光流基本方程
首先光流基本方程是一個最優化的問題,可以通過求導求其最優解
對基本光流方程求導
對
計算兩張圖像的差
計算圖像在
這樣就算出了LK光流。但是這一光流的假設是泰勒一階展開足夠精確。那麼爲了進一步使得計算出來的光流更加精確,我們採用牛頓逼近法進行迭代。
核心思想在於:在上一次計算出LK光流後,將得到的光流
這裏是最終迭代結束後的精確光流量