ViBe算法原理及Matlab实现
ViBe算法官方网站
Paper: A Universal Background Subtraction Algorithm for Video Sequences
1. ViBe算法概述
ViBe是一种像素级视频背景建模或前景检测的算法,效果优于所熟知的几种算法,对硬件内存占用也少。ViBe是一种像素级的背景建模、前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新。在无法确定像素变化的模型时,随机的更新策略,在一定程度上可以模拟像素变化的不确定性。[1]
2. ViBe算法原理介绍
这里介绍的ViBe算法是官方网站中提供的最原始的ViBe算法框架。
ViBe算法的大致框架可分为三个部分:
- 模型初始化
- 前景分割
- 背景更新
下面来分别介绍一下这三个部分。
1. 模型初始化(Initialization)
ViBe算法的一个特点就是采用单帧进行模型的初始化,相对于其他背景建模的方法优点是初始化速度快,缺点就是在初始化时很可能存在运动物体的样本被认作时背景,引入了Ghost区域。
ViBe初始化就是填充像素的样本集的过程但是由于在一帧图像中不可能包含像素点的时空分布信息,我们利用了相近像素点拥有相近的时空分布特性,具体来讲就是:对于一个像素点,随机的选择它的邻居点的像素值作为它的模型样本值。[1]
More precisely, we fill them with values randomly taken in their neighborhood in the first frame. [2]
但是,在实际上初始化的时候,可以以单帧图像为基础,通过人为地对图像加入一定范围内的随机噪声构建样本集,这也时官网代码中的做法。
这样,我们就可以得到一个初始的背景模型,比如对原始单帧图像10次加入随机噪声,可以获得10个背景样本,构成样本集。
2. 前景分割(Segmentation)
前景分割的过程即是对当前帧的像素与背景样本集中的像素进行比较,判断当前像素是否符合背景样本的特征。具体的比较手段就是计算像素值与背景模型中的所有样本的距离,对于单通道即灰度图就是绝对值,对于三通道即彩色图就是颜色空间中两个点的距离,与设定的阈值进行比较,计算是否小于阈值;然后,再统计小于阈值的点数是否足够多(比如是否多于两个样本符合条件)。
如果数目足够,则新像素为背景;反之,则为前景。
3. 模型更新(Update)
根据论文中的介绍,模型更新使用了四种策略:
- 保守更新策略:前景永远都不会用来更新背景
- 无记忆更新策略:每次背景模型更新时,以新的像素值随机取代一个样本集中的样本值
- 时间取样更新策略:没必要每一帧都更新处理,以一定的更新率进行更新。具体实现的时候,当一个像素被判定为背景时,1/rate的概率被更新
- 空间邻域更新策略:对需要更新的像素点,有一定的概率更新他邻域的像素的背景模型
关于保守更新的策略,根据参考文章[1]中的说法,对于死锁问题确实需要采用保守更新+计数器的方式更好一些,不过这部分可以根据需要自己扩展,这里还是以官网的代码为例。
重点:对于时间取样和空间邻域更新策略,在官网代码实现的时候确实很巧妙,个人觉得很体现代码功力。实现的时候,如果对每一个点都进行概率判断,就相当于遍历了每一个像素点,复杂度为O(height*width)
;换个角度思考,每个点都有一定概率(比如1/rate)才更新,等同于整幅图图像每次会更新一定概率部分个点,即1/rate*height*width
个点更新,这样整体的计算复杂度就会降到O(1/rate*height*width)
。
官网在实现的时候是通过随机步长的方式,比如,步长为1~(2*rate - 1)
之间的一个随机数,每次更新一个点就向前移动一定步长。(假设整幅图像存储为一个一维数组,每次通过加步长计算索引)这样计算下来,平均每次移动的步长约等于rate
,那么整幅图像就会有1/rate*height*width
进行更新,等价实现。
Matlab代码示例:(只是示例,现写的)
index = 0;
while index < height*widthshift = floor(rand()*(2*rate - 1)) + 1;index = index + shift;if updateingMask(index) == 0updatePixel;end
end
4. 其他
总体来说还是只介绍了最基础的ViBe算法原理,不过以此为基础可以进行更加其他功能扩展,比如加入计时器消除Ghost区域,检测闪烁像素等等。
实现ViBe的C或者C++代码可以在官方网站下载,我个人也按照官网的代码写了Matlab代码进行了仿真,速度比较快,当然仅仅实现了基础功能,其他功能还有待完善。
参考文献
ViBe算法原理和代码解析-彼岸花
ViBe: A Universal Background Subtraction Algorithm for Video Sequences
ViBe算法原理及Matlab实现相关推荐
- matlab 投票法_SVM算法原理及其Matlab应用
<SVM算法原理及其Matlab应用>由会员分享,可在线阅读,更多相关<SVM算法原理及其Matlab应用(18页珍藏版)>请在人人文库网上搜索. 1.SVM 算法及其 Mat ...
- 智能优化算法:海鸥算法原理及Matlab代码
智能优化算法:海鸥算法原理及Matlab代码 文章导航 1. 算法原理 2. SOA算法流程 2.1 迁徙行为(exploration ability) 2.2 攻击行为(exploitation a ...
- MUSIC算法原理及MATLAB代码 阵列信号处理
MUSIC算法原理及MATLAB代码 阵列信号处理 MUSIC(multiple signal classification algorithm)算法是一种基于矩阵特征空间分解的方法.从几何角度讲,信 ...
- AP近邻传播聚类算法原理及Matlab实现
AP近邻传播聚类算法原理及Matlab实现 Affinity Propagation (AP)聚类是2007年在Science杂志上提出的一种新的聚类算法.它根据N个数据点之间的相似度进行聚类, ...
- ViBe算法原理和代码解析
ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网:http:// ...
- FCM算法原理及matlab实现
(一)FCM算法原理 Fuzzy c-means (FCM) is a clustering method that allows each data point to belong to multi ...
- 区域生长算法原理及MATLAB实现
1. 基于区域生长算法的图像分割原理 数字图像分割算法一般是基于灰度值的两个基本特性之一:不连续性和相似性.前一种性质的应用途径是基于图像灰度的不连续变化分割图像,比如图像的边缘.第二种性质的主要应用 ...
- Adaboost算法原理以及matlab代码实现(超详细)
一.AdaBoost简介 Boosting, 也称为增强学习或提升法,是一种重要的集成学习技术, 能够将预测精度仅比随机猜度略高的弱学习器增强为预测精度高的强学习器,这在直接构造强学习器非常困难的情况 ...
- 差分进化算法原理及matlab代码实现
差分进化算法介绍: 在自然界中,遗传,变异,选择的作用,使得生物体优胜略汰,不断由低级向高级进化,人们发现适者生存这一规律可以模式化,从而构成一些列优化算法.差分进化算法就是从这种模式中产生的一种智能 ...
- 局部边缘保留滤波器LEP算法原理及matlab代码实现
"Gu B, Li W, Zhu M, et al. Local edge-preserving multiscale decomposition for high dynamic rang ...
最新文章
- 类的加载过程二:Linking
- WebStrom如何设置字体?
- AndroidStudio更改默认编码(不用每次新建项目再更改编码了)
- python替换文件内容_使用python替换文件内容
- CentOS网络问题汇总
- 希望能够在这条路上走下去
- LittlevGL 开源图形库
- DarkNet yoloV2 转到caffe使用
- CKEditor5富文本编辑器在vue中的使用
- 利用脚本一键删除微博
- 网站别黑了怎么解决?如何处理网站被黑问题详解
- Word 安全模式可以启动,正常模式不能启动
- 脚本案例互联网赚钱怎么赚钱?一切都需要引流脚本
- 全网最细------爬取4k高清大图
- 网易云易盾推出面向微信小程序的大数据反作弊产品
- 利用comet实现服务器推式的通信
- 计算机技术基础 vb 试卷及答案,云南师范大学《VB》期末试卷及答案
- druid.io中文版文档
- [打破常识]“木桶原理”之大谬误!
- 英飞凌基础学习笔记-SCU(System Control Units)