Brox光流法公式推导

第1章 数学基础

Brox光流法使用变分方法求解,得到使总能量最小的流场。涉及到的数学概念及工具包含:微分,变分,泛函,Euler-Lagrange equation。

1.1. 函数及微分

微分是微积分的一个基本概念,它用于描述函数在某一点附近的变化率。在物理学和工程学中,微分常被用来描述速度、加速度等与时间相关的变化率。在数学中,微分也是函数的导数,表示函数在某一点的斜率或者切线的斜率。
微分在最优化问题中有广泛应用,通过求解导数为零的点,可以找到函数的极小值或者极大值。

1.2. 泛函及变分

泛函是函数的函数。它把一个函数映射到一个实数上。泛函通常用于描述函数在一类函数中的性质,比如最小化或最大化某种性能指标。泛函最早来源于物理学,比如求解最速降曲线问题。在量子力学和统计力学中也有涉及。
求解泛函的极值可以使用变分法,比如Brox光流法中就使用了变分法。

1.3. E-L 方程

Euler-Lagrange方程是变分法中的基本方程,用于找到使泛函取得极值的函数。对于给定的泛函,Euler-Lagrange方程可以通过对泛函求导数,然后令导数为零来得到。解Euler-Lagrange方程可以得到泛函的极值函数。
有如下最小化问题:
在这里插入图片描述

令泛函
在这里插入图片描述

当E取极值时,根据EL方程有:
在这里插入图片描述

1.4. SOR

SOR,超松弛迭代法,用于迭代解决线性方程组。相比雅可比迭代和高斯-赛德尔迭代方法,收敛速度较快。
对于如下方程组:
在这里插入图片描述

使用SOR迭代求解,迭代公式为:
在这里插入图片描述

迭代求解公式为:
在这里插入图片描述

第2章 光流法基础

在运动估计,三维重建,图像配准等计算机视觉应用中,光流法是最常见的方法。
最早的光流法由Horn和Schunck在1981年提出,使用灰度约束和流场平滑约束,采用EL方程和SOR求解。以及Lucas-Kanade光流,采用灰度约束,假设光流在像素点的邻域是一个常数,使用最小二乘法求解。
为了处理流场中的不连续,PDE model将Horn和Schunck方法中的二次正则器被平滑约束取代,允许分段平滑结果。为了降低异常点干扰,Robust dynamic motion estimation方法对异常点对光流结果评价的权重降低。还有从粗到细的金字塔方案和非线性模型,用来解决大位移和局部孔径问题,比如farnback光流方法。
Brox方法综合各个方法,采用从粗到细的金字塔方案,解决大位移问题。采用非线性模型,允许流场局部有较大的变化。采用梯度约束,对图像亮暗变化有一定的适应性。

2.1. 光流法基础假设

光流法在列约束方程时,通常会对结果进行约束,常见的约束有:灰度约束,梯度约束,平滑约束。

2.1.1. 灰度约束

灰度约束是光流法中的一种常见约束条件,也称亮度约束。它假设在相邻帧之间,同一个空间点的灰度值在恒定的。这意味着,当物体在相邻帧之间移动时,它的灰度值不应该发送变化。光流法使用这个约束来建立列约束方程。
考虑一个像素 在第一帧的光强度(其中t代表其所在的时间维度)。它移动了 的距离到下一帧,用了 时间。因为是同一个像素点,根据灰度约束,可以认为该像素在运动前后的光强度是不变的,即
在这里插入图片描述

通常我们更喜欢线性化的模型,上式右边泰勒展开,忽略高次项,就得到了著名的光流公式:
在这里插入图片描述

推导过程如下:
右边泰勒展开, 为二阶无穷小项
在这里插入图片描述

即:
在这里插入图片描述

设 分别为光流分别为沿X轴与Y轴的速度矢量,得
在这里插入图片描述


在这里插入图片描述

