1、资料搜索
总结:光流--LK光流--基于金字塔分层的LK光流--中值流
2、本人总结
我在“光流算法从理论到实践专题1”已经详细介绍了光流的基本概念以及最基本的LK光流算法。下面我们开始针对光流中的假设进行细化分析,其实在我给大家讲解光流概念的时候,里面就有一个存在一个不严谨的假设:假设上帧与当前帧的时间间隔比较短,但是当运动是快速运动的时候,我们该如何解决呢。我们可以举例来说明一下,加入我们是一个1000X1000分辨率的图像,结果前后两帧图像相同位置的像素偏移了[10,10]。但是如果我们把图像分辨率缩放为100X100,那么像素偏移则变为[1,1]。因此,这篇博客针对这个问题,开始引入 金字塔分层的LK光流法。
2.1 概念
该方法是由Bouguet提出,通过使用金字塔分层的方式,将原始图像逐层分解处理。说白了,就是金字塔上层的一个像素可以代表下层金字塔的几个像素。通过金字塔来实现自上而下的运动量。
2.2 算法简单流程
(1)首先建立一个高斯金字塔对原始图像进行分层,其中底层为原始图像,高层为最低分辨率图像;
(2)之后需要计算光流,即从顶层
开始,通过最小化每个领域范围内的匹配误差和,来得到顶层中每个点的光流
假设图像每次缩放为原来的一半,经过L层金字塔后,其中第0层为原图像,假设已知位移距离为d,每层的位移为:
(3)顶层的光流计算结果反馈到
层,可以得到初始的光流值
(4)重复上面的操作,知道第0层对应的
(准确值 = 估计量 + 残差)
因此,每层中每个点的光流都是基于领域内所有匹配点所有的匹配误差最小化:
关于实验的效果图和公式的推导就是 “光流算法从理论到实践专题1”,所以这里就不在说明。
说明:根据上面的操作不仅可以解决两帧之间的大运动,还在一定程度上解决孔径问题(因为,相同大小的窗口,在高层覆盖的范围会更大些)
有的时候考虑到顶层,其实就是减少了物体的位移,也就是减少了光流值。因此,我们先假设其对应的光流估计值
2.3 特征点的选择
因为光流是对图像中的每个像素进行操作,如果所有的像素都进行金字塔光流计算,那么帧与帧之间的时间间隔就会很大。为了解决这个问题,大家都会想到是否可以初步选取一些鲁棒的特征点。我们在上一专题中已经推导出公式:
,其中根据矩阵的可逆性,要求矩阵G的最小特征值要足够的大,才能够保证像素点容易进行跟踪。
因此,需要按照下面步骤选取特征点:
(1)记录图像I每个像素对应的矩阵G,计算其特征值
;
(2)遍历图像I得到每个G对应特征值的最小值和最大值;
(3)保留最小特征值大于
值对应的像素点;
(4)保留上一步中得到像素点中特征值局部最大的像素点;(范围可以自己选择,一般为3 X 3);
(5)剔除上一步保留像素点中分布密集的一些像素点,确保任何像素点之间的距离都大于给定的阈值(5~10个像素);
2.4 总结
总结上面的内容,首先,计算顶层图像上的光流。然后,根据最顶层的
光流的计算结果去估计次顶层的初始值,来计算次顶层上光流的精确值。最后,根据上层光流的计算结果估计下一层
光流的初始值,并计算其精确值反馈到下一层,直到计算出最底层的原始图像的光流。
注意:
(1)在每层图像中光流计算之前在图像周围要添加额外的像素圈,将像素圈内的像素值填充为图像的真实边界值。这样计算边界点的邻域时,相当于计算该点邻域有效部分;
(2)在每层图像上,都要根据光流估计值预先平移领域窗口,这样操作后计算的残差位移向量d就非常小,就可以使用标准的LK算法进行计算了。
更多《计算机视觉与图形学》知识,可关注下方公众号:
标签:顶层,专题,像素,算法,图像,光流,金字塔,像素点 From: https://blog.51cto.com/u_15717531/5732928