【MATLAB项目实战】基于背景差分的烟雾视频检测

%%基于背景差分的运动目标捕捉
close all;  
clear   
clc
%%%%%%%%%%%%%%%%%%根据一幅目标全可见的图像圈定跟踪目标%%%%%%%%%%%%%%%%%%%%%%%
ZMIN=0;
ZMAX=0;
nStar =1 ;%起始帧数
sm=VideoReader('4.mp4');
nNUM = 30;
imu=zeros(394,372);%建立一个与图片尺寸相当的空矩阵保存均值
imxigema=zeros(394,372);%建立一个与图片尺寸相当的空矩阵保存方差
qiuhe=zeros(394,372);%建立一个与图片尺寸相当的空矩阵保存和
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

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桃子技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值