混合高斯背景建模-视频的运动目标检测

课题内容

对于固定摄像机镜头的视频(即背景静止),检测出视频中的运动物体,并用方框框出检测到的目标。使用matlab,采取混合高斯背景建模的方法,将avi格式视频文件中的运动物体与背景分离,并标注出运动目标。

算法分析

混合高斯背景建模是基于样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量、每个模式的均值和标准差)表示背景,然后使用统计差分进行目标像素判断。它能够对复杂动态背景进行建模,计算量较大。

在混合高斯背景模型中,认为像素之间的颜色信息互不相关,对各像素点的处理都是相互独立的。对于视频图像中的每一个像素点,其值在序列图像中的变化可看作是不断产生像素值的随机过程,即用高斯分布来描述每个像素点的颜色呈现规律。

在进行视频运动目标检测时,只对灰度信息进行建模。

详细的算法流程如下。

(1)     混合高斯模型预定义

首先初始化k个高斯分布,即对高斯模型中的均值和方差参数进行初始化,把视频序列中各帧图像看成是一个时间序列:{X1,X2,…XT}。用k个高斯分布来表征每一帧图像中各像素点特征。则在t时刻,像素点 的概率密度可使用k个高斯密度函数加权来拟合:

 为高斯概率密度函数。其中, 、 和为图像序列 在t时刻第i个高斯分布的权重、均值和协方差矩阵。 ,为方差。k一般取值为3~5,在本文中k=3。

 

(2)     混合高斯模型的参数更新

当前像素与k个高斯分布按逐一进行匹配,根据匹配结果调整高斯模型的参数:

只要当前像素与k个模型其中的一个模型匹配,则认为该像素匹配高斯背景模型。而每个高斯模型的权值更新方法如下:

其中为学习率,若匹配成功,则,否则。即增大匹配的高斯模型的权重。匹配不成功的高斯模型分布参数不变,对匹配成功的高斯模型的均值和方差参数需要进行更新:

其中是更新速率。

若k个高斯模型中没有一个高斯模型与之匹配,则以该像素建立一个新高斯模型,初始化参数,代替原有模型中最不可能的权重最小的单个模型。

当更新完成后,每个高斯模型的权值需要归一化:

 

(3)     背景模型的选择和前景提取

更新会后,按照对k个高斯分布从高进低进行排序,选择前面B个高斯分布来表征背景图像:

T一般取0.75(本文采用0.25),表征背景图像。

 

整个混合高斯背景建模的流程如下图所示:

三 具体实现

1.     视频文件的读取

首先读取matlab提供的avi视频文件,比较适合做运动物体检测的有visiontraffic.aviatrium.avi singleball.avi。使用VideoReader函数读取视频对象,获取视频的基本信息,如宽度、高度、帧数。初始化用来存储前景图和背景图的图像fg和bg_bw。

source=VideoReader('singleball.avi');

numFrames=source.NumberOfFrames;

 

%----frame size variables------------------------

fr=read(source,1);%read in 1st frame as background frame

fr_bw=rgb2gray(fr);%convert background to greyscale

fr_size=size(fr);

width=source.Width;

height=source.Height;

fg=zeros(height,width);%to save the foreground pixels

bg_bw=zeros(height,width);%to update background

 

2.     混合高斯模型预定义

C=3;%number of Gaussian components

M=3;%number of background components

D=2.5;%positive deviation threshold

alpha=0.01;

thresh=0.25;%foreground threshold(0.25 or 0.75 in paper)

sd_init=6;%initial standard deviation(for new components)

w=zeros(height,width,C);%initialize weights array

sd=zeros(height,width,C);%pixel means

sd=zeros(height,width,C);%pixel standard deviations

u_diff=zeros(height,width,C);%difference of each pixel from mean

p=alpha/(1/C);%initial p variable(used to update mean and sd)

rank=zeros(1,C);%rank of components(w/sd)

%----initialize component means and weights----

pixel_depth=8;  %8-bit resolution

pixel_range=2^pixel_depth-1;%pixel range(  of possible values)

 

for i=1:height

    for j=1:width

        for k=1:C

            mean(i,j,k)=rand*pixel_range;  %means random (0-255)

            w(i,j,k)=1/C;%weights uniformly dist

            sd(i,j,k)=sd_init;%initialize to sd_init

        end

    end

end

3.     混合高斯模型的参数更新

  match=0;

        for k=1:C

            if(abs(u_diff(i,j,k))<=D*sd(i,j,k))%pixel matches component

                match=1;

                %update weights,mean,sd,p

                w(i,j,k)=(1-alpha)*w(i,j,k)+alpha;

                p=alpha/w(i,j,k);%p is the updating rate

                mean(i,j,k)=(1-p)*mean(i,j,k)+p*double(fr_bw(i,j));

                sd(i,j,k)=sqrt((1-p)*sd(i,j,k)^2+p*((double(fr_bw(i,j))-mean(i,j,k)))^2);

            else%pixel does not match component

                w(i,j,k)=(1-alpha)*w(i,j,k);%weight slightly decreases

            end

        end

       

        w(i,j,:)=w(i,j,:)./sum(w(i,j,:));%the sum of gaussian models for each pixel

      

 bg_bw(i,j)=0;

        for k=1:C

            bg_bw(i,j)=bg_bw(i,j)+mean(i,j,k)*w(i,j,k);%update background

            if(bg_bw(i,j)>thresh)

                k=k-1;

                M=k;

            end

        end

       

        %if no components match,create new component

        if(match==0)

            [min_w,min_w_index]=min(w(i,j,:));

            mean(i,j,min_w_index)=double(fr_bw(i,j));

            sd(i,j,min_w_index)=sd_init;

        end

 