分别表示图像中像素点的灰度沿 方向的偏导数,就得到线性化后的灰度约束公式:
在这里插入图片描述

2.1.2. 梯度约束

对图像的梯度进行约束。它假设在相邻位置上,图像的梯度在方向和大小上是一致的。梯度约束可以帮助光流法更准确地估计物体的运动,尤其是在灰度有变化的有纹理、边缘明显的区域。
在这里插入图片描述

或者采用brox论文中的合并写法:
在这里插入图片描述

其中
在这里插入图片描述

可以采用和灰度约束同样的方法进行线性化。

2.1.3. 流场平滑约束

灰度约束和梯度约束,只在局部估计了一个像素的位移,而没有考虑到相邻像素之间的任何相互作用。因此,当梯度消失,或者只能估计梯度法向方向的流动时(孔径问题),或者存在异常点时,无法准确估计光流。
流场平滑约束要求光流场在空间上是平滑的,即相邻像素点的光流向量之间的差异应该尽可能小。这个约束确保了光流场的连续性,使得估计得到的运动场更加平滑,避免了局部噪声的影响。
流场平滑约束要求流场的导 数尽可能小,即有如下的优化目标。
在这里插入图片描述

或者采用如下的表示方法:
在这里插入图片描述

此外,最优位移场在场景中物体的边界上一般是不连续的,因此通过要求分段平滑流场来推广平滑假设是合理的。
2.1.4. 流场局部常数约束
局部常数约束是平滑约束的极端情况,它要求局部的流向量是一致的,即导数为0。
在这里插入图片描述

Lucas-Kanade方法采用这个约束,对局部建立方程,采用最小二乘求解光流估计。

2.2. Horn-Schunck光流法

Horn-Schunck光流法使用灰度约束和流场平滑约束。采用EL方程和SOR迭代求解。
该方法使用灰度约束的线性公式,以及流场平滑约束。
在这里插入图片描述

数据项和平滑项权重使用系数 调节:
在这里插入图片描述

2.2.1. EL方程

令泛函
在这里插入图片描述

根据EL方程有:
在这里插入图片描述

根据链式求导法则,其中:
在这里插入图片描述

代入,得到(v的处理同理):
在这里插入图片描述

因为:
在这里插入图片描述

所以有:
在这里插入图片描述

按照Horn和Schunck在1981年论文《Determining Optical Flow》中的描述,将 的计算方法,使用近似Laplace核求二阶导:
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

代入可得:
在这里插入图片描述

转为矩阵形式:
在这里插入图片描述

在这里插入图片描述

转为可以迭代的格式:
在这里插入图片描述

2.3. Lucas-Kanade光流法

Lucas-Kanade光流,采用灰度约束,认为光流在像素点的邻域是一个常数。假设在点 x及其邻域,光流值都为u,v ,结合灰度约束的线性假设,使用邻域4个点,则可列如下方程:

在这里插入图片描述

其中:
在这里插入图片描述

分别表示图像中像素点的灰度沿X,Y,T方向的偏导数,就得到线性化后的灰度约束公式。

2.3.1. 最小二乘法

LK光流法可以使用最小二乘法求解,步骤如下:
令:
在这里插入图片描述

上面的等式可写成矩阵的形式:
在这里插入图片描述

即计算:
在这里插入图片描述

因此:
在这里插入图片描述

即得到了x 位置的光流值。累加参与计算的5个像素。
如果想要更多的像素参与计算,且距离中心像素越远的像素,权重越小,可加入权重矩阵,则解为:
在这里插入图片描述

其中:
在这里插入图片描述

即:
在这里插入图片描述

2.4. farnback光流法

Farnback光流法采用了由粗到细的策略。采用高斯金字塔方法在输入的两幅图像进行降采样。在高层金字塔的评估结果,传递到下一层级,作为初始估计。

2.4.1. 金字塔策略

Farneback采用0.5的降采样系数。而brox光流法,为了实现层间平滑的过渡,采用0.8的降采样系数。
在这里插入图片描述

