目录
一、理论基础
基于背景差分法和三帧差分法是常见的目标检测方法,它们在视频图像中用于检测运动目标,特别是在静态背景下运动的目标。
1. 基于背景差分法:
基于背景差分法是一种简单但有效的目标检测方法,适用于背景相对静态、目标相对运动的场景。基本思想是将当前帧图像与背景模型进行差分,从而获得目标运动的像素。
原理:
-
背景建模:通过一段时间内的图像帧,建立背景模型,可以使用简单的平均值或高斯模型。
-
差分运算:将当前帧图像与背景模型进行逐像素差分运算。差分图像中的高像素值表示可能是目标。
-
阈值判决:对差分图像进行阈值化处理,将高于阈值的像素标记为目标像素。
2. 三帧差分法:
三帧差分法是基于背景差分法的扩展,它引入了更多的帧来消除瞬时噪声和误检测。
基于背景减除法的目标检测算法,其主要通过通过设置和背景图像的像素比较相似的背景参数模型,接着将当前帧以及背景图差分开来,从而获得运动物体的运动区域。 基于背景减除法的目标检测算法,首选选择视频的第一帧作为初始背景,
通过MATLAB仿真,可以获得如下的背景更新仿真结果。
从图4.2的仿真结果可知,当参数a较小的时候,可以获得较为清晰的背景更新效果,而当较大的时候,背景中存在明显的目标残影,通过仿真测试,设置参数的值为0.0002。
基于帧间差分的目标检测仿真算法,三帧间使用以像素为基础的时间差分利用闭值化来获取图像中的运动范围。三帧差法,其主要通过相邻三帧划分成一组之后开始差分,如下公式所示,可以高效的获取出中间帧运动物体的形状。
通过MATLAB仿真,可以获得如下的仿真结果:
从仿真结果克制,对于体积比较大、色彩一样的运动物体,或许会在在物体内部产生空洞,让运动物体缺失。而且移动目标目标的外型在运动方向上被拉伸,让获得的图像的面积大于真实目标的面积。在两帧图像相继出现的时间段内,假如物体的运动速度非常快,导致原来被隐藏的背景表露出来,就会形成“鬼影”。从外,获得的目标中仍然存在较多的干扰噪声,因此,需要对检测结果进行形体学处理,最终获得如下的仿真结果:
从上述两个章节的仿真结果可追,背景差分法在使用的时候,比较难获取绝对静止的背景,并且假如目标长久的不移动位置,或者背景中的物体离开,会导致误检。而三帧差分法获得的运动目标大于实际物体,当物体移动缓慢,相邻两帧间之间会产生空洞、漏检的情况,导致获得的目标信息不正确的后果。结合背景差分法和三帧差分法的目标检测方法,这里对本文所提出的改进算法进行matlab仿真,通过如下的公式实现目标检测。
二、核心程序
%下面几行分别为清理指令窗口,清理内存,关闭现有图像,忽略警告,调用函数库
clc;
clear;
close all;
warning off;
addpath 'func\'
%下面的语句为读取视频时间较长,将读取后的视频保存到mat文件中,进行快速读取
SEL = 0;
if SEL == 1
[pixel_rgb,pixel_gray,frameNum] = get_AVI('vedio\02.avi');
save v1.mat pixel_rgb pixel_gray frameNum
else
load v1.mat
end
%参数alpha取值
alpha = 0.00002;
%迭代次数
maxer = 170;
%你那个算法中三个门限值。
T1 = 15;
T2 = 70;
T3 = 10;
%初始背景
B0 = pixel_gray(:,:,1);
%初始背景大小
[r,c] = size(B0);
%背景更新初始化
B = zeros(r,c,maxer);
%背景更新第一帧为B0
B(:,:,1) = B0;
%开始迭代
for i = 3:140
i
%背景提取
tmps = double(abs(pixel_gray(:,:,i) - pixel_gray(:,:,i-1)));
%和门限T1进行对比
d = zeros(r,c);
[x0,y0]= find(tmps >= T1);%得到大于T1的区域
[x1,y1]= find(tmps < T1);%小于门限T1的区域
%对于大于T1的部分,赋值为1,且背景不变
for m = 1:length(x0)
d(x0(m),y0(m)) = 1;
B(x0(m),y0(m),i) = B(x0(m),y0(m),i-1);
end
%对于小于T1的部分,赋值为0,且背景根据公式进行更新
for m = 1:length(x1)
d(x1(m),y1(m)) = 0;
B(x1(m),y1(m),i) = alpha*double(pixel_gray(x1(m),y1(m),i)) + (1-alpha)*B(x1(m),y1(m),i-1);
end
%背景减除获取运动目标
tmps2 = double(abs(double(pixel_gray(:,:,i)) - B(:,:,i)));
%背景减除获取运动目标和门限T2进行对比
d2 = zeros(r,c);
[x02,y02]= find(tmps2 >= T2);%得到大于T2的区域
[x12,y12]= find(tmps2 < T2);%小于门限T2的区域
%对于大于T2的部分,赋值为1
for m = 1:length(x02)
d2(x02(m),y02(m)) = 0;
end
%对于小于T2的部分,赋值为0
for m = 1:length(x12)
d2(x12(m),y12(m)) = 1;
end
%心态学处理,删除噪声,填充目标区域中的一些小的空洞
d2 = bwareaopen(d2,300);
se = strel('disk',2);
d2 = imdilate(d2,se);
d2 = imfill(d2,'holes');
%三帧差分获取目标
tmps3_1 = abs(double(pixel_gray(:,:,i)) - double(pixel_gray(:,:,i-1)));
tmps3_2 = abs(double(pixel_gray(:,:,i+1)) - double(pixel_gray(:,:,i)));
d3_1 = zeros(r,c);
d3_2 = zeros(r,c);
%三帧差分获取目标和门限T3进行对比
[x03,y03]= find(tmps3_1 >= T3);
[x13,y13]= find(tmps3_1 < T3);
%对于大于T3的部分,赋值为1
for m = 1:length(x03)
d3_1(x03(m),y03(m)) = 1;
end
%对于小于T3的部分,赋值为0
for m = 1:length(x13)
d3_1(x13(m),y13(m)) = 0;
end
%三帧差分获取目标和门限T3进行对比
[x04,y04]= find(tmps3_2 >= T3);
[x14,y14]= find(tmps3_2 < T3);
%对于大于T3的部分,赋值为1
for m = 1:length(x04)
d3_2(x04(m),y04(m)) = 1;
end
%对于小于T3的部分,赋值为0
for m = 1:length(x14)
d3_2(x14(m),y14(m)) = 0;
end
[x15,y15] = find(d3_1 == 1);
BD = zeros(r,c);
for m = 1:length(x15)
BD(x15(m),y15(m)) = 1;
end
clear x15 y15
[x15,y15] = find(d3_2 == 1);
for m = 1:length(x15)
BD(x15(m),y15(m)) = 1;
end
%形态学滤波
BD = bwareaopen(BD,200);
BD = imfill(BD,'holes');
%运动目标检测
[x16,y16] = find(d2 == 1);
[x17,y17] = find(BD == 1);
Cf = zeros(r,c);
for m = 1:length(x16)
Cf(x16(m),y16(m)) = 1;
end
for m = 1:length(x17)
Cf(x17(m),y17(m)) = 1;
end
SE1 = strel('ball',10,10);
Cf = imerode(Cf,SE1,'same');
%跟踪显示
Cf2 = func_track(pixel_rgb(:,:,:,i),Cf);
%下面的语句是显示上述各个步骤的图像处理效果
figure(1);
subplot(231);
imshow(pixel_gray(:,:,i));title('原图');
subplot(232);
imshow(B(:,:,i),[]);title('背景提取');
subplot(233);
imshow(d2,[]);title('背景差获取运动目标');
subplot(234);
imshow(BD,[]);title('三帧差分获取目标');
subplot(235);
imshow(Cf,[]);title('最终提取效果');
subplot(236);
imshow(Cf2,[]);title('最终目标跟踪效果');
drawnow;
%内存清理
clear x0 y0 x1 y1 x02 y02 x12 y12 x03 y03 x13 y13 x04 y04 x14 y14 x15 y15 x16 y16 x17 y17
A10-33
三、仿真结论
从图的仿真结果可知,改进算法可以获得较为清晰的目标检测效果,整个检测结果,不存在目标空洞,也不存在噪声干扰,此外,对于区域面积较小的脚部区域也获得了完整的检测效果。最后,根据图的检测结果进行目标的跟踪,这个部分的仿真结果如图所示。将三种算法进行性能对比,分别从仿真时间,仿真性能两个方面进行对比。
三种算法的仿真时间分别为0.213秒,0.153秒, 0.414秒。从仿真结果可知,三帧差法由于其算法结构较为简单,因此仿真时间最短,而本文所提出的改进算法,同时结合了背景差法和三帧差分法,因此其仿真时间最长,但是其仿真效果最好。
通过上面的仿真结果可知:
优势:
- 简单:这两种方法都相对简单,容易实现。
- 适应性强:适用于相对静态背景下的运动目标检测,如监控摄像头等场景。
- 实时性:计算开销较小,适用于实时应用。
难点和局限性:
- 阈值选择:阈值的选择对于减少误报和漏报很关键,但往往需要根据具体场景进行调整。
- 动态背景:当背景发生变化时,这些方法可能会导致误检测。
- 部分遮挡:当目标被部分遮挡时,这些方法可能无法准确检测。
总的来说,基于背景差分法和三帧差分法是一些简单但实用的目标检测方法,尤其适用于静态背景下的运动目标检测。在实际应用中,可以根据具体情况选择合适的方法,并进行参数调优以获得更好的检测结果。