第二章单高斯模型.docx

上传人:b****5 文档编号:28890554 上传时间:2023-07-20 格式:DOCX 页数:25 大小:206.86KB
下载 相关 举报
第二章单高斯模型.docx_第1页
第1页 / 共25页
第二章单高斯模型.docx_第2页
第2页 / 共25页
第二章单高斯模型.docx_第3页
第3页 / 共25页
第二章单高斯模型.docx_第4页
第4页 / 共25页
第二章单高斯模型.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

第二章单高斯模型.docx

《第二章单高斯模型.docx》由会员分享,可在线阅读,更多相关《第二章单高斯模型.docx(25页珍藏版)》请在冰豆网上搜索。

第二章单高斯模型.docx

第二章单高斯模型

评阅成绩

NorthwesternPolytechnicalUniversity

 

计算机学院专业实习报告

 

专业名称

计算机科学与技术

实习题目

基于多摄像机协同的运动对象分割与三维重建系统之---

背景建模与运动前景分割

姓名

宋雪梅

班级

10010801

学号

2008302420

实习时间

2011/6/27-2011/7/8

指导教师

杨涛

 

2011年7月8日

 

摘要

前景检测是目标跟踪、分类、识别、行为理解等后继处理的基础。

目前,主流的前景检测算法采用背景建模的思路,通过分析输入图像和估计背景的差异,提取变化的前景区域。

由于对目标类型、观测角度、距离等因素不敏感,该类算法在很多监控场合得到广泛应用。

本文通过对传统的单高斯模型进行改进,有效的解决了使用传统单高斯模型造成的阴影问题。

对背景的更新率提出了一种新的方案,使得单高斯模型能迅速收敛。

将基于色度畸变与一阶梯度信息的阴影消除方法结合起来,能够较好的消除阴影,使得运动目标轮廓更为精确,清晰。

实验结果表明,在背景较为稳定的环境中,基于单高斯的运动目标检测方法能够很好很迅速的检测出运动目标,相比混合高斯模型,其时间复杂度和空间复杂度都具有优越性。

 

关键词:

单高斯模型,背景建模,前景检测,阴影消除

 

第一章项目简介

1.1总体介绍

第一步:

构建摄像机内外参数标定子系统

采用经典的摄像机标定方法和摄像机自标定方法分别进行多个摄像机的标定,获取各个摄像机的内参和外参,从而建立图像像素坐标与世界坐标的映射关系,这是之后进行三维重建的基础。

第二步:

构建背景建模与运动前景分割子系统

通过分析输入图像和估计背景的差异,提取变化的前景区域。

对原始拍摄的视频数据进行前景提取,输入为彩色图像序列,输出为二值化的前景分割结果,即为剪影。

第三步:

构建三维重建与显示子系统

根据前景分割的结果,利用三维重建可获得目标的三维信息,目前基于多视点环境的快速三维重建方法主要以Shape-From-Silhouette(SFS)算法为基础。

原理如下:

由于剪影是待重建物体在图像平面上的投影,因而物体应该完全落在从多个视点的剪影反投影形成的空间区域的交集中,这种根据剪影获取反投影交集的方法便是SFS,如果相机的数目足够多,并且合理布局以便覆盖广泛的视角,那么SFS方法获得的交集将是真实目标三维形状的良好近似。

此模块要求组员利用前景分割的结果进行三维重建,并根据原始图像对重建的点云上色,最终完成三维重建结果的可视化显示。

本文进行第二个模块即背景建模与运动前景分割子系统的论述。

1.2本文研究内容

近年来,随着硬件设备成本大大降低,智能视频监控系统得到了日益广泛的研究与应用,智能视频监控技术也得到了越来越多的关注。

运动检测技术是智能视频监控技术中的核心部分,通常用光流法,时间差分法和背景差分法进行运动目标检测。

光流法利用运动目标随时间变化的光流特性进行运动检测,但其抗燥性能差,且计算非常复杂,很难满足视频监控系统实时性的要求。

时间差分法又称帧差分法,它通过对相邻帧对应像素的差分来提取图像中的运动区域,能够很好的适应光照的变化,对背景的变化也有很好的自适应性。

但用时间差分法提取出的运动区域往往会有较大的噪声,且对于运动缓慢的目标很难检测出来。

