前言
在经典HS光流算法中,图像中两点间的灰度变化被假定为线性的,但实际上灰度变化是非线性的。本文详细分析了灰度估计不准确造成的偏差并提出了一种改进HS光流算法,这种算法可以得到较好的计算结果,并能明显减少光流计算的迭代次数。
经典HS光流法的误差分析
以前的梯度计算方法只考虑到了图像灰度的一阶变化率而没有考虑高阶部分,在实际应用中会导致较大误差。根据如下一般泰勒公式:
(1)
假设物体没帧的位移是0.5像素,那么如果物体移动了30个像素之后,累计的误差可达
在一维情况下,该误差产生的机理如下图所示:
曲线表示移动物体表面未知的真实灰度变化,Y轴表示灰度,物体沿X轴运动,d1表示实际的移动距离,X和X表示两个相邻的离散点,t表示相邻点X和X之间的灰度梯度。
求移动距离实际上就是:已知X对应点的灰度Y和X对应点的灰度Y,以及移动点的灰度Y’,求移动点X‘的位置。
传统光流法得到的移动距离将会是d。由上图可知,这个结果和实际情况有一定的计算误差,并且,该误差不能通过增加循环次数来减少。而且,二维情况下产生的误差将会更大。
改进的HS光流法
该算法首先确定移动距离 d作为指导参数来产生逼近期望梯度的梯度值,之后再用该梯度重新新一轮的循环,计算出新的移动距离 d。
下面再次在一维的情况下解释该算法如何改进灰度梯度,首先请看下图:
V表示移动距离,t表示正方向上的两个像素点在图像中的梯度;t则表示负方向上的两个像素点在图像中的梯度。实曲线是通过插值得到,虚曲线是假设的物体表面真实灰度曲线。
考虑曲线的二阶导数得到如下函数:
(2)
用差商代替导数可得:
(3)
从而可得新的梯度公式:
(4)
该算法在大多数情况下都是收敛的,只要循环次数足够多,步进不要太大,则改进算法得到的运动距离一定充分地接近于该插值算法的理论距离。
可推导出该插值在一维情况下得到的曲线数学表达式为:
(5)
为了与新的梯度相配合,引入下面几个公式:
(6)
(7)
改进的HS光流法的伪代码
如果是计算前两帧则各个点位移置为 0,否则位移初始化为上两帧计算得到的位移;
利用 (7) 式计算图像上各点的灰度对时间的差分I;
利用 (6) 式计算图像上各点灰度梯度; ★
对图像上的每一个块:{
// 根据块中各点的位移计算块的平均位移;
do {
根据 (4) 式计算块内每一点的灰度梯度; ★
然后用传统HS光流法计算块内各点的位移;
根据块内各点的位移计算整个块的平均位移;
} while ( 迭代次数足够多 || 最近两次计算平均位移非常接近 );
}
end;
// 需要说明的是尾部标有★的两行代码,它们协同计算出 t。
结束语
灰度梯度的准确性是所有光流法准确性的基础,本文提供的改进的HS光流法针对传统HS光流法中不准确的灰度梯度提出了一种新的能够循环求精的梯度算法。