%---------VIBE模型------------%
%根据第一帧建立样本集
%将每一帧像素点与对应样本集进行比较,若在半径内的值小于阈值则为前景点,反之则为前景点
%对于背景点有一定概率进行样本集和邻域进行更新。
clear;
N=20;%样本数,经验值为20
U_min=2;%阈值
R=20;%判断半径
mincount=0;%距离小于半径的点
rand_pro=16;%背景点更新的概率
dir=('D:\毕业设计\数据集视频\data');
fr=imread('D:\毕业设计\数据集视频\data\in006953.jpg');
fr_g=rgb2gray(fr);
fr_g=double(fr_g);
[height,width]=size(fr_g);
M=zeros(height,width,N);
bg_count=zeros(height,width);%每个像素点设为背景点的次数
fg_count=zeros(height,width);%每个像素点设为前景点的次数
%初始化样本集
for i=2:height-1
for j=2:width-1
for k=1:N
random_array=randi([-1,1],1,2);%生成随机数组
neibor_X=i+random_array(1,1);
neibor_Y=j+random_array(1,2);
M(i,j,k)=fr_g(neibor_X,neibor_Y);%随机选择8邻域的像素点
end
end
end
str1='D:\毕业设计\数据集视频\data\in00';
for n=6954:7052 %每帧图像
str2=int2str(n);
str=strcat(str1,str2,'.jpg');
fr1=imread(str);
fr_g1=rgb2gray(fr1);
fr_g1=double(fr_g1);
for i=2:height-1
for j=2:width-1
mincount=0;
for n=1:N
dist=abs(M(i,j,n)-fr_g1(i,j));
if dist<R %若欧式距离小于半径
mincount=mincount+1;
end
end
if mincount<U_min %若范围内的样本值小于阈值,则为前景点;否则为背景点,有一定概率进行更新
fr_g1(i,j)=255;
fg_count(i,j)=bg_count(i,j)+1;
bg_count(i,j)=0;
if(fg_count(i,j)>50)%如果一个像素点连续被认为是前景点50次,则将其改为背景点,样本集及邻域有一定概率进行更新.
fg_count(i,j)=0;
update_m(M,fr_g1,i,j);
fr_g1(i,j)=0;%背景点为0
end
else %背景点样本集及邻域有一定概率进行更新
if(randi([1,16])==16)
k=randi([1,20]);
M(i,j,k)=fr_g1(i,j);%当前像素点样本集更新
random_array=randi([-1,1],1,2);%生成随机数组
neibor_X=i+random_array(1,1);
neibor_Y=j+random_array(1,2);
k=randi([1,20]);
M(neibor_X,neibor_Y,k)=fr_g1(i,j);%邻域样本集更新
end
fr_g1(i,j)=0;
end %每个像素点的样本值遍历结束
end
end
end
figure(1),imshow(fr); %显示输入图像
figure(2),imshow(uint8(fr_g1)); %显示前景图像
评论0
最新资源