運動與視訊

光流

光流是兩個連續視訊影格之間,亮度圖樣的「表觀運動」(apparent motion)。對每個像素,你都產生一個小箭頭,也就是一個速度向量,記為 (u, v),它表示該像素處的內容從這一格到下一格看起來移動了多遠、往哪個方向。一個生動的比喻:想像風吹過一片草地,而你只能看到草、看不到風。光流就是你看著草如何彎曲,對風所做的最佳猜測。關鍵在於:光流講的是「畫面亮度如何移動」,這未必等同於「真實世界如何移動」。

最主要的假設是亮度恆定(brightness constancy):表面上的一個點在影格之間微幅移動時,其強度保持不變。用 I(x, y, t) 表示時間 t、像素位置 (x, y) 的影像強度,這個假設就是 I(x, y, t) = I(x + u, y + v, t + 1)。對右式做一階泰勒展開,便得到光流約束方程式:I_x·u + I_y·v + I_t = 0,其中 I_x、I_y 是空間梯度(亮度沿向右與向下方向變化的快慢),I_t 是時間梯度(在固定像素上亮度隨影格變化的快慢)。這是一條含兩個未知數(u 與 v)的線性方程式,因此單一像素本身永遠無法確定完整的運動。

這種「未定」有個名字:孔徑問題(aperture problem)。透過一個小孔看一條移動的直邊,你只能量到「垂直於邊緣」方向的運動分量(即法向光流,normal flow);沿著邊緣滑動的運動則看不見。要還原完整的二維光流,必須加入額外約束:要嘛假設鄰近像素的運動相近(Lucas-Kanade,使用一個局部視窗),要嘛假設整個光流場是平滑的(Horn-Schunck,一種變分懲罰項)。這也說明了為何光流在角點與有紋理的區域可以被良好確定,在邊緣上則有歧義,在平坦、無紋理的區域則根本無法求解。

一條垂直邊緣沿對角線滑動;透過一個極小的圓形孔徑觀看時,它看起來只在水平方向移動,因為唯一可觀測的只有垂直於邊緣的分量——這正是孔徑問題的一句話示範。

光流是「表觀運動場」,並非真實三維運動投影到影像上的「真實運動場」。理髮店旋轉招牌錯覺與旋轉蛇錯覺正是利用了這個落差。亮度恆定也會被光照變化、陰影、鏡面高光與透明物體破壞,因此即使場景毫無移動,原始光流也可能出錯。