OPENCV混合高斯模型原理

  (本文转自转自:http://blog.sina.com.cn/s/blog_62bce98c0100shkq.html) 

   混合高斯模型跟高斯变量之和看起来有一点像, 注意不要把它们弄混淆了. 混合高斯模型给出的概率密度函数实际上是几个高斯概率密度函数的加权和:

 p(x) = /sum_{i=1}^n p_i N(x; /bar{x}_i, P_i)

其中/sum_{i=1}^np_i = 1 . 定义事件A_i = /{x /sim N(/bar{x}_i, P_i)/} , 则/mathbb{P}/{A_i/} = p_i . 据此可以产生服从上述混合高斯概率密度分布的样本.

混合分布的均值为

 /bar{x} = /sum_{i=1}^n p_i /bar{x}_i

方差为

 /mathbb{E}((x - /bar{x})(x - /bar{x})') = /sum_{i=1}^n p_i P_i + /sum_{i=1}^n p_i /bar{x}_i /bar{x}_i' - /bar{x}/bar{x}'

计算均值和方差的公式不仅适用于几个(多维)高斯分布混合的情况, 还适用于非高斯分布的情况.

高斯变量之和就没什么好说的了, 几个高斯变量之和是一个新的高斯变量.

 

高斯背景模型在 运动检测中的应用


     原理 : 高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
    对图像背景建立高斯模型的原理及过程:图像灰度直方图反映的是图像中某个灰度值出现的频次,也可以认为是图像灰度概率密度的估计。如果图像所包含的目标区域和背景区域相比比较大,且背景区域和目标区域在灰度上有一定的差异,那么该图像的灰度直方图呈现双峰-谷形状,其中一个峰对应于目标,另一个峰对应于背景的中心灰度。对于复杂的图像,尤其是医学图像,一般是多峰的。通过将直方图的多峰特性看作是多个高斯分布的叠加,可以解决图像的分割问题。

    在智能监控系统中,对于运动目标的检测是中心内容,而在运动目标检测提取中,背景目标对于目标的识别和跟踪至关重要。而建模正是背景目标提取的一个重要环节。

    我们首先要提起背景和前景的概念,前景是指在假设背景为静止的情况下,任何有意义的运动物体即为前景。建模的基本思想是从当前帧中提取前景,其目的是使背景更接近当前视频帧的背景。即利用当前帧和视频序列中的当前背景帧进行加权平均来更新背景,但是由于光照突变以及其他外界环境的影响,一般的建模后的背景并非十分干净清晰,而高斯混合模型是是建模最为成功的方法之一。

     混合高斯模型使用K(基本为3到5个)个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型, 用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。 通观整个高斯模型,主要是有方差和均值两个参数决定,对均值和方差的学习,采取不同的学习机制,将直接影响到模型的稳定性、精确性和收敛性 。由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学习能力,改进方法对均值和方差的更新采用不同的学习率;为 提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立背景图像并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。

       到这里为止,混合高斯模型的建模基本完成,我在归纳一下其中的流程,首先初始化预先定义的几个高斯模型,对高斯模型中的参数进行初始化,并求出之后将要用到的参数。其次,对于每一帧中的每一个像素进行处理,看其是否匹配某个模型,若匹配,则将其归入该模型中,并对该模型根据新的像素值进行更新,若不匹配,则以该像素建立一个高斯模型,初始化参数,代理原有模型中最不可能的模型。最后选择前面几个最有可能的模型作为背景模型,为背景目标提取做铺垫。


    方法: 目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动。对于摄像机运动的运动物体检 测问题,比较著名的解决方案是光流法,通过求解偏微分方程求的图像序列的光流场,从而预测摄像机的运动状态。对于摄像机固定的情形,当然也可以用光流法, 但是由于光流法的复杂性,往往难以实时的计算,所以我采用高斯背景模型。因为,在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照,风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景,一般来说,前景就是运动物体,从而达到运动物体检测的目的。
  单分布高斯背景模型
  单分布高斯背景模型认为,对一个背景图像,特定像素亮度的分布满足高斯分布,即对背景图像B, (x,y)点的亮度满足:
  IB (x,y) ~ N(u,d)
  这样我们的背景模型的每个象素属性包括两个参数:平均值u 和 方差d。
  对于一幅给定的图像G,如果 Exp(-(IG (x,y)-u(x,y))^2/(2*d^2)) > T,认为(x,y)是背景点,反之是前景点。
  同时,随着时间的变化,背景图像也会发生缓慢的变化,这时我们要不断更新每个象素点的参数
  u(t+1,x,y) = a*u(t,x,y) + (1-a)*I(x,y)
  这里,a称为更新参数,表示背景变化的速度,一般情况下,我们不更新d(实验中发现更不更新 d,效果变化不大)。

openCV中高斯混合模型的应用

  高斯混合模型是用于背景提取的方法,OpenCV的cvaux中 cvbgfg_gaussmix.cpp文件根据文献"An improved adaptive background mixture model for real-time tracking with shadow"中提供的方法编写了高斯混合模型函数。其中定义了CvGaussBGModel类用于存放高斯混合模型的各个参数。我用OpenCV使用高斯 混合模型函数分以下几步:
  1。需要用到 icvUpdateGaussianBGModel,icvReleaseGaussianBGModel两个函数,但是源程序中将这两个函数定义为内部函数,需要做一些修改,首先将cvbgfg_gaussmix.cpp中前面两个函数的声明static void CV_CDECL icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );
static int CV_CDECL icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );两行代码注释掉。然后在cvbgfg_gaussmix.cpp中间部分两个函数的定义部分,函数头static int和static void改成CV_IMPL int 和CV_IMPL void。最后在cvaux.h文件中CVAPI(CvBGStatModel*) cvCreateGaussianBGModel( IplImage* first_frame,
  CvGaussBGStatModelParams* parameters CV_DEFAULT(NULL));这句后面加上以下两句CVAPI(void) icvReleaseGaussianBGModel( CvGaussBGModel** bg_model );
  CVAPI(int) icvUpdateGaussianBGModel( IplImage* curr_frame, CvGaussBGModel* bg_model );
  程序修改完毕,点rebuild all,全部重新编译。
  2。在程序初始化部分定义高斯混合模型参数CvGaussBGModel* bg_model=NULL;在读取第一帧图像(背景图像)时,进行高斯背景建模bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(image, 0);image可以是灰度图象也可以是彩色图像。接下来再读取当前帧时,更新高斯模型
   regioncount=icvUpdateGaussianBGModel(currframe, bg_model );regioncount的含义我不确定,我理解是代表背景中不同颜色区域的个数,这个参数我没有用到,它只是 icvUpdateGaussianBGModel函数的返回值。
  3。现在bg_model已经保存了经过高斯混合模型分类后的结 果,bg_model->background保存了背景图像,bg_model->foreground保存了前景图像。
 

  1. include <stdio.h>  
  2. #include <cv.h>  
  3. #include <cxcore.h>  
  4. #include <highgui.h>  
  5. #include <cvaux.h>//必须引此头文件  
  6. int main( int argc, char** argv  
  7.  
  8. IplImage* pFrame NULL;    
  9. IplImage* pFrImg NULL;  
  10. IplImage* pBkImg NULL;    
  11. CvCapture* pCapture NULL;    
  12. int nFrmNum 0;  
  13. cvNamedWindow("video"1);  
  14. cvNamedWindow("background",1);  
  15. cvNamedWindow("foreground",1);    
  16. cvMoveWindow("video"30, 0);  
  17. cvMoveWindow("background"360, 0);  
  18. cvMoveWindow("foreground"690, 0);  
  19. ifargc    
  20.     
  21. fprintf(stderr, "Usage: bkgrd [video_file_name]/n");     
  22. return -1;    
  23.  
  24. //打开视频文件  
  25. if(argc == 2)    
  26. if!(pCapture cvCaptureFromFile(argv[1])))     
  27.    
  28. fprintf(stderr, "Can not open video file %s/n"argv[1]);    
  29. return -2;     
  30.  
  31. //打开摄像头  
  32. if (argc == 1)    
  33. if!(pCapture cvCaptureFromCAM(-1)))     
  34.    
  35. fprintf(stderr, "Can not open camera./n");    
  36. return -2;     
  37.    
  38. //初始化高斯混合模型参数  
  39. CvGaussBGModel* bg_model=NULL;  
  40. while(pFrame cvQueryFrame( pCapture ))    
  41.     
  42. nFrmNum++;           
  43. if(nFrmNum == 1)    
  44.     
  45. pBkImg cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,3);    
  46. pFrImg cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);     
  47. //高斯背景建模,pFrame可以是多通道图像也可以是单通道图像  
  48. //cvCreateGaussianBGModel函数返回值为 CvBGStatModel*,  
  49. //需要强制转换成CvGaussBGModel*  
  50. bg_model (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);  
  51.     
  52. else  
  53.     
  54. //更新高斯模型  
  55. cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );  
  56. //pFrImg为前景图像,只能为单通道  
  57. //pBkImg为背景图像,可以为单通道或与pFrame通道数相同  
  58. cvCopy(bg_model->foreground,pFrImg,0);  
  59. cvCopy(bg_model->background,pBkImg,0);  
  60. //把图像正过来  
  61. pBkImg->origin=1;  
  62. pFrImg->origin=1;  
  63. cvShowImage("video"pFrame);     
  64. cvShowImage("background"pBkImg);     
  65. cvShowImage("foreground"pFrImg);        
  66. ifcvWaitKey(2) >=       
  67. break    
  68.     
  69.  
  70. //释放高斯模型参数占用内存    
  71.  cvReleaseBGStatModel((CvBGStatModel**)&bg_model);  
  72. cvDestroyWindow("video");  
  73. cvDestroyWindow("background");  
  74. cvDestroyWindow("foreground");    
  75. cvReleaseImage(&pFrImg);  
  76. cvReleaseImage(&pBkImg);    
  77. cvReleaseCapture(&pCapture);    
  78. return 0;  
  79.  

 *********************************************************************************

  (下面转自http://blog.csdn.net/carson2005/article/details/7737801)


申明:以下内容为笔者翻译自国际会议论文,鉴于本人水平有限,翻译难免有误,请大家多多包容。

原文为:

An Improved Adaptive Background Mixture Model for Real-time Tracking with Shadow Detection;  P.KaewTraKualPong,R.Bowden; In Proc. 2nd European Workshop on Advanced Video Based Surveillance Systems,AVBS01. Sept 2001

摘要:

对连续的视频序列进行实时的运动目标检测,是很多计算机视觉应用的基础所在。一种常用的方法就是背景减去法。因此,(研究人员)也提出了很多背景建模的方法来应对背景减去法中的各种问题。其中一种较为成功的方法是由Grimson等提出的对每个像素点进行多通道的自适应背景建模方法。但是,这种方法要忍受初始阶段缓慢的的背景模型学习过程,而对于复杂背景这种情况还要更甚。此外,这种方法还无法区分运动阴影和运动目标。本文提出一种对该自适应背景建模的改进方法。通过对(模型)更新方差的重新研究,我们发现,可以在不同的阶段采用不同的更新方差。这样便使得我们的系统学习速度更快,精确度更高,同时,对环境变化的适应能力也更好。另外,本文也提出了一种阴影检测方法。它是利用我们的背景模型来进行颜色空间估计,从而实现(阴影检测)的。另外,本文给出了两种算法的对比测试。对比结果表明,我们的算法在学习速度和精确度方面完胜Grimson的方法。如果将本文新提出的阴影检测方法结合进来,我们的方法将远远优于Grimson的算法。

1.介绍:

背景减去法的含义是构建一个参考图片(纯背景),将每个新的视频帧同参考图片相减,并进行二值化,从而得到运动前景的方法。这也就意味着,背景减去法的结果是一个对非静态区域的一个高亮表示。构建参考图片最简单的方法就是将时间上连续的一系列背景图片进行平均。这种方法有很多问题,同时,它还需要一个没有前景出现,仅仅有纯背景的一段图片序列来作为训练样本。训练之后,背景的运动以及训练阶段前景的静止不运动,都被当做运动目标。另外,该方法无法应对场景中光线的逐渐变化。诸如此类的问题都表明,任何解决办法都必须要考虑到背景模型的持续更新(重估)过程。对于这种信号逐渐变化的过程,(研究人员)已经提出了很多自适应的背景建模方法来应对。FriedmanRussell提出对场景中的每个像素都构建三个高斯分布的自适应混合参数模型。另外,他们也提供了关于利用大量统计数据的在线更新方程的简短讨论。Koller等则利用卡尔曼滤波器来对每个像素的背景光照变化情况进行跟踪。他们采用了一种选择性的策略来将可能的背景像素引入背景更新方程来进行背景的维护和更新。这种方法可以很好的应对光线的变化,但是,对于新的目标进入场景或者有目标离开场景就无法处理了。一种解决方案就是对每个像素建立一个多通道的背景模型。Grimson等的方法采用了一种非参数化的自适应混合高斯模型来解决这个问题。他们的模型也能解决小的来回反复的运动情况,例如,树木的晃动、矮树丛的飘动以及相机的微小震动等。Elgammal等对每个像素采用了一种核方法来进行背景的估计和更新。其中的核样本(Kernel Examplars)是通过一个移动窗口来获得的。他们采用一种名为“空间一致性”的方法来减少微小移动的所带来的问题。这种方法是通过(当前帧)与背景模型(对应位置)周围的圆形连通区域的比较来计算的。尽管作者提出了很多加速计算的方法,但该算法本身的计算依然很复杂。其它的借助于高级处理方法(图像处理?)来辅助进行背景建模的方法也被研究人员提出了。我们的方法是基于Grimson的算法框架,区别在于更新方程、初始化方法的不同,并且还引入了一种阴影检测方法。

一种用于混合高斯模型的常用优化方法是EMExpectation Maximisation,最大期望)算法。EM算法是一种能够保证在搜索空间收敛到局部最大值的迭代方法。考虑到背景图片维护过程中的时域和空域的要求,这里需要一种在线的EM算法。很多在线EM算法已经被人们所研究。它们大致可以分为两类:第一类是利用概率密度函数来进行参数估计。换句话说,是在不改变以前模型结构的前提下利用新的数据来更新以前的(参数)估计。该流程是由Nowlan提出的,并且根据NealHinton的的研究结果来进行相应的解释。Traven则提出了一种N个最近窗口版本(N most recent window version)的流程(来解决参数估计问题)。McKenna等人将Traven的方法扩展到利用LEM的运行结果来形成L个最近窗口版本,并且用它来进行多通道的前景目标跟踪。这种方法在没有好的初始估计的前提下,是不能很有效的运行的。第二类是非参数的方法。Priebe等人提出利用随机阈值来对现有的混合(高斯)模型来产生新的高斯核,从而得到自适应的高斯模型。而GrimsonStauffer等人则采用了固定阈值的方法。

