概述
运动分析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{2pi}}e^{-frac{(x-u)^2}{2 sigma^2}} p(x)=2π1e−2σ2(x−u)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)=pBt−1(x,y)+(1−p)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:MatlabCodeView2mathighway'; %图片所在文件夹
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
对微小的变化很敏感,对光照变化敏感。
最后
以上就是结实烧鹅为你收集整理的运动分析1 背景差法(单高斯模型)运动分析1 背景差法的全部内容,希望文章能够帮你解决运动分析1 背景差法(单高斯模型)运动分析1 背景差法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复