我对光流有一个概念上的怀疑。亮度恒定约束表明了这一点 ∂I/∂xv x +∂I/∂yv y +∂I/∂t= 0
该示例是2 * 2图像[1 0;在时间t 0 0]。现在,假设在时间t + 1,它被移动了[a a]像素(假设a是小数且小于1)。然后新图像是[(1-a)(1-a)a (1-a); (1-a)* a a * a]。
现在,如果我们拟合原始方程中的值,则I x = I y = -1且I t = -2 * a + a * a at(1,1)。 (我用过I x (x,y)= I(x + 1,y) - I(x,y))
使得∂I/∂xv x +∂I/∂yv y +∂I/∂t= a * a - 4 * a。如果a非常小,即使这样它也可以近似为4 * a而不是零。帮帮我。
答案 0 :(得分:0)
首先,它不是你处理的BCC,而是它的一阶近似,通常称为光流约束(OFC)。
OFC不会举出你的例子,原因是你正在使用不合适的衍生品估算。
当您注意到有两个图像时,第一个暗示出现错误的提示,一个用于t = 0,另一个用于t = 1。您应该使用哪一个来估算I_x和I_y衍生物?你选择t = 0,为什么不t = 1?一种方法可以是采用两种方法,然后采用平均方式,即:
I_x =(I_x(t = 0)+ I_y(t = 1))/ 2
这样做会导致衍生滤波器不再是2点,而是4点,内核延伸到t域。光流中的许多专家使用两种I_x而不是平均,并获得两种光流:一种是向前,一种是向后,然后它们可以进行后处理。
如何选择衍生估算器将严重影响光流算法的行为!
当使用差分方程的数值估计时,更常见的是使用集中式差分估计,即:
I_x =(I(x + 1,y) - I(x-1,y))/ 2
在光流中,这是常见的,然后在靠近图像边界时恢复到较小的单面差异。
然而,这仍然不会像你想要的OFC一样好。如果您调查OFC,可以将其重写为:
I_t = - I_x v_x - I_y I_y
I_t = - | v | ( k grad(I))
其中 v =(v_x,v_y)= | v | (cos(a),sin(a))是运动矢量, k =(cos(a),sin(a)),运动的单位向量。数量( k grad(I))是所谓的 方向导数 。为了保持这一点,您也不应该使用2点集中差异。您应该做的是使用共享相同内核/支持区域的I_t,I_x和I_y的估计值。例如,这可以是3×3×2尺寸的滤波器。
在Matlab中,代码可以是例如:
[dx, dy, dt] = grad3D(imNew,imPrev)
gg = [0.2163, 0.5674, 0.2163];
f = imNew + imPrev;
dx = f(:,[2:end end]) - f(:,[1 1:(end-1)]);
dx = conv2(dx,gg','same');
dy = f([2:end end],:) - f([1 1:(end-1)],:);
dy = conv2(dy,gg ,'same');
dt = 2*conv2(gg,gg,imNew - imPrev,'same');
人们仍然使用较小的衍生过滤器的原因有时是因为你没有失去任何分辨率,这是使用更大内核的缺点。注意,上述导数估计算法与在较粗尺度上执行2点导数不同。许多人都这么认为,但事实并非如此。
在我写的interactive tutorial and toolbox on optical flow中,你可以对这些问题有更多的直觉。使用选项运行工具箱:
in.method = 'gradient';
您将获得一个可以帮助您获得更多直觉的互动选项。