farnback每层的估计做为下一层的估计起始

2.5. 数值光流法的一般形式

以上介绍的几种典型的采用数值优化方法光流法,其优化目标一般的形式是
在这里插入图片描述

在这里插入图片描述

第3章 Brox光流法

Brox光流法综合了之前各种光流法的特点,采用由粗到细的,灰度约束,梯度约束和光滑约束结合的高度非线性方程,在适应大位移,孔径问题,局部流场不光滑等问题。

3.1约束方程

Brox光流法的约束项分为3个部分,分别是灰度约束,梯度约束,平滑约束。
使用向量的方式描述,令 ,
在这里插入图片描述

灰度约束:
在这里插入图片描述

为了帮助理解,等效为:
在这里插入图片描述

后续采用向量方式描述。
梯度约束:
在这里插入图片描述

平滑约束:
在这里插入图片描述

其中:
在这里插入图片描述

可记作
在这里插入图片描述

灰度约束和梯度约束中有二次项,对离群值比较敏感,因此加入一个增加凸度的函数:
在这里插入图片描述

其中 取0.001。
将梯度约束和平滑约束各加入系数 和 ,得到最终约束函数:
在这里插入图片描述

3.2 EL方程推导

令泛函:
在这里插入图片描述

根据EL方程,当 取极值时,有:
在这里插入图片描述

为了更好的可读性,定义如下变量:
在这里插入图片描述

显然有:
在这里插入图片描述

还是推导一下:
在这里插入图片描述

其余同理。
根据链式求导法则,其中:

在这里插入图片描述

代入,可得
在这里插入图片描述

采用散度div简化为
在这里插入图片描述

散度div表示:

同理,关于u的方程为:
在这里插入图片描述

3.3 数值求解推导

前面的欧拉-拉格朗日方程在参数 中是非线性的。因此首先需要进行线性化,然后可以用常用的数值方法来求解,比如在 上使用固定点迭代。
为了实现一种多尺度的方法,更好地近似能量的全局最优,将不动点迭代与降采样策略相结合。为了实现层间更加平滑的过渡,不使用固定的0.5,而是使用 降采样系数。
采用固定点迭代的方式,外部进行k次迭代:
在这里插入图片描述

为了消除 中的非线性项,进行泰勒展开:
在这里插入图片描述

其中:
在这里插入图片描述

为了更好的可读性,把 中部分用如下符号代替:
在这里插入图片描述

因为
在这里插入图片描述

求导,有
在这里插入图片描述

所以有
在这里插入图片描述

在迭代中,这部分是常数,可将 理解为鲁棒因子(robustness factor), 理解为扩散因子(smoothness term diffusivity)。

关于v的方程同理。
由于唯一剩下的非线性是由于psai ,而 psai被选择为一个凸函数,因此剩余的优化问题是一个凸问题,即存在一个唯一的最小解。
为了去除psai 中的非线性,使用内部固定点迭代。
在这里插入图片描述

最终转变为关于du,dv 的线性系统:
在这里插入图片描述

关于v的方程同理:
在这里插入图片描述

矩阵形式看的更清楚:
在这里插入图片描述

div部分拆分为:
在这里插入图片描述

使用变量进行替换
在这里插入图片描述

使用SOR迭代求解,迭代公式为:
在这里插入图片描述

对于有2个未知数的线性方程组,有:
在这里插入图片描述

因此迭代公式为:
在这里插入图片描述

其中:
在这里插入图片描述

二阶导数 采用如下Laplace核:
在这里插入图片描述

至此,图像相关的I ,使用输入的图像的每层金字塔进行计算。每次迭代根据du,dv 计算出的u,v ,用来计算ux,uy,vx,vy 。

3.4 数值求解代码对应

在这里插入图片描述

3.4.1已知量

在这里插入图片描述

3.4.2图像相关量求解

在这里插入图片描述

