您的位置:首页 > 其它

背景建模(二)ViBe背景建模算法

2014-01-10 17:40 351 查看
ViBe算法的详细内容参看Olivier Barnich的以下两篇论文:

ViBe: A Powerful Random Technique to Estimate the Background in Video Sequences

ViBe: A universal background subtraction algorithm for video sequences

网上已经有作者提供的源代码,但需要申请,我没有申请。看论文的内容算法的实现并不难,下文就是我结合以上两篇论文阐述我对ViBe算法的理解。

ViBe算法是"Visual Background Extractor"的缩写。它是一种像素级视频背景建模算法。根据网上的一些测试资料显示,ViBe算法具有以下几个优点:(1)内存占用小;

(2)计算量小;(3)性能优于混合高斯模型;(4)背景模型能够快速初始化;(5)更快的Ghost区域消除速度。

看到ViBe算法居然有这么多优点,是不是有种怦然心动,跃跃欲试的感觉?当我第一次听说这个算法的正是这种感觉。废话不多说,让我们一起揭开ViBe算法的迷雾,看看它过人之处到底在哪。

ViBe算法分析:

先抛开ViBe不谈,我们直观的最简单的前景目标提取的方法是什么呢?没错,帧差法。我还没学过图像处理的时候,我就知道用视频相邻两帧相减取绝对值来获得运动的目标(两帧图像相减后,背景就被去除了,剩下的自然就是运动目标)。那么ViBe有什么不同呢?其实ViBe本质跟帧差法一样:将当前像素点的值跟之前帧的值进行比较来确定是不是背景点。说的有点绕口,下面将Vibe算法原理分为三部分:(1)算法模型初始化;(2)像素的分类过程(Vibe原理核心);(3)模型的更新策略。论文是从第(2)部分开始讲的,我从(1)算法模型初始化
开始讲。

模型的初始化

假定我们要处理的每一帧图像是M x N 个像素的,x表示某帧图像的一个像素点。模型要为M x N 中每个像素建立一个样本集,x像素的样本集可以表示为S(x)={p1 , p2 , p3 ... pn} ,每个样本集的大小为n,n这个值如何确定的,暂时不用管,一般是实验得出的,论文中取n=20。所以样本集的总大小为M x N x n。样本集的作用将会在后面讲到。 模型的初始化,就是要初始化样本集,一般初始化在视频的第一帧完成。每个像素有n个样本集,初始化样本集的方法不是唯一的,最直观的方法就是根据像素x和像素x的领域来初始化,即我们将x的值和x的几个领域值随机赋给x对应的n个样本。

像素的分类过程

初始化结束了,我们就要开始我的工作了:确定每一帧的前景图像。帧差法其实就是将上一帧的图像当做背景图像,当前帧减上一帧的值的绝对值就是前景图像,ViBe的当前帧跟帧差法是一样的,那么ViBe的“背景图像”是什么?聪明的你一定想到了,就是我们上面提到的样本集,我们就是要根据当前帧的像素值和样本集里的像素值进行比对,来得出当前帧的某个像素值是不是前景图像的像素值。听起来还蛮复杂的,实际上归结为一点就是:怎么比对?

假定当前帧为第 t 帧,pt(x)表示第 t 帧图像 x 像素的像素值。借用论文中的一幅图进行讲解(图中所用符号跟我所用的略有点不同),如图1。下面根据图的讲解都是针对x点一个像素的分析。图中的p1到p6都是x像素的样本集中的值,pt(x)为当前像素值。那图中的横坐标C1和纵坐标C2是什么呢?第一次看论文的时候我也很疑惑。我们假定我们处理的图像每个像素是RGB格式的,即一个像素值由R,G,B三个值表示,那么图1的坐标其实还隐藏了C3,即C1,C2,C3表示的正是三个通道值,如果是灰度图的话下面的图就要画成一维一条直线了。接下来我们选定一个半径R(如图1所示的R),在距pt(x)值半径R距离(这个距离即笛卡尔坐标距离,坐标就是RGB通道值)范围内的样本值有p2,p4,在半径R范围内的样本值总数计为#,那么下图#=2。
当#<#min的值时,x这个像素就被标记为前景像素。依次处理所有像素,就能得出前景图像了。其中#min这个值也是预先设定的,论文中给出的值是2。



图1

模型的更新策略

经过上面的分析,我们心中一定还有一个疑问,那就是样本值怎么跟新?样本值初始化后肯定不能一成不变,每处理一帧图像,就要对其进行一次更新,那这个跟新策略是什么呢?其实不用每次跟新每个样本值,论文中的方法是采用一种概率的方法,具体的更新策略:每一帧对当前像素最多只更新一个样本值,更新的概率为1/w。如果要更新,那么更新的这个样本值随机抽取。同样除了更新当前像素,还有1/w的更新概率要跟新当前像素的邻域值,跟新方法跟当前像素相同。这一段说的有些抽象,其实说白了,就是除了更新当前像素的样本值,也要更新邻域的样本值,只是是否更新是有一定概率的。

上面就是对ViBe算法的简单解析,写的比较仓促,以后会慢慢修改,之后有时间,我会上传我写的算法代码,这样方便理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息