4.     背景模型的选择和前景提取

rank=w(i,j,:)./sd(i,j,:);%calculate component rank

        rank_ind=[1:1:C];

       

        %sort rank values

        for k=2:C

            for m=1:(k-1)

                if(rank(:,:,k)>rank(:,:,m))

                    %swap max values

                    rank_temp=rank(:,:,m);

                    rank(:,:,m)=rank(:,:,k);

                    rank(:,:,k)=rank_temp;

                   

                    %swap max index values

                    rank_ind_temp=rank_ind(m);

                    rank_ind(m)=rank_ind(k);

                    rank_ind(k)=rank_ind_temp;

                end

            end

        end

       

        %calculate foreground

        match=0;

        k=1;

       

        fg(i,j)=0;

        while((match==0)&&(k<=M))%not match,and current GM<BG

            if(w(i,j,rank_ind(k))>=thresh)

                if(abs(u_diff(i,j,rank_ind(k)))<=D*sd(i,j,rank_ind(k)))

                    fg(i,j)=0;

                    match=1;%background

                else

                    fg(i,j)=255;%otherwise is foreground

                end

            end

            k=k+1;%calculate next GM

            if(k==5)

                k=k-1;

                break;

            end

        end

5.     找到前景图中的连通区域

将前景图转换为二值图像,并利用regionprops函数得到连通区域的信息,将包围盒信息存储到rects数组中。

%find the connected region

    T=graythresh(fg);

    fg_bw=im2bw(fg,T);

    fg_reg=regionprops(fg_bw,'area','boundingbox');

    areas=[fg_reg.Area];

    rects=cat(1,fg_reg.BoundingBox);

6.     显示检测结果并用方框标注

显示当前处理的视频帧原图、背景图和提取出的前景(运动物体),并在原图中用方框标注运动目标,对于上一步中获得的矩形,当宽高超过我们设定的阈值(此处设为2像素值)时,就绘制红色的矩形。

    disp(['当前为第' num2str(n) '帧']);

    figure(1),subplot(3,1,1),imshow(fr);

    %show all the connected regions

    for i=1:size(rects,1)

        if(rects(i,3)>2&&rects(i,4)>2)%show the rect if it is large enough

        rectangle('position',rects(i,:),'EdgeColor','r');

        end

    end

subplot(3,1,2),imshow(uint8(bg_bw));

    subplot(3,1,3),imshow(uint8(fg));

 

运行结果

由于初始化背景时采用随机值,需要经过一定的背景更新之后才能获得较为稳定的背景模型。

先对视频visiontraffic.avi进行运动物体检测。在第28帧时,可以看到背景还不是很清晰,噪点很多:

在第101帧时,背景模型已趋于清晰、稳定,对于画面上方出现的汽车,很好地识别了出来:

至此,验证完成了高斯建模分离前景。接下来进行方框的标注。起初,使用regionprops函数时,没有将前景图转化为二值图像,因此识别出的连通区域为整个画面,并不正确。

后来经过更正,能够正确地标注出运动物体,下图为连续运动物体的标注:

对于多个运动物体也能正确地进行标注:

接下来对singlebal.avi进行测试,小球在中途会消失(被盒子遮挡),画面无运动物体。小球出现时能够立刻标注:

 

小球被遮挡时,画面没有被标注的目标:

小球再次出现,同样能够立刻进行标注:

综上所述,工程能够正确地用方框标注静止背景中的多个运动物体,提取的前景较为干净清晰。由于背景的更新需要大量运算,速度较慢,但基本达到了实时分析视频的要求。

总结

在完成基于混合高斯背景建模技术的运动目标检测的过程中,对于高斯建模的原理有了深入的理解,混合高斯模型是用3到5个高斯模型来表征图像中各个点的特征,不断更新、匹配,进行前景的判断的。在反复研读并进行一定的简化之后,顺利用matlab代码实现了这一过程。在尝试用方框标注出检测到的运动目标时遇到了一定的困难,采取了多种方式,最后使用了较为便捷的regionprops函数,将所有连通区域(前景运动目标)的包围盒用红色矩形标注了起来。运动目标的检测有着多种方式,除了混合高斯背景建模以外,还有背景减除法、统计平均法、时间差分法、光流法等,其中,光流法适用于镜头运动的视频。在这个课程设计当中只对固定背景的视频进行了运动目标的检测,实际上混合高斯模型同样适用于运动背景的视频。


附资源链接:点击打开链接

  • 4
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值