3.4.3中间量 鲁棒因子

公式为:
在这里插入图片描述

q0 = Iz + Ix * du[ijs] + Iy * dv[ijs];
q1 = Ixz + Ixx * du[ijs] + Ixy * dv[ijs];
q2 = Iyz + Ixy * du[ijs] + Iyy * dv[ijs];
data_term = 0.5f / sqrtf(q0 * q0 + gamma * (q1 * q1 + q2 * q2) + eps2);

3.4.4中间量 扩散因子

公式为:
在这里插入图片描述

//x 导数 (i,j)  (i-1,j)  [-1 1 0]
left = pos - 1;
u_x = u[pos] + du[pos] - u[left] - du[left];
v_x = v[pos] + dv[pos] - v[left] - dv[left];
up = pos + width;
down = pos - width;
up_left = up - 1;
down_left = down - 1;
//y 导数 (i,j) (i-1,j)  [-1,0,1;-1,0,1]
u_y = 0.25f * (u[up] + du[up] + u[up_left] + du[up_left] - u[down] - du[down] - u[down_left] - du[down_left]);
v_y = 0.25f * (v[up] + dv[up] + v[up_left] + dv[up_left] - v[down] - dv[down] - v[down_left] - dv[down_left]);
*s = 0.5f / sqrtf(u_x * u_x + v_x * v_x + u_y * u_y + v_y * v_y + eps2);

3.4.5不考虑平滑项的矩阵中间量

公式为:
在这里插入图片描述

先计算数据项:
denominator_u:
denominator_v:
numerator_dudv:
numerator_u:
numerator_v:

	numerator_dudv = data_term * (Ix * Iy + gamma * Ixy * (Ixx + Iyy));
	numerator_u = data_term * (Ix * Iz + gamma * (Ixx * Ixz + Ixy * Iyz));
	numerator_v = data_term * (Iy * Iz + gamma * (Iyy * Iyz + Ixy * Ixz));
	denominator_u = data_term * (Ix * Ix + gamma * (Ixy * Ixy + Ixx * Ixx));
	denominator_v = data_term * (Iy * Iy + gamma * (Ixy * Ixy + Iyy * Iyy));

3.4.6加入平滑项的矩阵中间量

denominator_u,v: 加入平滑项,再预先求倒数(SOR迭代时在分母上)。
在这里插入图片描述

diffusivity_sum = sx[ijs] + sx[ijs + 1] + sy[ijs] + sy[ijs + PSOR_TILE_WIDTH + 1];
denom_u += diffusivity_sum;
denom_v += diffusivity_sum;
inv_denominator_u[ijg] = 1.0f / denom_u;
inv_denominator_v[ijg] = 1.0f / denom_v;

numerator_u,v: :加入二阶导数,采用拉普拉斯核,
在这里插入图片描述

同时预先加入了SOR迭代的中间计算结果:
在这里插入图片描述

代码如下:

numerator_u = (s_left * (u_left + du_left) + s_up * (u_up + du_up) + s_right * (u_right + du_right) + s_down * (u_down + du_down) -
	u * (s_left + s_right + s_up + s_down) - numerator_u - numerator_dudv * dv);
numerator_v = (s_left * (v_left + dv_left) + s_up * (v_up + dv_up) + s_right * (v_right + dv_right) + s_down * (v_down + dv_down) -
	v * (s_left + s_right + s_up + s_down) - numerator_v - numerator_dudv * du);

3.4.7流向量的导数

流向量的导数ux,uy,vx,vy ,代表在x和y方向上,流图的导数。流图的导数使用的滤波核为[-1,0,1]。

3.4.8SOR迭代

SOR迭代公式为:
在这里插入图片描述

代码实现:

// 更新 du
du = (1.0f - omega) * du + omega * inv_denominator_u * numerator_u;
// 更新 dv
dv = (1.0f - omega) * dv + omega * inv_denominator_v * numerator_v;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟人斩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值