为了计算两幅图像之间的光流,必须解决以下光流约束方程:
其中:,和是时空图像亮度导数;u是水平流;v是垂直光流。
Horn-Schunck方法:
假设光流在整个图像上是平滑的,Horn-Schunck方法计算速度场的估计,,最小化以下方程:
在这个方程中,和是光学速度分量的空间导数,U和α刻度了全局光滑项。Horn-Schunck方法最小化上面的等式获得图像中每次像素的速度场,该方法由下列方程给出:
其中,是像素点(xdy)的速度估计,是的邻域平均值。对于k=0,初始速度为0。
使用Horn-Schunck方法求u和v:
1,利用Sobel卷积核 [-1 -2 -1;0 0 0;1 2 1] 求 和 及其转置形式,用于第一副图中的每个像素。
2,使用核[1 1]计算图像1和图像2之间的。
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