运动区域检测方法(一)——帧间差分法的简单实现

帧间差分法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。实现起来也较简单,关键是对差分后的图像进行二值化时需要选取适当的阈值shresold,我在这里取的是通过多次尝试得到的经验值,以下是相应的matlab代码和结果:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%帧间差分法
clear all;
clc;
avi=MMREADER('I:\\电影\\test.avi');                           %使用MMREADER方法读入视频流,抛弃aviread方法
VidFrames=read(avi,[10000,10050]);
N=4;                                             %考虑N帧的帧间差分法
start=10;                                        %起始帧
threshold=3;
for k=1+start:N+1+start                                              
    mov(k).cdata=rgb2gray(VidFrames(:,:,:,k));      %将彩色图像转换为灰度图像;
end
  [row,col]=size(mov(1+start).cdata);            %以mov(1+start).cdata的格式生成一个矩阵

  alldiff=zeros(row,col,N);                       %生成一个三维的矩阵alldiff用于存储最终的各个帧的差分结果        

for k=1+start:N+start
  diff=abs(mov(k).cdata-mov(k+1).cdata);           %邻帧差分
  idiff=diff<threshold;                           %二值化,idiff中的数据位逻辑值,diff中的数值为unit8
  alldiff(:,:,k)=double(idiff);           
end

%观察结果
i=1;
for k=1+start:N+start
    figure(i);
    imshow(alldiff(:,:,k))
    title(strcat(num2str(k),'帧','-',num2str(k+1),'帧'));
    i=i+1;
end

原视频截图

运行算法后效果图1

运行算法后效果图2

由输出的结果可看出,只能得到运动区域的大致轮廓,这也正是帧间差分法的缺点,百度百科上是这么论述帧间差分法的缺点的——能提取出对象的完整区域,只能提取出边界;同时依赖于选择的帧间时间间隔。对快速运动的物体,需要选择较小的时间间隔,如果选择不合适,当物体在前后两帧中没有重叠时,会被检测为两个分开的物体:而对慢速运动的物体,应该选择较大的时间差,如果时间选择不适当,当物体在前后两帧中几乎完全重叠时,则检测不到物体。

而且从两张输出的效果图可以看到,图片中存在明显的“干扰点”,可以设想若是处理的视频帧中刚好有多个运动中的但体积不大的区域,“干扰点”的影响会更大。

总结:帧间差分法实现简单,但是效果一般。


版权声明:本文为xingor原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。