繁体   English   中英

Lukas Kanade光流:了解数学

[英]Lukas Kanade optical flow: Understanding the math

我在这里找到了LKT算法的Matlab实现,它基于亮度恒定方程。

该算法通过将图像与适当的2x2水平和垂直边缘梯度算子进行卷积来计算x和y方向上的图像梯度。

经典文献中的亮度恒定方程在其右侧具有两个连续帧之间的差异。

但是,在上述链接所指的实现中,右侧是卷积的差异。

It_m = conv2(im1,[1,1;1,1]) + conv2(im2,[-1,-1;-1,-1]);

为什么It_m不能简单地计算为:

it_m = im1 - im2;     

正如您所提到的,理论上只有逐像素差异用于光流计算。 然而,在实践中,所有自然(非合成)图像都包含一定程度的噪声。 另一方面,微分是某种高通滤波器,会对信号产生应力(高通)噪声比。 因此,为了避免由噪声引起的伪影,通常在任何图像区分之前执行图像平滑(或低通滤波)(我们在边缘检测中也具有这样的处理)。 代码就是这样,即在图像上应用和移动平均滤波器以减少噪声影响。

It_m = conv2(im1,[1,1;1,1]) + conv2(im2,[-1,-1;-1,-1]);

(评论转换为答案。)

理论上,采用像素方面的差异并没有错:

Im_t = im1-im2;

计算时间导数。 在计算时间导数时使用空间平滑器可减轻噪声的影响。

此外,查看代码计算空间(x和y)导数的方式:

Ix_m = conv2(im1,[-1 1; -1 1], 'valid');

使用类似的内核计算时间导数,并且valid选项确保矩阵It_xIt_yIm_t具有兼容的大小。

时间偏导数(沿t)与空间偏导数(沿x和y)相连。

将您正在分析的视频序列视为音量,时空音量。 在任何给定点(x,y,t),如果要估计偏导数,即估计该点处的3D梯度,那么您将受益于具有相同内核支持的3个滤波器。

有关为什么会出现这种情况的更多理论,请查看可操纵滤波器的主题,或者更好地查找偏导数应该是什么的基本概念,以及它如何连接到方向导数。

通常,首先估计2D梯度,然后人们倾向于将时间导数视为独立于x和y分量。 这可能并且经常会导致最终光流计算中的数值误差。 处理这些错误的常用方法是进行前向和后向流量估算,并最终将结果合并。

考虑您估计的渐变的一种方法是它具有3D的支撑区域。 这种区域的最小尺寸应为2x2x2。

如果在第一和第二图像中仅使用2x2滤波器进行2D渐变,则通过平均两个滤波器的结果来收集3D体积的相应FIR滤波器。

您应该在2D中具有相同的过滤器支持区域这一事实对大多数人来说是清楚的:这就是为什么Sobel和Scharr操作员看起来像他们那样做的原因。

你可以看到在这个Matlab工具箱中为光流设计精心设计的微分算子所得到的结果,部分是为了说明这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM