1. 引言
在计算机视觉领域,运动目标检测是目标跟踪、行为识别等研究的基础,也是最热门的方向之一 [1] 。运动目标检测可以分为以下几类:帧间差分法 [2] 、光流法 [3] 、背景建模法 [4] ,其中背景建模法可以继续分为高斯混合模型背景减除法 [5] ,码本背景建模背景减除法 [6] 和基于像素的背景建模减除法。视觉背景减除(Visual Background extractor,以下简称ViBe)算法 [7] 是基于像素样本背景模型的运动目标检测算法,由Barnich等人在2009年首次提出,该算法具有计算量小、内存占用少、处理速度快、检测效果好和应对噪声稳定可靠的特点。但该算法对初始帧具有很大的依赖,容易引入鬼影区域,造成目标错检。下文对ViBe算法的基本原理和ViBe算法中鬼影的形成进行了详细的分析,并提出结合灰度特征直方图匹配的方法来检测鬼影。对于动态背景干扰前景检测的问题,下文也给出了一种有效的方法来判断像素是否属于动态背景。
2. ViBe算法
ViBe建模算法是一种通过收集背景样本来建立背景模型的技术,主要包含三个部分:背景模型的初始化、前景检测以及背景模型更新三个模块。
2.1. 背景模型初始化
对图像的每一个像素点x的位置,建立一个大小为N的背景样本集,其中vi表示背景像素值:
(1)
式(1)中
表示像素点x的背景样本集合,V1,
等表示背景样本集合中的样本。
初始化时,选择视频的第一帧,随机选择当前像素点的八邻域任意一点像素值存到当前像素点的背景模型中,得到vi。重复此操作N次,就得到初始化背景模型M。
2.2. 前景检测
从第2帧开始计算每个像素点像素值与背景模型同一位置像素点N帧像素值的差的绝对值,将结果和预设的阈值R相比,如果小于R则说明找到一个匹配;统计上述小于R的匹配数目,如果匹配数目大于设定的匹配数目阈值,就判断此像素点是背景点,否则就判为前景点(图1)。
(2)
式(2)中,
表示以
为中心,以R为半径的区域,用C表示
与M随机背景样本集合的交

Figure 1. The background sample contained in a circle with radius R as the center of circle V(x)
图1. 以V(x)为圆心R为半径的圆中包含的背景样本
集来判断相似度。当C大于一个给定的阈值
时,便认为
属于背景点。
2.3. 背景建模更新
如果一个像素点被判定为背景点,那么就要对此点及其邻域进行背景模型的更新。从N帧背景模型中任意选择一帧
,用新来一帧中被判定为背景点的像素值更新
中对应点,然后再用此像素值随机更新
八邻域任意像素点的像素值。
3. 改进的ViBe算法
ViBe算法具有良好的适应性和实时性,但是ViBe算法的背景更新速度较慢,不能迅速处理静止目标变为运动目标,以及运动目标变为静止目标这两种情况。比如ViBe一般将第1帧作为初始背景,如果第1帧中含有运动目标,算法不但会检测到运动目标,还会在目标原位置检测到一个虚假的运动区域,该区域就是所谓的鬼影,如图2~图4所示,其中,图2是视频第一帧图像,其中含有3个运动前景目标,图3为视频第11帧图像,图中有4个正在运动的前景目标,图4为使用传统ViBe算法检测的前景,该图像中有7个前景目标,其中有3个是鬼影,可见这种情况下使用传统ViBe检测的结果并不能真正反映出运动的前景目标。与之类似,在检测过程中,某个原本长时间静止的目标一旦开始运动,同样会产生鬼影。由于ViBe的更新速度慢,鬼影的存在时间较长。另一种情况是当目标长时间静止时,ViBe算法会在较长时间内将该目标判断为运动目标,增加了后续处理的运算量。
3.1. 鬼影的消除策略
针对ViBe算法中容易引入鬼影的问题,文献 [8] 提出结合背景模型的视觉显著性来判断前景是否为鬼影;文献 [9] 提出通过比较局部区域的背景模型像素值方差和新来帧该区域的像素值方差的大小来判断该区域存在鬼影还是静止目标;文献 [10] 提出在模型更新阶段,引入二次空间传播机制,以加快消除鬼影的速度。文中提出一种结合灰度特征直方图匹配的方法来检测鬼影。

