MATLAB--光流法之Lucas-Kanade方法

为了计算两幅图像之间的光流,必须解决以下光流约束方程:

I_{_{x}}u+I_{_{y}}v+I_{_{t}}=0

其中:I_{x},I_{y}I_{t}是时空图像亮度导数;u是水平流;v是垂直光流。

Lucas-Kanade方法:

为了解决u和v的光流约束方程,Lucas Kanade方法将原始图像分割成更小的部分块,并在每个部分中假定kua个恒定速度。然后,在每块\Omega中将光流约束方程的加权最小二乘拟合到常数模型\left [ u,v \right ]^{T}。该方法通过最小化下列方程来实现这种拟合:

\sum _{x\subseteq \Omega }W^{2}\left [ I_{_{x}}u+I_{_{y}}v+I_{_{t}} \right ]^{2}

W是强调每个部分块中心的约束的窗口函数。求解极小化问题的方法是:

\bg_white \begin{bmatrix} \sum W^{2} I_{x}^{2}& \sum W^{2} I_{x}I_{y}\\ \sum W^{2} I_{y}I_{x}& \sum W^{2} I_{y}^{2} \end{bmatrix}\begin{bmatrix}u\\v\end{bmatrix}=-\begin{bmatrix}\sum W^{2} I_{x}I_{t}\\\sum W^{2} I_{y}I_{t}\end{bmatrix}

Lucas-Kanade方法使用差分滤波器[-1 1]计算I_{_{t}}

求u和v:

1,利用卷积核 [-1 8 0 -8 1] /12及其转置形式求 I_{_{x}} 和 I_{_{y}}.

2,使用核[1 1]计算图像1和图像2之间的I_{t}

3,平滑梯度分量I_{x}I_{y}I_{t},使用一个可分离的各向同性的5×5的核,其有效的一维系数是[1 4 6 4 1]/16.

4,使用以下方法求解每个像素的2×2线性方程:

如果:A=\begin{bmatrix} a & b\\ c & d \end{bmatrix}=\begin{bmatrix}\sum W^{2} I_{x}^{2}& \sum W^{2} I_{x}I_{y}\\ \sum W^{2} I_{y}I_{x}& \sum W^{2} I_{y}^{2} \end{bmatrix},那么:A的特征值为\lambda _{i}=\frac{a+b}{2}\pm \frac{\sqrt{4b^{2}+(a-c)^{2})}}{2};i=1,2

将特征值与阈值\tau进行比较,该阈值对应于为降低噪声阈值而输入的值。结果属于下列情况之一:

case1:\lambda _{1}\geqslant \tau ,\lambda _{2}\geqslant \tau,A是非奇异的,方程组是用克莱默法则求解的。

case2:\lambda _{1}\geqslant \tau ,\lambda _{2}<\tau,A是奇异(不可逆),标准化梯度流计算u和v。

case3:\lambda _{1}< \tau ,\lambda _{2}<\tau,u和v的光流为0。

 

%% Compute Optical Flow Using Lucas-Kanade Algorithm
% Read in a video file.

vidReader = VideoReader('viptraffic.avi');
%%
% Create optical flow object.
opticFlow = opticalFlowLK('NoiseThreshold',0.009);
%%
% Estimate and display the optical flow of objects in the video.
while hasFrame(vidReader)
    frameRGB = readFrame(vidReader);
    frameGray = rgb2gray(frameRGB);
  
    flow = estimateFlow(opticFlow,frameGray); 

    imshow(frameRGB) 
    hold on
    plot(flow,'DecimationFactor',[5 5],'ScaleFactor',10)
    hold off 
end

 

你可能感兴趣的:(计算机视觉,MATLAB)