在给定光流梯度的情况下构造翘曲图像

时间:2016-12-14 05:15:58

标签: computer-vision

我有x和y方向的光流渐变,我想知道如何根据这些渐变来变换图像:

箭头指向计算的渐变方向

The arrow points to the direction of the gradient calculated

在梯度上给定时间步长构建图像的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

使用理智的变形策略,最好基于插值。在matlab中,使用“interp2”效果很好。 Matlab示例:

s = 40; %size of data
t = 1;  %time offset

[x,y] = meshgrid(1:s,1:s);

binIm = (x-(s/2)).^2 +((y-(s/2)).^2)*10 <((s/3))^2;

subplot(2,2,1); imagesc(binIm); colormap gray;axis image; 
title('eliptical mask');

%some rotational flow (curl) 
Ur = 10*(y-(s/2))/(s/2); 
Vr = -10*(x-(s/2))/(s/2);

%some zooming flow (divergent) 
Uz = 10*(x-(s/2))/(s/2); 
Vz = 10*(y-(s/2))/(s/2);

binImR = interp2(double(binIm),x-t*Ur,y-t*Vr); 
subplot(2,2,3); imagesc(binImR); axis image;colormap gray; 
hold on; quiver(Ur,Vr); 
title('rotational flow');

binImZ = interp2(double(binIm),x-t*Uz,y-t*Vz); 
subplot(2,2,4); imagesc(binImZ); axis image;colormap gray; 
hold on; quiver(Uz,Vz); 
title('zooming flow');

请注意,“t”越大,近似值越差,特别是对于旋转运动。

答案 1 :(得分:0)

- 对于每个像素,使用4个最近光流值的接近度和幅度来插值其梯度 - 然后将时间步长应用于插值梯度值以生成目标位置 - 由于结果位置不会直接在网格上,我可能会根据原点像素的强度计算一个以目标为中心的高斯。然后使用该高斯将强度值添加到输出图像中的附近单元格中。或者,您可以获取(原始像素的)强度,并将该强度的加权分割到关于目标位置的4个最近的单元中心。 (我觉得这可能会使你的图像模糊不到高斯)