VIBE模型
Vibe 是一种通用的运动目标检测算法,对于视频流类型、颜色空间、场景内容没有特定要求。首次将随机选择机制引入到背景建模中,通过随机选择样本估计背景模型的方式描述实际场景的随机波动性。通过调节时间二次抽样因子,使极少的样本值就能覆盖所有的背景样本,兼顾了准确率和计算负载。抑噪能力强,噪声等干扰信息在传播之前须与背景模型相匹配,显而易见,无法匹配,从而抑制了干扰信息的传播。VIBE是一种像素级的背景建模、前景检测算法,该算法主要不同之处是背景模型的更新策略,随机选择需要替换的像素的样本,随机选择邻域像素进行更新。
背景模型的初始化:存储一个样本集(像素点、及该像素的邻域)。
背景检测过程:每个新的像素值和样本集比较判断是否属于背景。1)计算新像素值和样本集中每个样本值的距离,若距离小于阈值,则近似样本点数目增加。2)如果近似样本点数目大于阈值,则认为新的像素点为背景。
背景模型更新:1)无记忆更新策略。每次确定需要更新像素点的背景模型时,以新的像素值随机取代该像素点样本集的一个样本值。2)时间取样更新策略:并不是每处理一帧数据,都需要更新处理,而是按一定的更新率更新背景模型。当一个像素点被判定为背景时,它有1/rate的概率更新背景模型。rate是时间采样因子,一般取值为16。3)空间邻域更新策略:针对需要更新像素点,随机的选择一个该像素点邻域的背景模型,以新的像素点更新被选中的背景模型。
VIBE模型主要优点:1、思想简单,易于实现。2、样本衰减最优。3、运算效率高。
主要的缺点:1、静止目标易为背景。2、阴影前景。3、运动目标不完整问题。
VIBE背景建模
。
clear,close all;
% [filename,pathname] = uigetfile('*.avi','choose the video name:');%选择视频
video = VideoReader('person1.mp4');%改为自己的路径
height = video.Height;
width = video.Width;
%参数
NumFrames = video.NumberOfFrames;
%原视频
for f = 1 : NumFrames
imageRGB1 = read(video,f);
figure(1),imshow(imageRGB1,[]);
end
%
cardinality = 2;%基数
r = 20;%给定半径
n = 20;
%
%初始化
bg = zeros(height,width,n);
for nn = 1 : n
imrgb = read(video,nn);
imgray = rgb2gray(imrgb);
bg(:,:,nn) = imgray;
end
bgpad = padarray(bg,[1 1],'replicate');
%随机更新
for f = n+1 : NumFrames
imageRGB = read(video,f);
image = rgb2gray(imageRGB);
for i = 1:height
for j = 1:width
div = abs(bg(i,j,:) - double(image(i,j)));
logic = div < r;
bignum = sum(logic);
if bignum > cardinality
% 随机选择初始化背景中的一个点用新点进行替换
% rnum = rand(n,1);
% maxnum = find(rnum == max(rnum));
randz = randi(n);
%bg(i,j,int8(rand(1)*n)) = image(i,j);
bgpad(i+1,j+1,randz) = image(i,j);
% 随机改变(i,j)邻域
randy = randi([-1 1]);
randx = randi([-1 1]);
bgpad(i+1+randy,j+1+randx,randz) = image(i,j);
%
end
end
end
randbg = randi(n);
out = bgpad(2:height+1,2:width+1,randbg);%背景
figure(2),imshow(out,[]);
drawnow;
end
finalbg = mean(bgpad(2:height+1,2:width+1),3);%背景
figure(3),imshow(finalbg,[]);
drawnow;