基于视频的运动向量估计算法:HS光流法(Horn-Schunck Optical Flow)
题目描述
HS光流法是一种经典的稠密光流估计算法,由Berthold K. P. Horn和Brian G. Schunck于1981年提出。它的目标是解决一个核心问题:给定一个视频序列中连续的两帧图像,如何估计出图像中每个像素点在两帧之间的运动速度向量(即光流场)?
与我们之前讨论过的Lucas-Kanade(稀疏光流)方法不同,HS光流法旨在为图像中的每一个像素都计算一个运动向量,形成一个稠密的光流场。这使其能够描述更精细、更全局的运动,但计算量也更大。
核心思想与基础假设
HS光流法建立在两个基本假设之上:
- 亮度恒定假设:一个物体点在两帧之间的亮度(灰度值)保持不变。
- 小运动假设:物体点的运动在时间和空间上是平滑、连续的。
基于这两个假设,HS光流法将问题转化为一个能量最小化的数学问题。
解题过程详解
让我们一步步推导HS光流是如何被计算出来的。
步骤一:建立光流基本方程
假设我们有一帧图像在时刻 t 的像素亮度为 I(x, y, t),在下一时刻 t+δt,该像素点运动到了 (x+δx, y+δy) 的位置,亮度为 I(x+δx, y+δy, t+δt)。
根据亮度恒定假设:
I(x, y, t) = I(x+δx, y+δy, t+δt)
对等式右边进行一阶泰勒展开(利用了小运动假设,高阶项可忽略):
I(x+δx, y+δy, t+δt) ≈ I(x, y, t) + ∂I/∂x * δx + ∂I/∂y * δy + ∂I/∂t * δt
将泰勒展开式代回原等式,并两边同时减去 I(x, y, t),得到:
∂I/∂x * δx + ∂I/∂y * δy + ∂I/∂t * δt = 0
两边同时除以 δt,并令 u = δx/δt, v = δy/δt,它们分别代表像素在x和y方向上的瞬时速度(即光流)。同时,I_x = ∂I/∂x, I_y = ∂I/∂y, I_t = ∂I/∂t 分别代表图像在x, y, t方向的梯度(可以通过对图像进行差分近似计算得到)。于是我们得到著名的光流约束方程:
I_x * u + I_y * v + I_t = 0
这个方程中,I_x, I_y, I_t 是我们可以从图像对中计算出来的已知量,而 u 和 v 是我们要求的两个未知数。一个方程,两个未知数,这是一个欠定问题,无法唯一求解。这就是所谓的“孔径问题”——仅凭单个像素点的局部信息,我们只能知道运动沿梯度方向的分量,而无法知道垂直方向的分量。
步骤二:引入平滑性约束
为了解决欠定性,Horn和Schunck引入了第二个关键思想:平滑性约束。他们认为,相邻像素的运动向量应该是相似的,即整个光流场在空间上是平滑变化的。他们用光流向量 (u, v) 的平方梯度范数来衡量其变化的剧烈程度,希望其最小化:
平滑项 Es = ∫∫ (|∇u|^2 + |∇v|^2) dx dy = ∫∫ [(∂u/∂x)^2 + (∂u/∂y)^2 + (∂v/∂x)^2 + (∂v/∂y)^2] dx dy
同时,我们还希望结果满足第一步的光流约束方程。于是,整个问题被构造为一个能量最小化问题,能量函数 E 由数据项(来自光流约束方程)和平滑项加权求和得到:
E(u, v) = ∫∫ [ (I_x*u + I_y*v + I_t)^2 + α^2 (|∇u|^2 + |∇v|^2) ] dx dy
其中:
(I_x*u + I_y*v + I_t)^2是数据项,衡量光流场违反亮度恒定假设的程度,越小越好。α^2 (|∇u|^2 + |∇v|^2)是平滑项,衡量光流场在空间上变化的剧烈程度,越小越平滑。α是一个正则化参数,用来平衡数据项和平滑项的重要性。α越大,结果越平滑,但对亮度恒定假设的满足程度可能降低;α越小,结果越忠实于局部亮度变化,但可能产生噪声和不连续的运动场。
我们的目标就是找到一个光流场 (u, v),使得这个总能量 E 达到最小。
步骤三:求解最小化问题(变分法与迭代求解)
求解上述能量函数的最小值,需要用到变分法。通过对能量函数 E 关于 u 和 v 分别求变分导数(Euler-Lagrange方程),并令其等于0,我们可以得到一对偏微分方程:
I_x(I_x*u + I_y*v + I_t) - α^2 ∇^2 u = 0
I_y(I_x*u + I_y*v + I_t) - α^2 ∇^2 v = 0
其中 ∇^2 是拉普拉斯算子,∇^2 u = ∂²u/∂x² + ∂²u/∂y²,它衡量了 u 在空间上的平均曲率。
为了求解这组方程,HS方法采用了离散化迭代的数值方法。将图像视为网格,并对拉普拉斯算子进行离散近似,通常用当前像素的邻域平均值减去自身值来近似:∇^2 u ≈ \bar{u} - u,其中 \bar{u} 是 u 在周围一个邻域(如4-邻域)内的平均值。∇^2 v 同理。
将离散化后的拉普拉斯算子代入上面的方程,经过整理,可以得到关于 u 和 v 的迭代更新公式:
u^{k+1} = \bar{u}^k - (I_x * (I_x*\bar{u}^k + I_y*\bar{v}^k + I_t)) / (α^2 + I_x^2 + I_y^2)
v^{k+1} = \bar{v}^k - (I_y * (I_x*\bar{u}^k + I_y*\bar{v}^k + I_t)) / (α^2 + I_x^2 + I_y^2)
其中:
u^k,v^k是第k次迭代的光流估计值。\bar{u}^k,\bar{v}^k是u^k,v^k在当前像素邻域内的平均值。I_x,I_y,I_t是预先计算好的图像梯度。
步骤四:算法流程
- 输入:连续两帧灰度图像
I_t和I_{t+1}。 - 初始化:将整个光流场
(u, v)初始化为0,或者用其他简单方法(如前帧的光流)初始化。 - 预处理:计算图像
I_t在x和y方向的空间梯度I_x,I_y(例如使用Sobel算子)。计算时间梯度I_t = I_{t+1} - I_t。 - 迭代求解:
- 对于图像中的每一个像素
(i, j):- 计算当前像素邻域内
u和v的平均值\bar{u},\bar{v}。 - 利用上述迭代更新公式,计算新的
u^{k+1}(i, j)和v^{k+1}(i, j)。
- 计算当前像素邻域内
- 用新计算出的光流场替换旧的光流场。
- 重复此过程,直到光流场的变化小于某个阈值,或达到预设的最大迭代次数。
- 对于图像中的每一个像素
- 输出:最终的稠密光流场
(u, v),通常为了可视化,会用颜色编码(如方向对应色相,幅度对应亮度)表示出来。
优缺点总结
- 优点:
- 稠密输出:为每个像素提供运动向量,包含丰富的运动信息。
- 全局平滑:平滑性约束使得算法对噪声有一定的鲁棒性,并能填充缺少纹理区域(如墙面、天空)的光流。
- 缺点:
- 计算量大:需要对全图所有像素进行多次迭代,速度慢。
- 假设的局限性:亮度恒定假设在光照变化、阴影、镜面反射时失效;平滑性假设在运动边界(物体边缘)处不成立,会导致运动边缘模糊。
- 对参数α敏感:
α的选择需要根据具体场景调整。
尽管有这些缺点,HS光流法因其简洁而深刻的数学模型,成为了光流研究领域的奠基性工作,后续许多先进的稠密光流算法(如基于变分模型的、深度学习的)都从中汲取了思想养分。