画像の中の物体が移動すると、一定の方向に沿って移動します。この方向と距離を示すベクトルはいわゆるオプティカルフロー(Optical Flow)です。この方向の検出は大変複雑の過程であり、これを簡単化するために、二つの前提条件が設けられました。一つは、移動前と移動後、移動された点の明るさは変わらないことです。一つは、近い点のグループはほぼ同一な移動をします。
\( P(t)_{x,y} \)を時点\(t\)の画像\(P\)の、\((x,y)\)座標にある点の明るさとします。分析のため、\(P\)を可微分に考えます。そうすると、\( P \)は\( \mathbb{R}^3 \to \mathbb{R} \)の関数になります。テイラー式で\(P\)を展開してみます。
(式1):
\[ P(t+\delta t)_{x+\delta x,y+\delta y}=P(t)_{x,y} + \delta x \frac{\partial P}{\partial x}+\delta y \frac{\partial P}{\partial y} + \delta t \frac{\partial P}{\partial t} + \zeta \]
このうち、\( \zeta \)は高次剰余なので、引数の変化が小さい場合のみを考慮しますので、\( \zeta \)を無視します。ここで、一つ目の前提仮設を使います。つまり:\( P(t+\delta t)_{x+\delta x,y+\delta y}=P(t)_{x,y} \)、これを(式1)に代入しますと、
\( 0=\delta x \frac{\partial P}{\partial x}+\delta y \frac{\partial P}{\partial y} + \delta t \frac{\partial P}{\partial t} \)
(式2):
\( 0=\frac{\delta x}{\delta t} \frac{\partial P}{\partial x}+\frac{\delta y}{\delta t} \frac{\partial P}{\partial y} + \frac{\partial P}{\partial t} \)
この中に\( \partial x / \partial t \)と\( \partial y / \partial t \)はオプティカルフロート言われます。言わば、単位時間において、点の変位です。以下は簡略化のため、\( \partial x / \partial t \)と\( \partial y / \partial t \)を\( u \)と\( v \)に称し、\( \partial P / \partial x \)を\( \nabla x \)、\( \partial P / \partial y \)を\( \nabla y \)、\( \partial P / \partial t \)を\( \nabla t \)と称します。そうすると、明らかに、画像全体を通して、(式2)の右側を0にしたいです。詰まり:
\( ec=\int \int (u \nabla x+v \nabla y + \nabla t)^2 dx dy \)
を0にしたいです。
また、2つ目の前提仮設によって、全画像を通して、オプティカルフローの変化量を0にしたいです。詰まり:
\( es=\int\int\left(\left( \frac{\partial u}{\partial x} \right)^2+\left( \frac{\partial u}{\partial y} \right)^2+\left( \frac{\partial v}{\partial x} \right)^2+\left( \frac{\partial v}{\partial y} \right)^2 \right)dx dy \)
を0にしたいです。
両方を同時に0にするって無理なので、\( \lambda > 0 \)を導入して、両方のバランスを図ります。結果として、下記の式を最小化する\( (u,v) \)を求めるようになります。
\[ e = \lambda \times ec + es \]
上記は全部連続の数学なので、実際に計算するときは、変数を離散値で近似する必要があります。
\[
e=\sum_{x,y} \left ( \begin{array}{l}
\lambda \times (u_{x,y} \nabla x_{x,y}+v_{x,y} \nabla y_{x,y} + \nabla t_{x,y})^2 + \\
\frac{1}{4}\left(
(u_{x+1,y}-u_x,y)^2+(u_{x,y+1}-u_x,y)^2+(v_{x+1,y}-v_x,y)^2+(v_{x,y+1}-v_x,y)^2
\right)
\end{array} \right )
\]
備考:あの\(\frac{1}{4}\)はただ便利のためにつけたものです。
観察してみればすぐに分かりますが、\( e \)は厳格な凸関数です。なので、\( u_{x,y},v_{x,y} \)に渡って唯一の最適解があるはずです。
\[ \frac{\partial e}{\partial u_{x,y}}=0 , \frac{\partial e}{\partial v_{x,y}}=0 \]
中間過程が長いので、略します。最終的に下記の反復計算式に辿り着きます。
\( u_{x,y}^{<n+1>}=\bar{u}_{x,y}^{<n>}-\lambda \left( \frac{\bar{u}_{x,y}^{<n>}\nabla x_{x,y}+\bar{v}_{x,y}^{<n>}\nabla y_{x,y}+\nabla t_{x,y}}{1+\lambda(\nabla x_{x,y}^2+\nabla y_{x,y}^2)} \right) \nabla x_{x,y} \)
\( v_{x,y}^{<n+1>}=\bar{v}_{x,y}^{<n>}-\lambda \left( \frac{\bar{u}_{x,y}^{<n>}\nabla x_{x,y}+\bar{v}_{x,y}^{<n>}\nabla y_{x,y}+\nabla t_{x,y}}{1+\lambda(\nabla x_{x,y}^2+\nabla y_{x,y}^2)} \right) \nabla y_{x,y} \)
\( \bar{u}_{x,y} \equiv \frac{1}{4}(u_{x-1,y}+u_{x+1,y}+u_{x,y-1}+u_{x,y+1}) \)
\( \bar{v}_{x,y} \equiv \frac{1}{4}(v_{x-1,y}+v_{x+1,y}+v_{x,y-1}+v_{x,y+1}) \)
以下は実験です。背景の上に、飛行機が少し右に移動されました。移動前と移動後の画像を\( P(0) \)と\( P(1) \)とします。結果は下記の図に示されます。赤の線はオプティカルフローの正方向を示す。緑の線は逆方向を示します。
この画像から、この方法でのオプティカルフローを算出するには一定の効果を得られますが、限界があることは分かります。飛行機を描画する多くの線は斜めなので、しかも同じ色です、少しずらした所、点の視点に立ってみれば、横に行ったか、下に行ったか、判断が着かないです。このため、多くの線は移動方向と違う方向に向いています。縦のエッジに関しては、基本的に正しく右に移動していると検出されています。また、この方法は点ベースの方法です。物体という概念がありません。このため、実際に移動していなくても、移動が検出されてしまいます。飛行機のしたの雲がそうです。