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光流算法原理已介绍完毕。