Vibe 算法原代码
video = VideoReader('DSC_0005.MOV');%读取视频文件
height = video.Height;%获取视频高度参数
width = video.Width;%获取视频宽度参数
se = strel('disk',1);
%% 设置参数
NumFrames = video.NumberOfFrames;%获取视频总帧数
cardinality =2;%阈值
r = 20;%给定半径
n = 20;%样本集数目
%% 初始化
bg = zeros(height,width,n);%初始化 20 个高为 height,宽为 width 的图像文件
bg1=zeros(height,width,NumFrames);%初始化 NumFrames 个高为 height,宽为
width 的图像文件
for nn = 1 : n
imrgb = read(video,nn);%读取图像
imgray = rgb2gray(imrgb);%灰度化
bg(:,:,nn) = imgray;
end
bgpad = padarray(bg,[1 1],'replicate');
%% 随机更新
for f = 25 : 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
随机选择初始化背景中的一个点用新点进行替换
bg1(i,j,f)=0;
%%
randz = randi(n);
bgpad(i+1,j+1,randz) = image(i,j);
%%
randy = randi([-1 1]);
randx = randi([-1 1]);
bgpad(i+1+randy,j+1+randx,randz) = image(i,j);
随机改变(i,j)邻域
bg1(i,j,f)=255;
else
end
end
end
bg1(:,:,f) = bwareaopen(bg1(:,:,f),300);
bg1(:,:,f)=imdilate(bg1(:,:,f),se);
axes(handles.axes2);
imshow(bg1(:,:,f));
disp(f);
[L,num]=bwlabel( bg1(:,:,f));%bwlabel 是用来标记二值图像中的连通区域
axes(handles.axes1);
imshow(imageRGB);
hold on;
RGB=label2rgb(L);%转换标记矩阵到 RGB 图像
STATS=regionprops(L, 'all');
for i=1:num
y = ceil(STATS(i).BoundingBox(1));%图像的横竖行 r
x = ceil(STATS(i).BoundingBox(2));%图像的竖行 c
h = ceil(STATS(i).BoundingBox(3));%图像的横竖行 r
w = ceil(STATS(i).BoundingBox(4));%图像的竖行 c
rectangle('Position',[y,x,h,w],'EdgeColor', 'r');
%
end
drawnow
end