Vibe算法简介、优缺点、代码

算法简介

  该算法采用邻域像素来创建背景模型,通过比对背景模型和当前输入像素值来检测前景。总的来说就是先背景建模,后前景检测的背景差方法。
  具体的思想就是为每个像素点存储了一个样本集,样本集中采样值就是该像素点过去的像素值和其邻居点的像素值,然后将每一个新的像素值和样本集进行比较来判断是否属于背景点。
  vibe算法可以分为以下三个步骤。

1.背景模型的初始化

  初始化单帧图像中每个像素点的背景模型。假设每一个像素和其邻域像素的像素值在空域上有相似的分布。基于这种假设,每一个像素模型都可以用其邻域中的像素来表示。为了保证背景模型符合统计学规律,邻域的范围要足够大。
  对于一个像素点,随机的选择它的邻居点的像素值作为它的模型样本值。M0(x)=v0(y|y∈NG(x)),t=0初始时刻,NG(x)即为邻居点 。

2.前景检测过程

  对后续的图像序列进行前景目标分割操作。
背景模型为每个背景点存储一个样本集,然后每个新的像素值和样本集比较判断是否属于背景。像素点(x,y)的背景模型为在这里插入图片描述,像素值为在这里插入图片描述。按照下面判断该像素值是否为前景。
在这里插入图片描述

这里上标r是随机选的;T是预先设置好的阈值。当  在这里插入图片描述
满足符合背景#N次时,我们认为像素点    在这里插入图片描述为背景,否则为前景。

3.背景模型的更新方法

  ViBe算法的更新在时间和空间上都具有随机性。时间上的随机性。在N个背景模型中随机抽取一个,设为图像Pg。当我们得到新的一帧图像Pt时,如果图像Pt中的x位置对应的像素Pt(x)被判断为背景,则Pg需要被更新。这个抽取的过程体现了时间上的随机性。空间上的随机性。在Pg(x)的八邻域中随机抽取一个像素Pg(r),用Pg(r)的来替换掉Pg(x),这体现了模型更新空间上的随机性。

Vibe算法优缺点

优点:

  • 内存占用少,一个像素需要作一次比较,占用一个字节的内存;
  • 无参数法;
  • 性能优于混合高斯,参数化方法,SACON等;
  • 像素级算法,视频处理中的预处理关键步骤;
  • 背景模型及时初始化;
  • 具有较好的抗噪能力;
  • 在背景建模中,不仅减少了背景模型建立的过程,还可以处理背景突然变化的情况,当检测到背景突然变化明显时,只需要舍弃原始的模型,重新利用变化后的首帧图像建立背景模型;
  • 在背景模型更新中,采用八邻域更新的方法,可以去除由于获取的视频细微抖动(摄像机抖动、目标微动)而产生的重影和误差,让检测目标更加准确。

缺点:

  • 在背景建模中,由于可能采用了运动物体的像素初始化样本集,容易引入Ghost区域(拖影、鬼影区域)(Ghost区域也就是指当一个原本静止的物体开始运动,背景差检测算法可能会将原来该物体所覆盖的区域错误的检测为运动的,这块区域就成为Ghost,当然原来运动的物体变为静止的也会引入Ghost区域,Ghost区域在检测中必须被尽快的消除。)Ghost区域如下图所示;
    在这里插入图片描述

  • 静止目标问题,长时间驻留未运动,该人物运动目标逐渐被背景吸收。
    在这里插入图片描述

  • 阴影前景问题,阴影的存在导致检测出来的运动目标形状不准确,影响后续目标分类、跟踪、识别和分析等其他智能视频处理模块。产生阴影前景问题的根源是:光线被运动目标前景遮挡,投射阴影区的颜色比背景的颜色暗,即阴影和背景颜色值的距离相差较大,背景差分后被误检为运动目标前景。
    在这里插入图片描述

  • 运动目标不完整问题,运动目标通常可分为非刚性物体和刚性物体,人属于非刚性物体,车属于刚性物体,这两种常见检测对象的检测结果都出现了不完整现象。
    在这里插入图片描述

Vibe代码

Vibe.h头文件

#include<iostream>
#include<cstdio>
#include<opencv2/opencv.hpp>

using namespace cv;
using namespace std;

//每个像素点的样本个数默认值
#define DEFAULT_NUM_SAMPLES 20

//#min指数默认值
#define DEFAULT_MIN_MATCHES 2

//Sqthere半径默认值
#define DEFAULT_RADIUS 20

//子采样概率默认值
#define DEFAULT_RANDOM_SAMPLE 16

class ViBe
{
   
public:
	ViBe(int num_sam = DEFAULT_NUM_SAMPLES,
		int min_match = DEFAULT_MIN_MATCHES,
		int r = DEFAULT_RADIUS,
		int rand_sam = DEFAULT_RANDOM_SAMPLE);
	~ViBe(void);

	//背景模型初始化
	void init(Mat img);

	//处理第一帧图像
	void ProcessFirstFrame(Mat img);

	//运行ViBe算法,提取前景区域并更新背景模型样本库
	void Run(Mat img);

	//获取前景模型二值图像
	Mat getFGModel();

	//删除样本库
	void deleteSamples();

	//x的邻居点
	int c_xoff[9];

	//y的邻居点
	int c_yoff[9];

private:
	//样本库
	unsigned char*** samples;

	//前景模型二值图像
	Mat FGModel;

	//每个像素点的样本个数
	int num_samples;

	//#min指数
	int num_min_matches;

	//Sqthere半径
	int radius;

	//子采样概率
	int random_sample;

};
#pragma once

Vibe.cpp

#include"Vibe.h"
/*
构造函数ViBe
参数:
int num_sam:每个像素点的样本个数
int min_match:#min 指数
int r: Sqthere 半径
int rand_sam:子采样概率
*/

ViBe::ViBe(int num_sam, int min_match, int r, int rand_sam)
{
   
	num_samples = num_sam;
	num_min_matches 
  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
vibe算法是一种用于目标检测和跟踪的算法,它基于背景模型和像素的相似度来判断是否为前景像素。针对vibe算法的改进可以从以下几个方面考虑: 1. 背景模型更新策略:vibe算法使用了很简单的随机采样方法来更新背景模型,可以尝试更复杂的模型更新策略,例如利用递归滤波或卡尔曼滤波来提高背景的准确性。 2. 像素相似度计算方法:vibe算法使用了基于颜色直方图的方法来计算像素的相似度,可以考虑引入其他更高效准确的相似度计算方法,例如局部二值模式(LBP)或高斯混合模型(GMM)。 3. 前景区域分割:vibe算法在输出前景时,通常会得到一些噪点或无关的区域,可以通过引入形态学操作或连通性分析等方法对前景区域进行进一步的处理和优化。 4. 自适应参数设置:vibe算法的性能很大程度上依赖于参数的设置,可以考虑引入自适应的参数调整策略,根据场景的变化动态地调整算法的参数,以提高算法的适应性和性能。 5. 并行化实现:vibe算法可以通过并行化实现来加速计算过程,例如使用GPU或多线程技术来提高算法的运行速度。 综上所述,针对vibe算法的改进可以从背景模型更新策略、像素相似度计算方法、前景区域分割、自适应参数设置和并行化实现等方面进行优化,以提高算法的准确性、鲁棒性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值