运动目标分割

说明

主要为帧差法背景差法对于提取运动目标的实现以及分析。

实验内容

  1. 利用MATLAB读取图像的基本命令imread和读取视频的基本命令aviread或mmreader;
  2. 调用各种运动目标检测函数进行运动目标分割;
  3. 利用MATLAB形态学算子调整分割结果;
  4. 了解形态学滤波中结构元strel命令的调用格式,通过改变结构元形状和大小,比较运动目标检测效果。

实验步骤

帧差法

tic;
clear all
mov = VideoReader('raw.avi');  %读取视频
x = read(mov,2);                  %把第二帧赋给x
fr_size = size(x);               %帧大小
width = fr_size(2);
height = fr_size(1);
c =zeros(height, width);        %生成height*width大小的0矩阵
for k=1:mov.NumberOfFrames-2   %遍历每一帧
    x = read(mov,k);
    y = read(mov,k+2);         %n帧差分。空洞:运动太慢。重影:运动太快。
    m = rgb2gray(x);
    n = rgb2gray(y);
    q=im2double(n);
    w=im2double(m);
    c = q-w ;
    t=50;                          %阈值
    t=t/255;                      %转化为double型数据
    id = c > t;
    cc =zeros(fr_size);
    cc(id) = 1;
    subplot(2,2,1),imshow(m),title('当前帧'),
    subplot(2,2,2),imshow(n),title('后一帧'),
    subplot(2,2,3),imshow(c),title('两帧相减'),
    subplot(2,2,4),imshow(cc),title('阈值后');
    %Mov1(k) = im2frame(uint8(cc),gray); % put frames into movie
    %imwrite(cc,['zcf',sprintf('%04d',mov.NumberOfFrames),'.jpg']);
end
  • 算法分析
    帧差法是基于运动图像序列中相邻帧图像具有较强的相关性而提出的检测方法,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。
    如果物体灰度分布均匀,这种方法会造成目标重叠部分形成较大孔洞,严重时造成目标分割不连通,从而检测不到目标。目标运动太慢时会产生孔洞,而运动太快则会出现重影。两帧差分法适用于目标较为缓慢的场景。
    该方法的优点是算法实现简单,运行速度快,环境自适应性强,对场景光线变化不敏感;缺点是会产生孔洞现象与重影现象,不能提取出运动对象的完整区域,仅能提取轮廓,算法效果严重依赖所选取的帧间时间间隔和分割阈值。

背景差法

背景差法的原理是将当前帧与背景图像进行差分来得到运动目标区域。通过不含运动的的帧来获取背景图像。常用的背景构建方法有时间平均法、单高斯法、混合高斯法等。以下为简单的背景差法流程图:
在这里插入图片描述
背景差法计算量小,但受光线、天气等外界条件影响较大。

时间平均法

clear all;
N = 40;                      % N帧用于训练高斯模型,构造背景图像
h = fspecial('gaussian');
imagedata = filter2(h,rgb2gray(imread('rawpic/raw0001.jpg'))); 
mu = imagedata;
[m,n] = size(mu);
pro = zeros(m,n);
for i=1:N                                                     
    filename = sprintf('rawpic/raw%04d.jpg',i);      
    tmp =filter2(h,rgb2gray(imread(filename)));
    mu = mu+tmp;
end;
mu=mu./N;
imwrite(uint8(mu),'sjpj.jpg');
%figure(1),imshow(uint8(mu));
for num = N+1:500                              % 测试
    filename = sprintf('rawpic/raw%04d.jpg',num);
    imagedata = filter2(h,rgb2gray(imread(filename)));
    t=50;                                         % 阈值,可调节
    pro = abs(imagedata-mu)> t;
    imshow(pro),title(sprintf('frame number %d',floor(num)));
    mu = (mu*(num-1) +imagedata)/num; 
    %imwrite(pro,['sjpj',sprintf('%04d',num),'.jpg']);
    %Mov1(num-N) = im2frame(uint8(255*pro),gray); % put frames into movie
end;
  • 算法分析
    在本次实验中,时间平均法将视频的前40帧图像用来构建背景,累加后除以总帧数得到背景图像帧。40帧以后的图像逐一与背景图像帧做差,大于阈值则识别为运动目标。同时,随后续帧的处理更新均值。时间平均法算法简单,速度快,对环境光照变化和动态背景变化比较敏感。

单高斯法

clear all;
N = 40;
h = fspecial('gaussian');
imagedata = filter2(h,rgb2gray(imread('rawpic/raw0001.jpg')));
mu = imagedata;
[m,n] = size(mu);
cov = zeros(m,n);
pro = zeros(m,n);
sav_mu = mu;
a = 0.01;
for i=1:N
    filename = sprintf('rawpic/raw%04d.jpg',i); 
    tmp =filter2(h,rgb2gray(imread(filename)));
    mu = (tmp+(i-1)*sav_mu)./i;
    cov = ((tmp-mu).^2+(i-1)*cov)./(i)+(mu-sav_mu).^2;
    sav_mu = mu;
end;
cov = cov+0.001;                         %防止cov为0
imwrite(uint8(mu),'sjpj.jpg');
 
for num = N+1:500
    filename = sprintf('rawpic/raw%04d.jpg',num);
    imagedata = double(filter2(h,rgb2gray(imread(filename))));
    T=1e-4;                                % 阈值,可调节
    pro = (2*pi)^(-1/2)*exp(-0.5*(imagedata-mu).^2./cov)./sqrt(cov)< T;
%% update covariance and mean
mu = mu +a*(1-pro).*(imagedata-mu); 
cov = cov + a*(1-pro).*((imagedata-mu).^2-cov);
%D1=medfilt2(pro,[5,5]);
%K=filter2(fspecial('average',3),pro)/255;
%se=strel('disk',1); %
%A=imdilate(D1,se); 
%fc=imopen(pro,se);
%B = imfill(fc, 'holes');
imshow(mat2gray(pro)),title(sprintf('frame number %d',floor(num)));
%imwrite(pro,['sjpj',sprintf('%04d',num),'.jpg']);
pause(0.000001);
end;
  • 算法分析
    单高斯模型适用于背景单一不变的场合,混合高斯模型等方法是对单高斯模型的扩展,但单高斯模型最为简便,而且采取参数迭代方式,不需要每次都进行建模。
    单高斯模型将图像中每一个像素点的灰度值看成是一个随机过程X,并假设该点的某一像素灰度值出现的概率服从高斯分布,用数学形式表示为:
    在这里插入图片描述
    式中,σ²为代码中的cov,x为代码中imagedata,μ为代码中的mu。与(2*pi)^(-1/2) exp(-0.5(imagedata-mu).^2./cov)./sqrt(cov)对应,此数值小于阈值T则为运动目标。随帧的处理更新方差和均值,式中a称为更新参数,一般情况下,不更新。

实验结果

  • 帧差法
    在这里插入图片描述
  • 时间平均法
    在这里插入图片描述
  • 单高斯法
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42037746/article/details/92389721