我有x和y方向的光流渐变,我想知道如何根据这些渐变来变换图像:
箭头指向计算的渐变方向
在梯度上给定时间步长构建图像的最佳方法是什么?
答案 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个最近的单元中心。 (我觉得这可能会使你的图像模糊不到高斯)