Horn-Schunck光流算法通过引入全局平滑约束来做图像中的运动估计。Horn和Schunck设定图像中像素的运动速度和其临近像素的速度相似或相同,且光流场中的每处的速度变化是平滑的,不会突变【学习本文内容前,需要先了解光流的基础知识】。有两种方法来表示平滑约束(最小化以下式子):
( ∂ u ∂ x ) 2 + ( ∂ u ∂ y ) 2 和 ( ∂ v ∂ x ) 2 + ( ∂ v ∂ y ) 2 (\frac{\partial{u}}{\partial{x}})^2+(\frac{\partial{u}}{\partial{y}})^2 \hspace{0.5cm} 和 \hspace{0.5cm} (\frac{\partial{v}}{\partial{x}})^2+(\frac{\partial{v}}{\partial{y}})^2 (∂x∂u)2+(∂y∂u)2和(∂x∂v)2+(∂y∂v)2
或者:
∇ 2 u = ∂ 2 u ∂ 2 x + ∂ 2 u ∂ 2 y 和 ∇ 2 v = ∂ 2 v ∂ 2 x + ∂ 2 v ∂ 2 y \nabla^2{u} = \frac{\partial^2{u}}{\partial^2{x}}+\frac{\partial^2{u}}{\partial^2{y}} \hspace{0.5cm} 和 \hspace{0.5cm} \nabla^2{v} = \frac{\partial^2{v}}{\partial^2{x}}+\frac{\partial^2{v}}{\partial^2{y}} ∇2u=∂2x∂2u+∂2y∂2u和∇2v=∂2x∂2v+∂2y∂2v
对于 ∇ 2 u \nabla^2{u} ∇2u和 ∇ 2 v \nabla^2{v} ∇2v的计算,可以参考Horn和Schunck在1981年发表的论文 D e t e r m i n i n g O p t i c a l F l o w Determining\ Optical\ Flow Determining Optical Flow中的计算方法。如下:
∇ 2 u ≈ 3 ( u ˉ i , j , k − u i , j , k ) 和 ∇ 2 v ≈ 3 ( v ˉ i , j , k − v i , j , k ) \nabla^2{u} \approx \ _{3}(\bar{u}_{i,j,k} - u_{i,j,k}) \hspace{0.5cm} 和 \hspace{0.5cm} \nabla^2{v} \approx \ _{3}(\bar{v}_{i,j,k} - v_{i,j,k}) ∇2u≈ 3(uˉi,j,k−ui,j,k)和∇2v≈ 3(vˉi,j,k−vi,j,k)
其中,左下标 3 3 3表示像素的临近范围, u ˉ i , j , k \bar{u}_{i,j,k} uˉi,j,k和 v ˉ i , j , k \bar{v}_{i,j,k} vˉi,j,k定义如下:
u ˉ i , j , k = 1 6 { u i − 1 , j , k + u i , j + 1 , k + u i + 1 , j , k + u i , j − 1 , k } + 1 12 { u i − 1 , j − 1 , k + u i − 1 , j + 1 , k + u i + 1 , j + 1 , k + u i + 1 , j − 1 , k } , v ˉ i , j , k = 1 6 { v i − 1 , j , k + v i , j + 1 , k + v i + 1 , j , k + v i , j − 1 , k } + 1 12 { v i − 1 , j − 1 , k + v i − 1 , j + 1 , k + v i + 1 , j + 1 , k + v i + 1 , j − 1 , k } , \begin{aligned} \bar{u}_{i,j,k} = & \frac{1}{6}\{ u_{i-1,j,k} + u_{i,j+1,k} + u_{i+1,j,k} + u_{i,j-1,k}\} \\ & + \frac{1}{12}\{ u_{i-1,j-1,k} + u_{i-1,j+1,k} + u_{i+1,j+1,k} + u_{i+1,j-1,k}\}, \\ \bar{v}_{i,j,k} = & \frac{1}{6}\{ v_{i-1,j,k} + v_{i,j+1,k} + v_{i+1,j,k} + v_{i,j-1,k}\} \\ & + \frac{1}{12}\{ v_{i-1,j-1,k} + v_{i-1,j+1,k} + v_{i+1,j+1,k} + v_{i+1,j-1,k}\}, \\ \end{aligned} uˉi,j,k=vˉi,j,k=61{ ui−1,j,k+ui,j+1,k+ui+1,j,k+ui,j−1,k}+121{ ui−1,j−1,k+ui−1,j+1,k+ui+1,j+1,k+ui+1,j−1,k},61{ vi−1,j,k+vi,j+1,k+vi+1,j,k+vi,j−1,k}+121{ vi−1,j−1,k+vi−1,j+1,k+vi+1,j+1,k+vi+1,j−1,k},
至此,Horn-Schunck光流算法已经建立了两个约束条件,可以完成对光流中的 u u u和 v v v的计算。
ξ b = u I x + v I y + I t ξ c 2 = ∇ 2 u + ∇ 2 v \begin{aligned} & \xi_{b} = uI_{x} + vI_{y} + I_{t} \\ & \xi_{c}^{2} = \nabla^2{u} + \nabla^2{v} \end{aligned} ξb=uIx+vIy+Itξc2=∇2u+∇2v
基于上两式,Horn和Schunck构建误差函数 ξ 2 \xi^2 ξ2,如下:
ξ 2 = ∫ ∫ ( α 2 ξ c 2 + ξ b 2 ) d x d y \xi^2 = \int\int (\alpha^{2}\xi_{c}^2 + \xi_{b}^2)dxdy ξ2=∫∫(α2ξc2+ξb2)dxdy
其中, α \alpha α值越大,光流越平滑。目标是计算误差函数 ξ 2 \xi^2 ξ2取得最小值时, u u u和 v v v的取值。通过变分法(博主还不懂变分法,以后慢慢学~~),误差函数 ξ 2 \xi^2 ξ2可变换为:
I x 2 u + I x I y v = α 2 ∇ 2 u − I x I t I x I y u + I y 2 v = α 2 ∇ 2 v − I y I t \begin{aligned} I_{x}^{2}u + I_{x}I_{y}v = \alpha^{2}\nabla^2{u} - I_{x}I_{t} \\ I_{x}I_{y}u + I_{y}^2v = \alpha^{2}\nabla^2{v} - I_{y}I_{t} \end{aligned} Ix2u+IxIyv=α2∇2u−IxItIxIyu+Iy2v=α2∇2v−IyIt
代入 ∇ 2 u = u ˉ i , j , k − u i , j , k \nabla^2{u} = \bar{u}_{i,j,k} - u_{i,j,k} ∇2u=uˉi,j,k−ui,j,k和 ∇ 2 v = u ˉ i , j , k − u i , j , k \nabla^2{v} = \bar{u}_{i,j,k} - u_{i,j,k} ∇2v=uˉi,j,k−ui,j,k,得:
( α 2 + I x 2 ) u + I x I y v = ( α 2 u ˉ − I x I t ) I x I y u + ( α 2 + I y 2 ) v = ( α 2 v ˉ − I y I t ) (\alpha^2 + I_{x}^{2})u + I_{x}I_{y}v = (\alpha^2\bar{u} - I_{x}I_{t}) \\ I_{x}I_{y}u + (\alpha^2 + I_{y}^{2})v = (\alpha^2\bar{v} - I_{y}I_{t}) (α2+Ix2)u+IxIyv=(α2uˉ−IxIt)IxIyu+(α2+Iy2)v=(α2vˉ−IyIt)
上式的矩阵形式为:
[ α 2 + I x 2 I x I y I x I y α 2 + I y 2 ] [ u v ] = [ α 2 u ˉ − I x I t α 2 v ˉ − I y I t ] \begin{bmatrix} \alpha^2 + I_{x}^{2} & I_{x}I_{y} \\ I_{x}I_{y} & \alpha^2 + I_{y}^{2} \end{bmatrix} \begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} \alpha^2\bar{u} - I_{x}I_{t} \\ \alpha^2\bar{v} - I_{y}I_{t} \end{bmatrix} [α2+Ix2IxIyIxIyα2+Iy2][uv]=[α2uˉ−IxItα2vˉ−IyIt]
通过对上式进行行列式计算,得到 u u u和 v v v的表达式:
( α 2 + I x 2 + I y 2 ) u = ( α 2 + I y 2 ) u ˉ − I x I y v ˉ − I x I t ( α 2 + I x 2 + I y 2 ) v = − I x I y u ˉ + ( α 2 + I x 2 ) v ˉ − I y I t \begin{aligned} & (\alpha^2 + I_{x}^{2} + I_{y}^2)u = (\alpha^2 + I_{y}^2)\bar{u} - I_{x}I_{y}\bar{v} - I_{x}I_{t} \\ & (\alpha^2 + I_{x}^{2} + I_{y}^2)v = -I_{x}I_{y}\bar{u} + (\alpha^2 + I_{x}^2)\bar{v} - I_{y}I_{t} \end{aligned} (α2+Ix2+Iy2)u=(α2+Iy2)uˉ−IxIyvˉ−IxIt(α2+Ix2+Iy2)v=−IxIyuˉ+(α2+Ix2)vˉ−IyIt
上式的另一种形式可以是:
( α 2 + I x 2 + I y 2 ) ( u − u ˉ ) = − I x [ I x u ˉ + I y v ˉ + I t ] ( α 2 + I x 2 + I y 2 ) ( v − v ˉ ) = − I y [ I x u ˉ + I y v ˉ + I t ] (\alpha^2 + I_{x}^{2} + I_{y}^2)(u - \bar{u}) = -I_{x}[I_{x}\bar{u} + I_{y}\bar{v} + I_{t}] \\ (\alpha^2 + I_{x}^{2} + I_{y}^2)(v - \bar{v}) = -I_{y}[I_{x}\bar{u} + I_{y}\bar{v} + I_{t}] (α2+Ix2+Iy2)(u−uˉ)=−Ix[Ixuˉ+Iyvˉ+It](α2+Ix2+Iy2)(v−vˉ)=−Iy[Ixuˉ+Iyvˉ+It]
由于一开始, u u u和 v v v的取值未知,因此 u ˉ \bar{u} uˉ和 v ˉ \bar{v} vˉ的取值也未知。无法直接通过上式计算 u u u和 v v v的取值。不过,我们可以采用迭代的方式来计算:
u n + 1 = u ˉ n − I x [ I x u ˉ n + I y v ˉ n + I t ] α 2 + I x 2 + I y 2 v n + 1 = v ˉ n − I y [ I x u ˉ n + I y v ˉ n + I t ] α 2 + I x 2 + I y 2 \begin{aligned} u^{n+1} = \bar{u}^{n} - \frac{I_{x}[I_{x}\bar{u}^{n} + I_{y}\bar{v}^{n} + I_{t}]}{\alpha^2 + I_{x}^{2} + I_{y}^2} \\ v^{n+1} = \bar{v}^{n} - \frac{I_{y}[I_{x}\bar{u}^{n} + I_{y}\bar{v}^{n} + I_{t}]}{\alpha^2 + I_{x}^{2} + I_{y}^2} \end{aligned} un+1=uˉn−α2+Ix2+Iy2Ix[Ixuˉn+Iyvˉn+It]vn+1=vˉn−α2+Ix2+Iy2Iy[Ixuˉn+Iyvˉn+It]
至此,Horn–Schunck光流算法原理已介绍完毕。