背景差分法通过将输入的每一帧视频帧和通过训练得到的背景图像进行差分来检测运动目标。

考虑到背景不可能完全固定,一个好的背景模型应该能够反映出背景随时间的推移发生的变化。

因此背景模型应该能够反映出背景随时间的推移发生的变化。

因此,背景差分法的关键不在于差分,而在于背景模型的建立与更新。

常用的背景建模方法有单高斯模型法和混合高斯模型法。

与混合高斯模型法相比,单高斯模型法的时间效率更高。

在室内以及背景较为稳定的环境下,单高斯模型法可以很好的检测出运动目标。

本文对传统的单高斯模型进行了一些改进,在背景的更新策略方面做了一些改进。

在更新率的选取方面提出了一种搞笑的方法,使得高斯模型具有更好的收敛性。

在阴影抑制方面,将基于色度畸变和一阶梯度信息的阴影消除方法相结合,取得了较好的效果。

第二章单高斯模型

2.1单高斯模型的理论基础

高斯模型法来源于高斯分布,其基本原理为:

视频图像由于受到外界因素的影响,各个像素点的像素值随时间的推移会有一些变化,这个变化近似于高斯分布。

当有物体经过时,像素值的变化就会很大,物体出现时对应的像素点的像素值不服从高斯分布。

利用某一时刻某像素点的像素值是否满足高斯分布可以判断该点是背景点还是前景点。

2.1.1背景建模

单高斯分布背景模型适用于单模态背景情形,以下是利用单高斯分布背景模型进行运动检测的过程:

首先,对一段时间内的视频序列图像进行训练,从而建立每个像素点的颜色分布初始高斯模型

假设这段时间内共N帧图像。

则有:

此后,为输入一帧图像的每个像素点建立高斯模型

其中,下标t表示帧序号,

为像素点的当前像素值,

为当前像素点高斯模型的均值,

为当前像素点高斯模型的均方差。

(T为阈值),则该点判定为前景点,否则为背景点(这时又称

相匹配)。

在实际应用中,可以用等价阈值替代概率阈值。

,在常见的一维情形中,则常根据

的取值设置前景检测阈值:

>T(T需根据实验选取),则该点被判定为前景点,否则为背景点。

用公式表示为:

2.1.2背景更新

背景不可能是完全固定的,随着时间的推移会发生一些变化。

一个好的北京模型应该能够反映出背景的这些变化,否则会做出错误的检测。

因此,需要对背景模型进行实时更新。

与以往的方法不同的是,这里的更新为100%更新,即每读入一帧,判断是否前景,若为前景则标记,若不是前景则判断是否和背景匹配,若匹配则进行更新,否则不予置理。

2.1.3本文对传统单高斯进行的改进

1.与对像素的灰度值建立高斯分布不同的是,本文对一个像素点的R,G,B三通道分别建立高斯分布,这样做的意义是:

采用三通道,将目标与背景分割出来的几率更大。

2.对更新率的设置:

更新率为100%。

即:

每读入一帧图片,判断相应像素是否为背景点,若是,则对背景更新,若不是则直接标记为前景点。

3.鉴于该项目所使用的背景单一,变化甚微,判断前景与否的阈值选取采用统计实验数据,观察结果的方法,试探性的选取分割阈值。

2.2单高斯算法流程图

2.2.1背景建模

2.2.2前景提取

第三章阴影消除

3.1阴影消除

背景差分法的缺陷是阴影点常常被误检为运动点,从而严重干扰了运动目标的分割与提取。

由于阴影具有与运动目标相同的运动特征,阴影消除成为运动目标检测与提取的难点。

CUCCHIARA等提出了一种在HSV颜色空间内去除阴影的方法[8],JIANG等采用基于阴影强度与几何特征的三步阴影检测算法剪除阴影[9],KUMAR等提出基于不同彩色空间检测前景物体及其阴影的方法[10]。

本文将基于YUV颜色空间色度畸变和一阶梯度模型的阴影检测算法结合起来消除阴影,取得了较好效果。

3.1.1基于YUV颜色空间色度畸变的阴影检测方法

YUV是被欧洲电视系统所采用的一种颜色编码方法,其中Y表示亮度,UV代表色差,U和V是构成彩色的两个分量。

