如何在图像上应用逆光流矢量?
how to apply inverse optical flow vector on an image?
我有一个关于移动相机中移动物体检测的小项目,我必须在其中使用负光流矢量来最小化自我运动补偿。我有一个视频和一些特定的连续帧,其中必须计算负光流矢量的平均值。我已经计算出第 (k-1) 帧和第 k 帧之间的光流。另外,我计算了光流矢量的平均值 V=[u,v],其中 v 是水平光流的平均值,u 是垂直光流的平均值。现在,我必须对第 (k-1) 帧应用光流矢量的逆,即 -V。我是 matlab 的新手,对它了解不多。请帮助
我已尝试使用此代码段来执行此操作,但结果不如预期
function I1=reverseOF(I,V)
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
[m,n]=size(rgb2gray(I));
for i=1:m
for j=1:n
v1=[j i];
v2=-V;
v3=v1.*v2;
R(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=R(i,j);
G(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=G(i,j);
B(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=B(i,j);
I1(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=I(i,j);
end
end
I1=cat(3,R,G,B);
enter code here
我使用了 abs() 函数,否则会出现一些错误,例如 "attempted to access negative location; index must be a positive or logical"。
图像 A 和图像 B 是我用来估计光流的图像。enter image description here
这是我应用上述函数后得到的结果。
enter image description here
不幸的是,您无法轻松做到这一点。这是一个相当高级的研究问题,因为在网格上求向量场的逆不是一个简单的问题,实际上是相当困难的。
请注意,您的矢量场(光流)从网格开始,但不以网格结束,它以随机子像素位置结束。如果你只是反转这个字段,做 -V
是不够的!结果不会相反!
这是一个开放的研究问题,例如 this 2010 paper 正好解决了这个问题,并提出了一种方法来创建 "pseudoinverses"。
假设你有那个逆,因为你以某种方式计算了它。您的代码对此非常糟糕,并且解决方案(abs!)显示(无意冒犯)您并不真正了解自己在做什么。对于已知的矢量场 {Vx,Vy}
,大小等于图像大小(如果不是,您可以很容易地弄清楚如何对其进行插值 unsig interp2
)代码看起来像:
newimg=zeros(size(I));
[ix,iy]=meshgrid(1:size(I,1),1:size(I,2));
newimg(:,:,1)=interp2(I(:,:,1),ix+Vx,iy+Vy); % this is your whole loop.
newimg(:,:,2)=interp2(I(:,:,3),ix+Vx,iy+Vy); % this is your whole loop.
newimg(:,:,3)=interp2(I(:,:,2),ix+Vx,iy+Vy); % this is your whole loop.
我有一个关于移动相机中移动物体检测的小项目,我必须在其中使用负光流矢量来最小化自我运动补偿。我有一个视频和一些特定的连续帧,其中必须计算负光流矢量的平均值。我已经计算出第 (k-1) 帧和第 k 帧之间的光流。另外,我计算了光流矢量的平均值 V=[u,v],其中 v 是水平光流的平均值,u 是垂直光流的平均值。现在,我必须对第 (k-1) 帧应用光流矢量的逆,即 -V。我是 matlab 的新手,对它了解不多。请帮助
我已尝试使用此代码段来执行此操作,但结果不如预期
function I1=reverseOF(I,V)
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
[m,n]=size(rgb2gray(I));
for i=1:m
for j=1:n
v1=[j i];
v2=-V;
v3=v1.*v2;
R(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=R(i,j);
G(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=G(i,j);
B(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=B(i,j);
I1(floor(1+abs(v3(1,2))),floor(1+abs(v3(1,2))))=I(i,j);
end
end
I1=cat(3,R,G,B);
enter code here
我使用了 abs() 函数,否则会出现一些错误,例如 "attempted to access negative location; index must be a positive or logical"。
图像 A 和图像 B 是我用来估计光流的图像。enter image description here
这是我应用上述函数后得到的结果。 enter image description here
不幸的是,您无法轻松做到这一点。这是一个相当高级的研究问题,因为在网格上求向量场的逆不是一个简单的问题,实际上是相当困难的。
请注意,您的矢量场(光流)从网格开始,但不以网格结束,它以随机子像素位置结束。如果你只是反转这个字段,做 -V
是不够的!结果不会相反!
这是一个开放的研究问题,例如 this 2010 paper 正好解决了这个问题,并提出了一种方法来创建 "pseudoinverses"。
假设你有那个逆,因为你以某种方式计算了它。您的代码对此非常糟糕,并且解决方案(abs!)显示(无意冒犯)您并不真正了解自己在做什么。对于已知的矢量场 {Vx,Vy}
,大小等于图像大小(如果不是,您可以很容易地弄清楚如何对其进行插值 unsig interp2
)代码看起来像:
newimg=zeros(size(I));
[ix,iy]=meshgrid(1:size(I,1),1:size(I,2));
newimg(:,:,1)=interp2(I(:,:,1),ix+Vx,iy+Vy); % this is your whole loop.
newimg(:,:,2)=interp2(I(:,:,3),ix+Vx,iy+Vy); % this is your whole loop.
newimg(:,:,3)=interp2(I(:,:,2),ix+Vx,iy+Vy); % this is your whole loop.