除了Grimson等人,许多其它研究人员也提出对场景中的每个像素都构建一个混合模型。RoweBlake提出在虚拟的图像空间将批次EM算法应用于离线训练过程。然而,他们的背景建模方法并不随着时间的流逝而随之更新,因此,当场景中的光线随着时间逐渐发生变化时,这种方法将会失效。FriedmanRussell对场景中的每个像素进行混合高斯建模,每个像素的模型是由三个高斯分布组合而成,他们将其应用在道路、阴影以及车辆的分布上。模式分类是一种基于启发式的亮度空间相关距离计算方法。借助于足够的统计学规则他们的方法取得了较好的(前景)分割效果。但是,这依然需要提供一个预处理的初始化过程,该初始化过程利用批次EM算法来提供一个初始的背景模型。

在第2.1节我们将介绍GrimsonStauffer的背景模型算法。我们提供的解决方法将在第2.2节进行阐述。而第2.3节将描述我们的阴影检测算法。每种方法的结果以及结果之间的对比测试将在第3节予以呈现。第4节给出本文的结论。

2. 背景建模

该部分我们讨论GrimsonStauffer的工作以及他们所提出的算法的不足之处。作者提出对每个背景像素都利用k(取值为3-5之间)个高斯分布的组合来构建背景模型。不同的高斯分布代表不同颜色通道。k个高斯分布组合的系数代表着某个颜色在当前场景中分布的时间比例。不同于Friedman的方法,假设背景中包含B个最有可能的颜色,那么整个背景成分将有这B个颜色来决定。而最有可能的颜色则是那些在长时间持续存在,而且保持静止的颜色。静止的单色目标在颜色空间倾向于形成一种紧致的聚类,而移动的目标则由于在移动过程中目标的不同部分呈现在图片中的反射率不同,从而使其在颜色空间中倾向于形成一种宽松的聚类。在作者的论文中,有一种被称之为fitness的方法来衡量这种特性。为了让背景模型能适应光线的变化,同时为了保证运算的实时性,作者采用了一种选择性(背景模型)更新策略。每个新的像素值同背景模型之间的fitness都计算一次,并依此排序。最匹配的高斯成分将被更新,如果没有任何一个高斯成分匹配上,那就新增加一个高斯成分,新增加的高斯成分的均值为该颜色,同时,赋予它一个大的协方差矩阵和一个小的权重系数。











  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值