基于背景差分法和三帧差分法的目标检测方法matlab仿真

目录

一、理论基础

二、核心程序

三、仿真结论


一、理论基础

       基于背景减除法的目标检测算法,其主要通过通过设置和背景图像的像素比较相似的背景参数模型,接着将当前帧以及背景图差分开来,从而获得运动物体的运动区域。 基于背景减除法的目标检测算法,首选选择视频的第一帧作为初始背景,

通过MATLAB仿真,可以获得如下的背景更新仿真结果。 

       从图4.2的仿真结果可知,当参数a较小的时候,可以获得较为清晰的背景更新效果,而当较大的时候,背景中存在明显的目标残影,通过仿真测试,设置参数的值为0.0002。 

       基于帧间差分的目标检测仿真算法,三帧间使用以像素为基础的时间差分利用闭值化来获取图像中的运动范围。三帧差法,其主要通过相邻三帧划分成一组之后开始差分,如下公式所示,可以高效的获取出中间帧运动物体的形状。

        通过MATLAB仿真,可以获得如下的仿真结果:

     从仿真结果克制,对于体积比较大、色彩一样的运动物体,或许会在在物体内部产生空洞,让运动物体缺失。而且移动目标目标的外型在运动方向上被拉伸,让获得的图像的面积大于真实目标的面积。在两帧图像相继出现的时间段内,假如物体的运动速度非常快,导致原来被隐藏的背景表露出来,就会形成“鬼影”。从外,获得的目标中仍然存在较多的干扰噪声,因此,需要对检测结果进行形体学处理,最终获得如下的仿真结果:

        从上述两个章节的仿真结果可追,背景差分法在使用的时候,比较难获取绝对静止的背景,并且假如目标长久的不移动位置,或者背景中的物体离开,会导致误检。而三帧差分法获得的运动目标大于实际物体,当物体移动缓慢,相邻两帧间之间会产生空洞、漏检的情况,导致获得的目标信息不正确的后果。结合背景差分法和三帧差分法的目标检测方法,这里对本文所提出的改进算法进行matlab仿真,通过如下的公式实现目标检测。

                                                    

二、核心程序

%下面几行分别为清理指令窗口,清理内存,关闭现有图像,忽略警告,调用函数库
clc;
clear;
close all;
warning off;
addpath 'func\'

%下面的语句为读取视频时间较长,将读取后的视频保存到mat文件中,进行快速读取
SEL = 0;
if SEL == 1
   [pixel_rgb,pixel_gray,frameNum] = get_AVI('vedio\02.avi');
   save v1.mat pixel_rgb pixel_gray frameNum
else
   load v1.mat  
end


