光流(五)--HS光流及稠密光流

转自:
http://baike.baidu.com/link?url=AXK--povXLrhU6bRTJPsz4lLzva_fNDP0tLglwKtzi9tu-T8gkIi4ffhHWSSTgQG-HLNB-NC6cgtgUK-TEKHzS7aFU92noxQXyt5xqVLAC7EVND6ICEwZ9MUsoP12Xez

稠密光流

稠密光流是一种针对图像进行逐点匹配的图像配准方法,不同于稀疏光流只针对图像上若干个特征点,稠密光流计算图像上所有的点的偏移量,从而形成一个稠密的光流场。通过这个稠密的光流场,可以进行像素级别的图像配准,所以其配准后的效果也明显优于稀疏光流配准的效果。但是其副作用也是明显的,由于要计算每个点的偏移量,其计算量也明显大于稀疏光流[2]

稠密光流目标函数与求解

类似于稀疏光流,稠密光流的目标函数也是含有一个数据项:使得配准后的两张图像上每个对应点尽可能相同,用数学公式表示就是:
上式中
为参考图像(第一张图像),
为当前图像(第二张图像),也是待配准图像。偏移量
是图像上没一点的偏移量,
是一个误差函数,根据不同的需求可以取绝对值函数,二次函数等一些非负对称且正半轴单调递增的函数。
由于是稠密匹配,如果单一只有上面的数据项是不够的,因为对纯色区域的点显然是没法通过上式找到准确的偏移量的,因此还需要加入一个平滑项。平滑项的目的就是,对于特征比较弱的区域的点,其偏移量尽量向强特征点的偏移量靠近,或者说相邻两个特征点的偏移量相差不能太大,也就是偏移量的变化率不能太大,用数学语言描述就是:
上式中
是梯度的模长,
是一个类似
的误差函数。
将上面两个公式合并起来就得到了最终的目标函数:
为了描述简单,上面的偏移量
就不写成显著的函数形式,
是一个权重因子。目前主流的稠密光流算法中,主要根据误差函数取绝对值函数和二次函数分成两大类(其他函数由于复杂度较高,一般比较少讨论):L1-光流(L1-范数)和L2-光流(L2-范数)。下面就两大类光流进行讨论:

稠密光流L2-光流

L2-光流是最早进行研究的稠密光流,由于其两个误差函数都是二次函数,因此被称为L2-光流。由于二次函数是所有误差函数中最容易进行极值求解的,因此这种方法在快速计算中经常被用到。L2-光流最早是Horn和Schunck在1981年提出并求解的[1],因此也被称为H-S算法。
L2-光流的目标函数如下:
为了方便计算,可以考虑用稀疏光流中近似方法,对数据项进行线性近似,从而得到新的目标函数:
原始论文中的标准解法是采用变分法,得到一个Euler-Lagrange方程,然后通过数值方法求解偏微分方程。考虑到一般人没学过泛函分析,此处我用初等微积分的知识进行求解。
将上面的定积分形式改写成离散的形式:
注意上面的
的简写形式,不是偏导数。由此
可以看成是所有
构成的多元函数,应用多元函数的极值求解不难得到:
平滑项求偏导数含有4项是因为
这三项中均含有
这一项,为了书写方便,舍去下标得到方程组:
上式中:
上面的方程组实际是一个大型稀疏线性方程组,一般采用迭代法求解,最容易编程实现的就是SOR(超松弛迭代法),解出上面的二元一次方程就可以得到相应的雅克比迭代公式:
Lluís Garrido提供了HS-算法的c语言实现[3]

稠密光流L1-光流

相对于L2-光流,L1-光流提出的时间就相对要晚很多了[4],具体原因可能是其求解过程比较复杂。但是采用L1-范数有个好处是,误差函数增长较慢,这样对于大的偏移量的惩罚项也相对较小,从而可以计算偏移量较大的光流。其目标函数的数据项和平滑项由两个绝对值函数组成,因此被称为L1-光流。具体目标函数如下:
由于绝对值函数在0点处没有导数,因此一般不适合传统导数方法求极值。有一种近似做法是采用另一个处处可微的函数替代绝对值函数:
其中s是一个非常小的常数,这样就可以采用传统的梯度法和牛顿法对上面的函数进行极值求解了[4]。唯一的不足是,采用上面的近似后,导数的计算较为复杂,每次迭代的计算量灰常大,计算速度狠慢。后来有一个哥们发现数学上有个Total Variation(TV)可以用于二次式与绝对值和的求解,因此又整出了一套称为TV-L1的高大上的解法[5] ,这种解法相对上面的解法的优点就是快,另外也更精确。正因为如此,后面发论文的也基本都采用L1-范数的形式。
TV-L1的基本思想就是把目标函数拆分成两个:一个标准TV-L1的形式,另一个可以直接求解析解的形式。为了方便书写,将二元组
用向量
表示,
用向量
表示,引入辅助变量
,目标函数可以简写为:
其中:
然后将其拆分成标准的TV-L1形式:
和可直接求解析解项:
其求解过程采用螺旋法。
稠密光流1. 求解TV-L1项:
首先固定
,然后采用TV-L1求解第一项中的
可以得到:
其中
由下面的迭代式计算:
其中
,初始值
,迭代步长

稠密光流2. 解析解项:

上面求出
后就将其固定,解析解项是一个关于
的分段二次函数,可以很容易求出其极值:
求出
后将其代回1中继续求解
,直到
终止迭代。
opencv2.3里面有TV-L1的源代码实现[6] ,可以参考其源代码理解算法流程。


你可能感兴趣的:(运动跟踪)