运动分析1 背景差法(单高斯模型)

运动分析1 背景差法

标签(空格分隔): 未分类


  • 运动检测:将运动前景和背景分离。
  • 两种思路:直接利用前景 vs 先得到背景,前景 = 输入 - 背景
  • 常用的运动检测方法:背景差法、光流、帧间差分、前景建模。

##背景差法(background subtraction)
原理:|当前图像-背景图像| < 阈值T,背景;|当前图像-背景图像| >= 阈值T,前景。
若已知背景(若干背景逐点均值),假设背景在图像序列中总是最经常被观测到。
###单高斯模型
背景模型:每个像素用一个高斯分布描述其在不同时刻的灰度分布
运动目标检测_单高斯模型

背景模型主要有单模态多模态两种,前者在每个背景像素上的灰度分布比较集中,可以用单分布概率模型来描述,后者的分布则比较分散,需要多分布概率模型来共同描述。在许多应用场景,如水面的波纹、摇摆的树枝、飘扬的旗帜、监视器屏幕等,像素值都呈现出多模态特性。最常用的描述场景背景像素灰度分布的概率密度函数是高斯分布。

  • 背景图像的每一个像素满足高斯分布, B ( x , y ) − − N ( u , σ ) B(x,y)--N(u,\sigma) B(x,y)N(u,σ), p ( x ) = 1 2 π e − ( x − u ) 2 2 σ 2 p(x)=\frac{1}{\sqrt{2\pi}}e^{-\frac{(x-u)^2}{2 \sigma^2}} p(x)=2π 1e2σ2(xu)2每一个点(x,y)都包含均值u和方差 σ \sigma σ

  • 计算一段时间内的视频序列中每个点的均值u和方差 σ \sigma σ,作为背景模型。

  • 对于一幅包含前景的任意图像G,对于图像上的每一个点(x,y)计算,若|G(x,y) - B(x,y)| < T,则认为是背景,否则认为是前景。

  • 背景的更新:每一帧图像都参与背景的更新。 B t ( x , y ) = p B t − 1 ( x , y ) + ( 1 − p ) G t ( x , y ) B_t(x,y) = pB_{t-1}(x,y)+(1-p)G_t(x,y) Bt(x,y)=pBt1(x,y)+(1p)Gt(x,y)
    其中,p为一个常数,用来反映背景更新率,p越大,背景更新的越慢。一般情况下,背景更新后 σ \sigma σ的变化很小,所以在更新背景以后一般不再更新 σ \sigma σ

  • 总结:(1)不适合背景有抖动的场景;(2)运动模糊存在时,前景有移动。
clear, close;
addpath('include_func')
fileName = 'input.avi';   

%读取视频帧
Video = VideoReader(fileName);  
nframes = Video.NumberOfFrames;  %帧数
Height = Video.Height;
Width = Video.Width;
%播放视频
figure(1);show_video(fileName);
%0. 参数
lambda = 2.5;%判断背景与前景的阈值
alpha = 0.5;%背景更新率,alpha太大,背景更新的慢。【0,1】
%1. 初始化
u = double(rgb2gray(read(Video,1)));%3通道,背景初值 = 第一帧
std = 20;
b_sigma = std*ones(size(u));%背景标准差
b_var = std^2*ones(size(u));%背景方差

%2. 背景更新
for i = 1:nframes
    fore =  zeros(size(u));%前景
    G = double(rgb2gray(read(Video,i)));%读取第i帧
    
    %2.1 若|G-U|>=当前std,则为前景;反之,为背景
    fore = (abs(G - u) >= lambda * b_sigma);%前景 = 当前图像 - 背景
    fore = uint8(255*fore);
    %2.2 否则,背景
    u = (1 - alpha)*u+ alpha*G;%u_t =(1-alpha)* u_t-1 + alpha*G_t
    b_var = (1 - alpha) * b_var + alpha * (G - u).^2;
    b_sigma = sqrt(b_var);
    
    figure(1);imshow(u,[]),title(['第',num2str(i),'帧背景']);
    figure(2);imshow(fore,[]),title(['第',num2str(i),'帧前景']);
    disk = strel('disk',1); 
    figure(3);imshow(imdilate(imerode(fore,disk),disk),[]),title(['第',num2str(i),'帧前景 先腐蚀再膨胀']);
    
    %将每帧前景存为*.jpg
    imwrite(uint8(fore*255),['./result/', int2str(i),'.jpg']);
end
img2avi( './result/','result.avi');
figure(1);show_video('result.avi');


%include_func的中有两个函数:
function img2avi(DIR, dstFilename)
%将所有单帧图片转换为视频,视频在图像所在文件夹
%  dstFilename = 'highway_gray.avi'
%DIR='E:\MatlabCode\View2mat\highway\';        %图片所在文件夹
file=dir(strcat(DIR,'*.jpg'));                %读取所有jpg文件
filenum=size(file,1);                         %图片总数
obj_gray = VideoWriter(dstFilename); 
%obj_gray = VideoWriter('highway_gray.avi');   %所转换成的视频名称
writerFrames = filenum;                       %视频帧数

%将单张图片存在avi文件
open(obj_gray);
for k = 1: writerFrames
    fname = strcat(DIR, num2str(k), '.jpg');
    frame = imread(fname);
    writeVideo(obj_gray, frame);
end
close(obj_gray);

end
function [ output_args ] = show_video( filename )
% 功能:给定视频名称,播放相应视频
% filename视频的名字, filename = 'input.avi'
%   此处显示详细说明
%视频播放
video=VideoReader(filename);     %读取视频文件
vidFrames = read(video);                   % 读取视频中所有数据
numFrames = get(video, 'numberOfFrames');  %获得视频帧的帧数

%从视频帧数据中创建一个MATLAB视频播放结构体
  for k = 1 : numFrames
         mov(k).cdata = vidFrames(:,:,:,k);
         mov(k).colormap = [];
  end   
  hf=figure;                               %创建图像
  %基于视频的宽度和高度重建图片
  set(hf, 'position', [150 150 video.Width video.Height])
  %按照视频帧速率重播视频
  movie(hf, mov, 1, video.FrameRate);

end


这里写图片描述
对微小的变化很敏感,对光照变化敏感。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值