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

发布时间:2026/7/31 13:11:40
【图像检测】基于背景差分算法实现运动目标捕捉matlab代码 ​1 简介运动目标的检测是数字图像处理和模式识别以及计算机视觉领域研究的主要内容之一,也是计算机视觉研究的一个重要领域.对基于背景差分法的视频目标检测的算法进行了研究.以Matlab为主体研究工具,对视频中的运动目标进行检测.对背景差分法的原理和算法进行了研究,并对其进行了详细的讨论和分析.利用中值滤波背景模型来提取背景,并对目标的阴影进行检测与抑制.实验结果表明,采用该算法对运动目标进行检测具有良好的准确性和稳定性.2 完整代码%%基于背景差分的运动目标捕捉 close all; clear clc %%%%%%%%%%%%%%%%%%根据一幅目标全可见的图像圈定跟踪目标%%%%%%%%%%%%%%%%%%%%%%% ZMIN0; ZMAX0; nStar 1 ;%起始帧数 smVideoReader(vipmen.mp4); nNUM 280; imuzeros(120,160);%建立一个与图片尺寸相当的空矩阵保存均值 imxigemazeros(120,160);%建立一个与图片尺寸相当的空矩阵保存方差 qiuhezeros(120,160);%建立一个与图片尺寸相当的空矩阵保存和 for k1nStar:13 %13的含义是选取的背景帧数到13帧为止 qiuheqiuhedouble(rgb2gray(read(sm,k1))); end imuqiuhe/(13-nStar1);%求出均值 for k2nStar:13 qiuheqiuhe(double(rgb2gray(read(sm,k2)))-imu).^2; end imxigemasqrt(qiuhe/(13-nStar1));%求出方差 Background imu;%第一帧当做初始背景 % 背景更新过程,其中int2str将整型常量转为字符串 for k nStar1 : nNUM CurrentImage double(rgb2gray(read(sm,k))); % 当前帧 FormerImage double(rgb2gray(read(sm,k-1))); % 前一帧 ID uint8(abs( CurrentImage - FormerImage )); % 帧间差分 %%%%%%%%%%%%%%%以下为迭代法求阈值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fID; [sx,sy]size(f); %灰度直方图 himhist(f); %累积直方图 vmax 256 ; H(1:vmax)0; H(1)h(1); for i2:vmax H(i) H(i-1) h(i); end % 归一化直方图 h1 h / (sx * sy); %归一累积直方图 H1 H/(sx*sy); %求初始值 % 初始值设定 % 初始值设定 ZMAXmax(max(f)); ZMINmin(min(f)); T0(ZMAXZMIN)/2;%取中值作为初始阈值分割 %迭代法 while 1 FZ10;FZ20; %分子 for i1:256 if iT0 FZ1FZ1(i-1)*h1(i); else FZ2FZ2(i-1)*h1(i); end end u1FZ1/H1(T0); u2FZ2/(1-H1(T0)); T1(u1 u2)/2; if abs(T0-T1)1 %求出灰度值比例 level double(T0); level level / 255; break; else T0abs(uint8(T1)); end end %%%%%%%%%%%%%%%%%%%以上代码均可独立为一个函数进行调用%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BW im2bw(ID,level); %%%%%%%%%%%%%%%%%%%更新背景,利用高斯背景模型进行%%%%%%%%%%%%%%%%%%%%%%%%%% alpha 0.05; %背景更新的速度 %高斯背景建模 id abs(abs(Background-imu).*BW-(2.*imxigema0.02).*BW); id(id0)0; CurrentBackid( alpha.* CurrentImage ( 1-alpha ).* Background ).*( 1 -BW ); Background CurrentBack;%背景更新完毕 %计算新的均值与方差重新建立当前背景的模型 imu(qiuheCurrentImage)/(13k-1); imxigemasqrt(qiuhe(CurrentImage-imu).^2)/(13k-1); %%%%%%%%%%%%%%%%%%背景处理完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Cutabs(CurrentImage-Background);%前景与背景差分 Cutuint8(Cut); %%%%%%%%%%%%%%%以下为迭代法求阈值%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fCut; [sx,sy]size(f); %灰度直方图 himhist(f); %累积直方图 vmax 256 ; H(1:vmax)0; H(1)h(1); for i2:vmax H(i) H(i-1) h(i); end % 归一化直方图 h1 h / (sx * sy); %归一累积直方图 H1 H/(sx*sy); %求初始值 % 初始值设定 % 初始值设定 ZMAXmax(max(f)); ZMINmin(min(f)); T0(ZMAXZMIN)/2;%取中值为初始阈值 %迭代法 while 1 FZ10;FZ20; %分子 for i1:256 if iT0 FZ1FZ1(i-1)*h1(i); else FZ2FZ2(i-1)*h1(i); end end u1FZ1/H1(T0); u2FZ2/(1-H1(T0)); T1(u1 u2)/2; if abs(T0-T1)1 %求出灰度值比例 level double(T0); level level / 255; break; else T0abs(uint8(T1)); end end %%%%%%%%%%%%%%%%%%%以上代码均可独立为一个函数进行调用%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BWCutim2bw(Cut,level);%差分后的图像进行二值化 SE[1 1 1;1 1 1;1 1 1];%结构元素 BWCuteroimerode(BWCut,SE);%对二值图像进行腐蚀以消除微小变动的区域 BWCuterodil bwmorph(BWCutero,dilate,7);%膨胀 figure(1) imshow(read(sm,k));title(目标捕捉) %%%%%%%%%%%%%%%%%%框选目标%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [L,nm] bwlabel(BWCuterodil,8);%找出图像中的八连通区域视为车辆所在的区域 da0; 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); widthright - left 1; height buttom - top 1; rectangle(Position,[left,top,width,height],EdgeColor,y);%对车辆用矩形标记 Swidth*height; if daS daS; shu[left,top,width,height]; end pause (0.01) end end3 仿真结果4 参考文献[1]汪国强, 盖琪琳, 于怀勇, 文雪, 任天威. (2014). 基于背景差分法的视频目标检测算法研究. 黑龙江大学工程学报, 5(4), 5.部分理论引用网络文献若有侵权联系博主删除。