MATLAB--光流法之Horn-Schunck方法

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

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

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

Horn-Schunck方法:

假设光流在整个图像上是平滑的,Horn-Schunck方法计算速度场的估计,\left [ u,v \right ]^{T},最小化以下方程:

\bg_blue \bg_red E=\int \int (I_{_{x}}u+I_{_{y}}v+I_{_{t}})^{2}dxdy+\alpha \int \int \left \{ \left ( \frac{\partial u}{\partial x} \right ) ^{2}+\left ( \frac{\partial u}{\partial y} \right )^{2}+\left ( \frac{\partial v}{\partial x} \right )^{2}+\left ( \frac{\partial v}{\partial y} \right )^{2}\right \}dxdy

在这个方程中,\frac{\partial u}{\partial x}\frac{\partial u}{\partial y}是光学速度分量的空间导数,U和α刻度了全局光滑项。Horn-Schunck方法最小化上面的等式获得图像中每次像素的速度场\left [ u,v \right ],该方法由下列方程给出:

u^{k+1}_{x,y}=\bar{u}_{x,y}^{k}-\frac{I_{x}[I_{x}\bar{u}_{x,y}^{k}+I_{y}\bar{v}_{x,y}^{k}+I_{t}]}{\alpha ^{2}+I_{x}^{2}+I_{y}^{2}}

v^{k+1}_{x,y}=\bar{v}_{x,y}^{k}-\frac{I_{y}[I_{x}\bar{u}_{x,y}^{k}+I_{y}\bar{v}_{x,y}^{k}+I_{t}]}{\alpha ^{2}+I_{x}^{2}+I_{y}^{2}}

其中,\begin{bmatrix} u_{x,y}^{k} & v_{x,y}^{k} \end{bmatrix}是像素点(xdy)的速度估计,\begin{bmatrix} \bar{u}_{x,y}^{k} & \bar{v}_{x,y}^{k} \end{bmatrix}\begin{bmatrix} u_{x,y}^{k} & v_{x,y}^{k} \end{bmatrix}的邻域平均值。对于k=0,初始速度为0。

使用Horn-Schunck方法求u和v:

1,利用Sobel卷积核 [-1 -2 -1;0 0 0;1 2 1] 求 I_{_{x}} 和 I_{_{y}}及其转置形式,用于第一副图中的每个像素。

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

3,假设前一个速度为0,并用[0 1 0;1 0 1;0 1 0]作为卷积核计算每个像素的平均速度。

4,迭代求解U和V。

MATLAB案例:

%% Compute Optical Flow Using Horn-Schunck Method
% Read in a video file.

vidReader = VideoReader('viptraffic.avi');
%%
% Create optical flow object.
opticFlow = opticalFlowHS;
%%
% Estimate 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',25)
    hold off 
end

 

 

没有更多推荐了,返回首页