我找到了LKT算法here的Matlab实现,它基于亮度恒定方程。
该算法通过将图像与适当的2x2水平和垂直边缘梯度算子进行卷积来计算x和y方向的图像梯度。
经典文献中的亮度恒定方程在其右侧有两个连续帧之间的差异。
然而,在前面提到的链接所指的实现中,右边是卷积的差异。
It_m = conv2(im1,[1,1;1,1]) + conv2(im2,[-1,-1;-1,-1]);
为什么It_m不能简单地计算为:
it_m = im1 - im2;
答案 0 :(得分:3)
正如您所提到的,理论上只有逐像素差异才能说明光流计算。 然而,在实践中,所有自然(非合成)图像都包含一定程度的噪声。另一方面,微分是某种高通滤波器,会对信号产生应力(高通)噪声比。 因此,为了避免由噪声引起的伪影,通常在任何图像区分之前执行图像平滑(或低通滤波)(我们在边缘检测中也具有这样的处理)。代码就是这样,即在图像上应用和移动平均滤波器以减少噪声影响。
It_m = conv2(im1,[1,1;1,1]) + conv2(im2,[-1,-1;-1,-1]);
答案 1 :(得分:0)
(评论转换为答案。)
从理论上讲,采用像素差异并没有错:
Im_t = im1-im2;
计算时间导数。在计算时间导数时使用空间平滑器可减轻噪声的影响。
此外,看看code计算空间(x和y)导数的方式:
Ix_m = conv2(im1,[-1 1; -1 1], 'valid');
使用类似内核和valid
选项计算时间导数可确保矩阵It_x
,It_y
和Im_t
具有兼容的大小。
答案 2 :(得分:0)
时间偏导数(沿t)与空间偏导数(沿x和y)相连。
将您正在分析的视频序列视为音量,时空音量。在任何给定点(x,y,t),如果要估计偏导数,即估计该点的3D梯度,那么您将受益于具有相同内核支持的3个滤波器。
有关为什么会出现这种情况的更多理论,请查看可操纵滤波器的主题,或者更好地查找偏导数应该是什么的基本概念,以及它如何连接到方向导数。
通常,首先估计2D梯度,然后人们倾向于将时间导数视为独立于x和y分量。这可能并且经常会导致最终光流计算中的数值误差。处理这些错误的常用方法是进行前向和后向流量估算,最后将结果合并。
考虑您估计的渐变的一种方法是它具有3D的支撑区域。这种区域的最小尺寸应为2x2x2。
如果在第一张和第二张图像中仅使用2x2滤镜进行2D渐变,则通过平均两个滤镜的结果来收集3D卷的相应FIR滤镜。
您应该在2D中拥有相同的过滤器支持区域这一事实对大多数人来说都很清楚:这就是为什么Sobel和Scharr操作员看起来像他们那样做的原因。
你可以看到你在Matlab toolbox that I made中为光流设计精心设计的差分算子所得到的结果,部分是为了表明这一点。