【图像检测】基于背景差分算法实现运动目标捕捉matlab代码

160 阅读4分钟

​1 简介

运动目标的检测是数字图像处理和模式识别以及计算机视觉领域研究的主要内容之一,也是计算机视觉研究的一个重要领域.对基于背景差分法的视频目标检测的算法进行了研究.以Matlab为主体研究工具,对视频中的运动目标进行检测.对背景差分法的原理和算法进行了研究,并对其进行了详细的讨论和分析.利用中值滤波背景模型来提取背景,并对目标的阴影进行检测与抑制.实验结果表明,采用该算法对运动目标进行检测具有良好的准确性和稳定性.

2 完整代码

%%基于背景差分的运动目标捕捉
close all;  
clear   
clc
%%%%%%%%%%%%%%%%%%根据一幅目标全可见的图像圈定跟踪目标%%%%%%%%%%%%%%%%%%%%%%%
ZMIN=0;
ZMAX=0;
nStar =1 ;%起始帧数
sm=VideoReader('vipmen.mp4');
nNUM = 280;
imu=zeros(120,160);%建立一个与图片尺寸相当的空矩阵保存均值
imxigema=zeros(120,160);%建立一个与图片尺寸相当的空矩阵保存方差
qiuhe=zeros(120,160);%建立一个与图片尺寸相当的空矩阵保存和
for k1=nStar:13      %13的含义是选取的背景帧数到13帧为止
   qiuhe=qiuhe+double(rgb2gray(read(sm,k1)));
end
imu=qiuhe/(13-nStar+1);%求出均值
for k2=nStar:13
   qiuhe=qiuhe+(double(rgb2gray(read(sm,k2)))-imu).^2;
end
imxigema=sqrt(qiuhe/(13-nStar+1));%求出方差
Background = imu;%第一帧当做初始背景
% 背景更新过程,其中int2str将整型常量转为字符串
for k = nStar+1 : nNUM
   
   CurrentImage =double(rgb2gray(read(sm,k))); % 当前帧
   FormerImage =double(rgb2gray(read(sm,k-1))); % 前一帧
   ID =uint8(abs( CurrentImage - FormerImage ));    % 帧间差分
%%%%%%%%%%%%%%%以下为迭代法求阈值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f=ID;
[sx,sy]=size(f);
%灰度直方图
h=imhist(f);
%累积直方图
vmax = 256 ; H(1:vmax)=0; H(1)=h(1);
for i=2:vmax
   H(i) = H(i-1) + h(i)
end
% 归一化直方图
h1 = h / (sx * sy);
%归一累积直方图
H1 = H/(sx*sy);
%求初始值
% 初始值设定
% 初始值设定
ZMAX=max(max(f));
ZMIN=min(min(f));
T0=(ZMAX+ZMIN)/2;%取中值作为初始阈值分割
%迭代法
while 1
   FZ1=0;FZ2=0; %分子
   for i=1:256
       if i<T0
          FZ1=FZ1+(i-1)*h1(i);
       else
          FZ2=FZ2+(i-1)*h1(i);
       end
   end
   u1=FZ1/H1(T0);
   u2=FZ2/(1-H1(T0));
   T1=(u1 + u2)/2;
   if abs(T0-T1)<1
       %求出灰度值比例
       level = double(T0);
       level = level / 255;
       break;
   else
       T0=abs(uint8(T1));
   end
end
%%%%%%%%%%%%%%%%%%%以上代码均可独立为一个函数进行调用%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   BW = im2bw(ID,level);
%%%%%%%%%%%%%%%%%%%更新背景,利用高斯背景模型进行%%%%%%%%%%%%%%%%%%%%%%%%%%
   alpha = 0.05; %背景更新的速度
   %高斯背景建模
   id =abs(abs(Background-imu).*BW-(2.*imxigema+0.02).*BW);
   id(id<0)=0;
   CurrentBack=id+( alpha.* CurrentImage + ( 1-alpha ).* Background ).*( 1 -BW );
   Background = CurrentBack;%背景更新完毕
   %计算新的均值与方差,重新建立当前背景的模型
   imu=(qiuhe+CurrentImage)/(13+k-1);
   imxigema=sqrt(qiuhe+(CurrentImage-imu).^2)/(13+k-1);
%%%%%%%%%%%%%%%%%%背景处理完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
   Cut=abs(CurrentImage-Background);%前景与背景差分
   Cut=uint8(Cut);
%%%%%%%%%%%%%%%以下为迭代法求阈值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
f=Cut;
[sx,sy]=size(f);
%灰度直方图
h=imhist(f);
%累积直方图
vmax = 256 ; H(1:vmax)=0; H(1)=h(1);
for i=2:vmax
   H(i) = H(i-1) + h(i)
end
% 归一化直方图
h1 = h / (sx * sy);
%归一累积直方图
H1 = H/(sx*sy);
%求初始值
% 初始值设定
% 初始值设定
ZMAX=max(max(f));
ZMIN=min(min(f));
T0=(ZMAX+ZMIN)/2;%取中值为初始阈值
%迭代法
while 1
   FZ1=0;FZ2=0; %分子
   for i=1:256
       if i<T0
          FZ1=FZ1+(i-1)*h1(i);
       else
          FZ2=FZ2+(i-1)*h1(i);
       end
   end
   u1=FZ1/H1(T0);
   u2=FZ2/(1-H1(T0));
   T1=(u1 + u2)/2;
   if abs(T0-T1)<1
       %求出灰度值比例
       level = double(T0);
       level = level / 255;
       break;
   else
       T0=abs(uint8(T1));
   end
end
%%%%%%%%%%%%%%%%%%%以上代码均可独立为一个函数进行调用%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   BWCut=im2bw(Cut,level);%差分后的图像进行二值化
   SE=[1 1 1;1 1 1;1 1 1];%结构元素
   BWCutero=imerode(BWCut,SE);%对二值图像进行腐蚀,以消除微小变动的区域
   BWCuterodil = bwmorph(BWCutero,'dilate',7);%膨胀
   figure(1)
  imshow(read(sm,k));title('目标捕捉')
%%%%%%%%%%%%%%%%%%框选目标%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
  [L,nm] = bwlabel(BWCuterodil,8);%找出图像中的八连通区域,视为车辆所在的区域
   da=0;
   shu=[0,0,0,0];
   for i = 1:nm 
      [r,c] = find(L == i)
       left= min(c)
       right= max(c)
       top= min(r)
       buttom= max(r)
       width=right - left + 1
       height = buttom - top + 1;
       rectangle('Position',[left,top,width,height],'EdgeColor','y');%对车辆用矩形标记
       S=width*height;
       if da<S
           da=S;
           shu=[left,top,width,height];
       end
pause (0.01)
   end
end

3 仿真结果

4 参考文献

[1]汪国强, 盖琪琳, 于怀勇, 文雪, & 任天威. (2014). 基于背景差分法的视频目标检测算法研究. 黑龙江大学工程学报, 5(4), 5.

部分理论引用网络文献,若有侵权联系博主删除。

5 MATLAB代码与数据下载地址

见博客主页