%参数alpha取值
alpha    = 0.00002;
%迭代次数
maxer    = 170;
%你那个算法中三个门限值。
T1       = 15;
T2       = 70;
T3       = 10;
%初始背景
B0       = pixel_gray(:,:,1);
%初始背景大小
[r,c]    = size(B0);
%背景更新初始化
B        = zeros(r,c,maxer);
%背景更新第一帧为B0
B(:,:,1) = B0;
%开始迭代
for i = 3:140
    i
    %背景提取
    tmps   = double(abs(pixel_gray(:,:,i) - pixel_gray(:,:,i-1)));
    %和门限T1进行对比
    d      = zeros(r,c);
    [x0,y0]= find(tmps >= T1);%得到大于T1的区域
    [x1,y1]= find(tmps <  T1);%小于门限T1的区域
    %对于大于T1的部分,赋值为1,且背景不变
    for m = 1:length(x0)
        d(x0(m),y0(m))   = 1;
        B(x0(m),y0(m),i) = B(x0(m),y0(m),i-1);
    end
    %对于小于T1的部分,赋值为0,且背景根据公式进行更新
    for m = 1:length(x1)
        d(x1(m),y1(m))   = 0;
        B(x1(m),y1(m),i) = alpha*double(pixel_gray(x1(m),y1(m),i)) + (1-alpha)*B(x1(m),y1(m),i-1);
    end  
    %背景减除获取运动目标
    tmps2    = double(abs(double(pixel_gray(:,:,i)) - B(:,:,i)));
    %背景减除获取运动目标和门限T2进行对比
    d2       = zeros(r,c);
    [x02,y02]= find(tmps2 >= T2);%得到大于T2的区域
    [x12,y12]= find(tmps2 <  T2);%小于门限T2的区域
    %对于大于T2的部分,赋值为1
    for m = 1:length(x02)
        d2(x02(m),y02(m))   = 0;
    end
     %对于小于T2的部分,赋值为0
    for m = 1:length(x12)
        d2(x12(m),y12(m))   = 1;
    end  
    %心态学处理,删除噪声,填充目标区域中的一些小的空洞
    d2         = bwareaopen(d2,300);
    se         = strel('disk',2);
    d2         = imdilate(d2,se);
    d2         = imfill(d2,'holes');
    
    %三帧差分获取目标
    tmps3_1    = abs(double(pixel_gray(:,:,i))   - double(pixel_gray(:,:,i-1)));
    tmps3_2    = abs(double(pixel_gray(:,:,i+1)) - double(pixel_gray(:,:,i)));
 
    d3_1       = zeros(r,c);
    d3_2       = zeros(r,c);
    %三帧差分获取目标和门限T3进行对比
    [x03,y03]= find(tmps3_1 >= T3);
    [x13,y13]= find(tmps3_1 <  T3);
    %对于大于T3的部分,赋值为1
    for m = 1:length(x03)
        d3_1(x03(m),y03(m))   = 1;
    end
    %对于小于T3的部分,赋值为0
    for m = 1:length(x13)
        d3_1(x13(m),y13(m))   = 0;
    end  
    %三帧差分获取目标和门限T3进行对比
    [x04,y04]= find(tmps3_2 >= T3);
    [x14,y14]= find(tmps3_2 <  T3);
    %对于大于T3的部分,赋值为1
    for m = 1:length(x04)
        d3_2(x04(m),y04(m))   = 1;
    end
    %对于小于T3的部分,赋值为0
    for m = 1:length(x14)
        d3_2(x14(m),y14(m))   = 0;
    end      
    [x15,y15] = find(d3_1 == 1);
    BD        = zeros(r,c);
    for m = 1:length(x15)
        BD(x15(m),y15(m)) = 1;
    end
    clear x15 y15
    [x15,y15] = find(d3_2 == 1);
    for m = 1:length(x15)
        BD(x15(m),y15(m)) = 1;
    end    
    %形态学滤波
    BD         = bwareaopen(BD,200);
    BD         = imfill(BD,'holes');

    %运动目标检测
    [x16,y16] = find(d2 == 1);
    [x17,y17] = find(BD == 1);
    
    Cf        = zeros(r,c);
    for m = 1:length(x16)
        Cf(x16(m),y16(m)) = 1;
    end
    for m = 1:length(x17)
        Cf(x17(m),y17(m)) = 1;
    end    
    
    SE1     = strel('ball',10,10);
    Cf      = imerode(Cf,SE1,'same');  

    %跟踪显示
    Cf2     = func_track(pixel_rgb(:,:,:,i),Cf);

    %下面的语句是显示上述各个步骤的图像处理效果
    figure(1);
    subplot(231);
    imshow(pixel_gray(:,:,i));title('原图');
    subplot(232);
    imshow(B(:,:,i),[]);title('背景提取');
    subplot(233);
    imshow(d2,[]);title('背景差获取运动目标');   
    subplot(234);
    imshow(BD,[]);title('三帧差分获取目标');   
    subplot(235);
    imshow(Cf,[]);title('最终提取效果');       
    subplot(236);
    imshow(Cf2,[]);title('最终目标跟踪效果');     
    drawnow;
    %内存清理
    clear x0 y0 x1 y1 x02 y02 x12 y12 x03 y03 x13 y13 x04 y04 x14 y14 x15 y15 x16 y16 x17 y17
A10-33

三、仿真结论

 

       从图的仿真结果可知,改进算法可以获得较为清晰的目标检测效果,整个检测结果,不存在目标空洞,也不存在噪声干扰,此外,对于区域面积较小的脚部区域也获得了完整的检测效果。最后,根据图的检测结果进行目标的跟踪,这个部分的仿真结果如图所示。将三种算法进行性能对比,分别从仿真时间,仿真性能两个方面进行对比。

       三种算法的仿真时间分别为0.213秒,0.153秒, 0.414秒。从仿真结果可知,三帧差法由于其算法结构较为简单,因此仿真时间最短,而本文所提出的改进算法,同时结合了背景差法和三帧差分法,因此其仿真时间最长,但是其仿真效果最好。

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/129998402