我们会对视频中运动物体十分感兴趣,人们经常用光流法做这项事情。光流法有很多用处,比如物体追踪、摄像头矫正等等。
所有的光流法都是基于以下假设:
A、亮度恒定。同一个点随时间变化,其亮度不会发生改变。用于得到光流法的基本方程;
B、小运动。时间的变化不会引起位置的剧烈变化,这样灰度才能对位置求偏导数。小运动情况下才能用前后帧之间单位位置变化引起的灰度变化去近似灰度对位置的偏导数。
C、空间一致。一个场景上邻近的点投影到图像上也是邻近点,且邻近点速度一致。在Lucas-Kanade光流法中,要求x,y的方向速度,但基本方程只有一个,假设特征点邻域做相似运动,就可以联立n多个方程求取x,y方向的速度。
基于这些假设,如果有两张图片(比如视频两个帧),我们需要发现两个图片像素的对应关系。因为亮度恒定(RGB不变),不要要考虑RGB的值的改变。因为小运动,可以发现两张图片在很小的邻域范围内像素的对应关系。
假设亮度恒定,则有方程:
假设小运动,则有(一阶泰勒展开):
得到光流约束方程:
1、Horn–Schunck method
Horn-Schunck算法假设整个图像的流动是平滑的。因此,它试图最小化流程中的失真,并更喜欢显示更平滑的解决方案。
流动表示:设定方程为全局方程,将其最小化。对于二维图像,有:
Ix,Iy,It是图像强度值分别沿x、y和时间维度的导数。是光流向量。是正则化的常数。大数值的能够让函数平滑。使用多维拉格朗日方程解决:
被积函数L如下:
代表Laplace Operator(拉普拉斯算子)。实际中拉普拉斯算子用有限差分表示。,是在像素(x,y)周围邻域内算出的平均。所以,上式可以写成:
u和v是线性的可以对每张图片像素求解。
然而,由于解决方案依赖于邻值,所以必须在邻域更新后再重复一次。推导出以下迭代:
k表示迭代次数。
其在代码中,首先使用下面mask计算fx, fy, ft:
将mask1用于每张图片计算fx。将mask2用于每张图片,得到fy。将mask4用于第一张图片,mask3用于第二张图片,加起来得到ft。
Xav是x邻域的平均值。