Figure 2. Original image of the first frame
图2. 第1帧原图

Figure 3. Original image of the eleventh frame
图3. 第11帧原图
首先利用ViBe算法对背景进行建模,然后再获得前景目标;对获得的前景目标进行形态学去噪,主要是去除一些小的前景目标,形态学的去噪方式主要是对前景目标进行(3)式的闭操作,闭操作可以把比结构元素小的缺口或孔洞填充上,连接短的间断而起到连通作用。
(3)
其中A和B均为图像集合。
然后,对形态学去噪之后的前景目标进行连通,把彼此相连的前景目标像素点通过形态学处理连接成前景块,并剔除前景块中面积较小的块,最后得到相应帧的前景。
鬼影是将开始时静止的前景运动目标错检成背景,而将该运动目标的像素值更新到对应位置像素的样本中,而当该前景目标开始运动时,本来被该前景目标遮掩的真实背景显示出来,而该背景的各像素对应位置的像素点的样本中还没有加入真实背景的像素值,故错将显示出的真实背景检测为前景目标。依据ViBe算法的背景更新方法,鬼影需要很长时间才能逐渐消除,换言之,相邻几帧之间,鬼影的变化并不大,而运动目标因为位置的快速变化,导致与相邻帧间相同位置上的图像有很大的变化。根据以上事实,可以通过比较当前帧中前景目标与前s帧中相同位置处的图像的直方图的方式来检测出鬼影。
对得到的灰度图像中的前景目标进行直方图统计得到
,表示该灰度图中第i幅图像中第j个前景目标的直方图。同时求出前第s帧相应位置图像的灰度统计直方图
,然后求两个直方图的交集以匹配二个直方图。直方图之间的匹配公式如下:
(4)
其中Match表示
和
之间的匹配程度。所在前景块是否为鬼影使用以下公式判断:
(5)
式中
为常数是阈值。上式表示若前后两个图像块的灰度直方图的匹配系数大于
,则认为当前前景图像块属于鬼影块,否则认为该前景块属于运动前景。一般情况下,鬼影块之间的匹配程度很高,因为根据ViBe算法的背景更新策略,鬼影处的真实背景已经添加到了背景样本中,且背景样本更新的速度很慢;而运动前景目标块的匹配程度则很低,这个与运动目标的快速移动有关。一旦检测出的前景被判断为鬼影,就要及时更新该前景对应像素的背景样本,消除鬼影所带来的干扰。
3.2. 动态背景消除
在一些例如波纹、树叶抖动的动态场景中,相应的像素点的值将频繁变化。使用传统ViBe算法这些动态背景都将被检测为运动前景目标,显然这是不准确的。为了提取动态背景像素,就需要对每一个被检测为前景的像素进行评估。文献 [11] 提出通过检测一个像素点在前景和背景之间切换程度,来判断该像素是否属于动态背景像素。一个像素点在t − 1时刻和t时刻一个属于前景一个属于背景,那么可认为该像素发生了变化,要增加该像素点的闪烁程度值。设定闪烁属性
表示像素
的闪烁程度。t时刻像素
的闪烁程度由以下公式计算:
(6)
式中
表示像素
在t时刻是否属于前景,
和
都是常数。上式表示如果t时刻像素i的状态与t − 1时刻像素
的状态不同,则该像素的闪烁程度增加
;如果t时刻像素
的状态与t − 1时刻像素i的状态相同,则该像素的闪烁程度减少
。
一个像素具有高的闪烁程度,不一定属于动态背景。因为闪烁程度是累计计算的,当前的闪烁值并不能反映该像素当前时刻的状态,而是反映的该像素从开始到现在总的闪烁情况。所以再设定像素点的突变属性,来表示像素点当前的变化程度。
如果一个像素点在t − 2时刻是前景,在t − 1时刻是背景,而在t时刻是前景,那么可以认为该像素发生了突变。设定突变属性
表示像素
的突变程度。t时刻像素的突变程度由以下公式计算:
(7)
结合像素点的闪烁属性和突变属性可以判断该像素当前是否属于前景。设置属性
表示像素点
是否属于动态背景,t时刻像素
是否属于动态背景可使用以下公式计算:
(8)
式中
表示单位阶跃函数,
是常数。上式中若闪烁程度系数
大于常数
,则阶跃函数
的值为1,否则阶跃函数
的值为0,那么上式表示闪烁程度系数
大于常数
且该像素是突变像素,则可认为该像素属于动态背景。通过式(8)的计算,如果
的值为1,表示像素i在t时刻属于动态背景;否则属于运动前景。对于检测为动态背景的像素点的值要及时更新到该像素的背景样本中。
4. 实验结果及分析
文中算法开发工具为OpenCV2.4.10 + VS2013,测试数据采用www.changedetection.net视频库 [12] 和PETS2009视频库 [13] ,第一段视频来自PETS2009,测试的是文中算法的鬼影检测和消除的效果。第二段和第三段视频来自Change Detection dataset中的canoe视频和overpass视频,测试的是文中算法的动态背景检测和消除的效果。如图2~图6所示,图2为视频的第1帧,图中含有3个前景目标,图3为视频的第11帧,图中有4个前景目标。图4~图6为不同算法的第11帧运动目标检测结果,图4传统ViBe和图5混合高斯模型的检测结果中都有3个鬼影块,说明这两个算法并不能很好的处理鬼影的问题,图6为文中算法的检测结果,结果中并没有鬼影块,检测出的都是真实的运动前景目标,说明文中算法能较好的处理鬼影的问题。
图7~图11为canoe视频其中一帧的检测结果。图7为原图,图中的运动前景部分都是波纹,这些波纹应该被检测为动态背景而不是运动前景。图9传统ViBe和图10混合高斯模型的检测结果中都有大量的波纹被检测为运动前景。图11为本文改进ViBe算法的检测结果,由图可见视频帧中的波纹并没有被检测为运动前景。图12~图16为overpass视频其中一帧的检测结果。图12为原图,图中抖动的树叶和
水面波纹应该被检测为动态背景而不是运动前景。图14传统ViBe和图15混合高斯模型的检测结果中都有大量抖动的树叶被检测为运动前景,图16为本文改进ViBe算法的检测结果,由图可见视频帧中的抖动树叶和湖面波纹都没有被检测为运动前景。以上说明传统ViBe算法和混合高斯模型都不能很好的处理动态背景的问题。图11和图16分别是本文算法检测两种情景的结果,结果中都没有出现动态背景,都真实的反映了真正的运动前景,说明文中算法能较好的处理动态背景的问题。
5. 结束语
针对传统ViBe算法无法消除鬼影、无法处理动态背景等问题,本文提出了一种改进的ViBe算法。针对鬼影问题,通过提取各个前景块的灰度特征直方图并与前面帧中的相同位置的前景块灰度特征直方图相匹配的方式来检测出鬼影,并及时更新对应像素点的样本以消除鬼影对后面检测的影响。针对动态背景问题,通过设置像素的闪烁属性和突变属性来判断一个像素是否属于动态背景,对于检测出的属于动态背景的像素及时更新其样本。文中实验将传统ViBe算法、GMM算法和本文提出的改进ViBe算法进行对比试验。试验表明,本文改进ViBe算法在处理鬼影和动态背景上具有良好的效果。