YUV颜色空间的一个重要特性是其亮度信号Y和色度信号U、V相分离。

这一特性可以很好地应用于阴影的检测与消除。

应用式(12)可以很容易地将图像从RGB颜色空间转换到YUV颜色空间。

基于YUV颜色空间色度畸变的阴影检测方法的原理是:

阴影区域和它所对应的背景区域的亮度会有较大变化,但其色度几乎保持不变或有微小的变化。

这样,根据当前帧中某像素点和它所对应的背景中的像素点的色度变化大小就可以检测出该像素点是否属于阴影点。

基于YUV颜色空间色度畸变的阴影检测方法的步骤为:

(1)应用式(12)将当前帧图像x从RGB颜色空间转换到YUV颜色空间,记

Ix=(Yx,Ux,Vx);

(2)应用式(12)将背景图像b从RGB颜色空间转换到YUV颜色空间,记Ib=(Yb,Ub,Vb);

(3)分别计算Ix和Ib在UV平面上的投影,分别记为Ix′和Ib′;

(4)利用式(13)计算向量OIx′和OIb′之间的夹角余弦cosθ;

参考文献[11]求出角度再与阈值进行比较,使用了反余弦函数。

本文根据两向量之间的夹角θ∈[0,180],且θ的余弦值在该区间内单调递减这一性质,仅需求出两向量夹角余弦,然后与设定的阈值T进行比较,简化了运算。

3.1.2基于一阶梯度模型的阴影检测方法

当目标和阴影的颜色差别明显时,基于YUV颜色空间色度畸变的阴影检测方法能够很好地分离目标和阴影。

但当目标和阴影的颜色几乎相同时,基于YUV颜色空间色度畸变的阴影检测方法就不再有效了[12]。

此时,利用图像的一阶梯度信息可以有效地区分出阴影和目标区域。

基于一阶梯度模型的阴影检测方法过程如下:

(1)采用Sobel算子计算背景图像中的每一个像素点在x、y方向的梯度,分别记为bxi和byi(i=R,G,B);

(2)计算背景图像的像素值均方差δi(i=R,G,B)。

(3)采用Sobel算子计算当前帧图像中的每一个像素点在x、y方向的梯度,分别记为ix和iy(i=R,G,B)。

(4)利用式(15)判断像素点是否属于阴影点。

基于YUV颜色空间色度畸变的阴影检测方法和基于一阶梯度模型的阴影检测方法有它们各自的适用范围,将二者结合起来使得算法具有更好的适应性。

如果某点同时满足式(14)、式(15)中的第一个条件,则判定该点为阴影点,否则为目标点。

(在生产实习期间上述阴影算法只是做了些了解,由于时间原因没有实现。

3.2简单的阴影消除法

由于阴影的灰度值相对低,可以通过控制改变阈值,使得阴影得到部分消减。

pixel=cvGet2D(pRGBImg,j,k);

t1=(pixel.val[0]-MeanB[j][k])>0?

(pixel.val[0]-MeanB[j][k]):

(MeanB[j][k]-pixel.val[0]);

t2=(pixel.val[1]-MeanG[j][k])>0?

(pixel.val[1]-MeanG[j][k]):

(MeanG[j][k]-pixel.val[1]);t3=(pixel.val[2]-MeanR[j][k])>0?

(pixel.val[2]-MeanR[j][k]):

(MeanR[j][k]-pixel.val[2]);

if(t1>25||t2>25)

{

pixel.val[0]=255;

cvSet2D(Outlook,j,k,pixel);

}

本文中,阈值的选择是基于对实验结果统计得出并不断试探取的局部范围内最佳值。

据统计,对于此项目的背景而言,t1,t2的值局限在10以内,所以阈值可取20—30之前,取值太大,会使前景的像素点减少。

阈值设为25与20效果会有很大的不同。

阈值设为20.

阈值设为25:

以上方法的正确性有待考证,但是对于本次实验效果还是比较有说服力。

阈值设置错误会导致结果出错:

第四章实验结果与评价分析

4.1实验结果

4.1.1闭运算去噪

效果图:

孔洞明显,效果不好

4.1.2开运算去噪

效果图:

对较大的噪声起增强作用,效果欠佳

4.1.3采用中值滤波

对于8个图像序列,每个序列404帧运行时间为:

326s

由此可见单高斯运行速率非常高,其占用的存储空间也很低,在算法实现中,六个数组来存储RGB三通道的均值和方差,设为全局变量,其次在背景建模时申请一个IplImage*pRGBImg来存储每次读入的图像;在前景提取中申请两个IplImage变量,pRGBImg,Outlook,可见单高斯模型的实现空间复杂度很低。

由此可见其时间,空间效率优于混合高斯模型,更加满足实时性的要求。

intMeanB[500][700];//存储均值

intMeanG[500][700];

intMeanR[500][700];

intMean2B[500][700];//存储方差

intMean2G[500][700];

intMean2R[500][700];

4.2存在的缺陷

4.2.1缺陷一

然而单高斯存在的致命问题是其鲁棒性不高,会产生错误的检测,如果一个物体进入场景中,起初时会被当做前景而显示出来,由于没有将其加入到背景中进行更新,若随后此物体一直没有离去,现实中,我们把它当做场景,但是由于单高斯模型的局限性,此物体会一直被当做前景而显示出来。

例如下图所示:

左上方的人影随着时间的推移在场景中没有变动,应该被当做背景,但由于算法的缺陷却一直被当做前景而提取显示出来。

4.2.2缺陷二

对于和场景颜色RGB变动范围相似的前景部分,单高斯模型检测不出来,如上图所示,人体的胳膊和腿部就没有没检测出来,这是单高斯的致命缺陷,也是提出混合高斯的需求所在。

因此以上模型只适用于单稳态场景下检测不断运动的物体,其存在的缺陷可以通过建立混合高斯模型解决,但是由于它高效的时空效率,在有些场合仍然得到广泛应用。

第五章测试与运行

该程序可在windowsxp,window7等系统下运行,依附于vs2010实现,运行速度较快。

使用方法:

打开工程gauss,在Debug中单击gauss.exe文件执行即可。

第六章生产实习心得体会

本次生产实习是自上大学以来最有意义的一次实习,它让我们看到了学习了三年的成效,这是一个真正意义上的项目或者成品,之前的课程设计还都是仅局限在课本内容,而本次的实习,更加贴近生活,生产,让我们看到了知识的创造力,也让我们感受到自己可以作为一个生产者存立于社会。

本次的实习项目有重大的现实意义,运动目标的检测与重建,在生产,生活,娱乐,军事,游戏等方面有很好的发展前景,现在,将来我们必能看到它广阔的市场前景,因此研究这个课题是非常有意义和使用价值。

通过本次实习,让我感觉到图像的世界是丰富多彩,其乐无穷的,有很多有意义有趣的东西等待我去发现去创造,这是本次实习最大的意义,它给我指明了一条未来的道路。

在实习过程中,遇到了很多问题,例如:

matlab中很多函数不熟悉,vs2010用的不顺,openCV,openGL都是新接触的库,很多函数都要通过XX,google,不断地查询才会用。

从茫然到做出成果,我们学会了很多,历练了很多,深深地感受到科研的艰辛和乐趣。

此外,另一个感受是:

小组的力量是强大的,如果把项目交付给我一个人,我也许很难完成,或者很难在短期完成。

小组成员团结协作,小组间相互合作讨论,都是一个项目成功完成的基石。

在实习中,我学会了思考,查阅资料,遇到不懂得问题不会像以前一样依赖于别人的解答,学会了自己去寻找答案。

感谢杨老师的指导和学长们的解答和技术,理论支持,让我们这些菜鸟们得以展开双臂飞翔。

附录:

程序编码

#include"string.h"

#include"cv.h"

#include"highgui.h"

#include

#include

#include

#include

time_tt_start=0;

time_tt_end=0;

FILE*fplog=NULL;

#defineprintf(fmt,...)fprintf(fplog,fmt,__VA_ARGS__);

intN=100;

intheight=480;

intwidth=640;

intnum=25;

intMeanB[500][700];

intMeanG[500][700];

intMeanR[500][700];

intMean2B[500][700];

intMean2G[500][700];

intMean2R[500][700];

intM=404;

charfilename1[404][80];

charfilename2[404][80];

doublelamda=3;

intpoint;

CvScalarpixel;

voidfilename(char*inname,char*outname)

{

inti;

for(i=0;i

{

sprintf(filename1[i],inname,i);

sprintf(filename2[i],outname,i);

}

}

intgaussground()

{

inti,j,k;

IplImage*pRGBImg=NULL;

pRGBImg=cvLoadImage(filename1[0],1);

if(!

pRGBImg)

{

printf("failedtoloadinputimage1\n");

return-1;

}

for(j=0;j

{

for(k=0;k

{

pixel=cvGet2D(pRGBImg,j,k);

MeanB[j][k]=pixel.val[0];

MeanG[j][k]=pixel.val[1];

MeanR[j][k]=pixel.val[2];

Mean2B[j][k]=400;

Mean2G[j][k]=400;

Mean2R[j][k]=400;

}

}

for(i=1;i

{

pRGBImg=cvLoadImage(filename1[i],1);

if(!

pRGBImg)

{

printf("failedtoloadinputimage1\n");

return-1;

}

for(j=0;j

{

for(k=0;k

{

pixel=cvGet2D(pRGBImg,j,k);

if(abs(pixel.val[0]-MeanB[j][k])

&&abs(pixel.val[2]-MeanR[j][k])

{

point=point+1;

MeanB[j][k]=MeanB[j][k]*(point-1)+pixel.val[0];

MeanG[j][k]=MeanG[j][k]*(point-1)+pixel.val[1];

MeanR[j][k]=MeanR[j][k]*(point-1)+pixel.val[2];

Mean2B[j][k]=Mean2B[j][k]*(point-1)+(pixel.val[0]-Mean2B[j][k])*(pixel.val[0]-Mean2B[j][k]);

Mean2G[j][k]=Mean2G[j][k]*(point-1)+(pixel.val[1]-Mean2G[j][k])*(pixel.val[1]-Mean2G[j][k]);

Mean2R[j][k]=Mean2R[j][k]*(point-1)+(pixel.val[2]-Mean2R[j][k])*(pixel.val[2]-Mean2R[j][k]);

MeanB[j][k]=(int)(MeanB[j][k])/point;

MeanG[j][k]=(int)(MeanG[j][k])/point;

MeanR[j][k]=(int)(MeanB[j][k])/point;

Mean2B[j][k]=(int)(Mean2B[j][k])/point;

Mean2G[j][k]=(int)(Mean2G[j][k])/point;

Mean2R[j][k]=(int)(Mean2B[j][k])/point;

}//if

}//for

}//for

cvReleaseImage(&pRGBImg);

}//

return1;

}

intobject()

{

IplImage*pRGBImg=NULL;//

IplImage*Outlook=NULL;

inti,j,k;

intt1,t2,t3;

for(i=0;i

{

pRGBImg=cvLoadImage(filename1[i],CV_LOAD_IMAGE_ANYCOLOR);

if(!

pRGBImg)

{

printf("failedtoloadinputimage2\n");

return-1;

}

if(i==0)

{

Outlook=cvCreateImage(cvSize(pRGBImg->width,pRGBImg->height),pRGBImg->depth,1);

}

cvZero(Outlook);

for(j=0;j

{

for(k=0;k

{

pixel=cvGet2D(pRGBImg,j,k);

t1=(pixel.val[0]-MeanB[j][k])>0?

(pixel.val[0]-MeanB[j][k]):

(MeanB[j][k]-pixel.val[0]);

t2=(pixel.val[1]-MeanG[j][k])>0?

(pixel.val[1]-MeanG[j][k]):

(MeanG[j][k]-pixel.val[1]);

t3=(pixel.val[2]-MeanR[j][k])>0?

(pixel.val[2]-MeanR[j][k]):

(MeanR[j][k]-pixel.val[2]);

if(i==100)

{

printf("%d",t1);

printf("%d",t2);

printf("%d\n",t3);

}

if(t1>25||t2>25)

{

pixel.val[0]=255;

cvSet2D(Outlook,j,k,pixel);

}

if(i>N)

{

if(abs(pixel.val[0]-MeanB[j][k])<3*sqrt((double)MeanB[j][k])&&abs(pixel.val[1]-MeanG[j][k])<3*sqrt((d

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1