背景建模算法

背景建模算法的基本原理

通过某种算法对图像的背景进行建模,将当前的图像与所得的背景模型与进行某种比较,根据比较结果我们可以确定前景图像的大概位置,及将前景图像与背景分割

背景建模算法模型

1、平均时间背景模型

平均背景模型是最简单的一种背景模型,求出多个背景图像对应像素点的平均值待比较的图像对应像素点与平均值比较,如果超过一定阈值这认为其为前景点,如果在一定阈值之间,则认为其为背景点。

2、高斯背景模型

高斯背景模型可以分为单高斯背景模型和混合高斯背景模型

单高斯背景模型(Single Gaussian Background Model)的基本思想是:将图像中每一个像素点的颜色值看成是一个随机过程X,并假设该点的某一像素值出现的概率服从高斯分布。根据该点的高斯分布参数(均值和方差)判断对应像素点是否为前景点或背景点

混合高斯背景模型(Gaussian Mixture Model):在单高斯背景模型中将单个高斯分布作为相应某一像素值的概率密度分布,混合高斯背景模型对其进行了扩展,通过多个高斯概率密度函数(一般为三到五个)的加权平均来平滑地近似任意形状的密度分布函数。

混合高斯背景模型的关键代码如下:

单通道处理函数及参数解释:

/*********************************
单通道处理函数
image:          处理帧
fgmask:         输出帧
learningRate:   学习帧,对应论文中alpha
bgmodel:        像素点参数矩阵
nmixtures:      高斯模型个数
backgroundRatio:背景阈值,对应论文中T
varThreshold:   方差阈值
noiseSigma:     噪声方差
*********************************/
static void process8uC1( const Mat& image, Mat& fgmask, double learningRate,
                         Mat& bgmodel, int nmixtures, double backgroundRatio,
                         double varThreshold, double noiseSigma )
算法实现关键代码:
for( y = 0; y < rows; y++ )                     
    {
        const uchar* src = image.ptr<uchar>(y);        // 图像指针
        uchar* dst = fgmask.ptr<uchar>(y);

        if( alpha > 0 )                                // 需要学习
        {
            for( x = 0; x < cols; x++, mptr += K )     // 遍历图像中每一像素点
            {
                float wsum = 0;
                float pix = src[x];
                int kHit = -1, kForeground = -1;

                for( k = 0; k < K; k++ )
                {
                    float w = mptr[k].weight;
                    wsum += w;
                    if( w < FLT_EPSILON )              // w<FLT_EPSILON,权值足够小,不存在第k个高斯模型
                        break;
                    float mu = mptr[k].mean;
                    float var = mptr[k].var;
                    float diff = pix - mu;
                    float d2 = diff*diff;
                    if( d2 < vT*var )                  // 匹配第k个高斯模型
                    {
                        wsum -= w;                     // 权值将会更新,先减出处理,后续部分加上
                        float dw = alpha*(1.f - w);    // 根据更新等式更新模型参数值
                        mptr[k].weight = w + dw;
                        mptr[k].mean = mu + alpha*diff;
                        var = max(var + alpha*(d2 - var), minVar);
                        mptr[k].var = var;
                        mptr[k].sortKey = w/sqrt(var);

                        for( k1 = k-1; k1 >= 0; k1-- )  // 更新高斯模型排名
                        {
                            if( mptr[k1].sortKey >= mptr[k1+1].sortKey )
                                break;
                            std::swap( mptr[k1], mptr[k1+1] );
                        }

                        kHit = k1+1;                    // 匹配高斯模型的排名
                        break;
                    }
                }

				// 找不到匹配高斯模型,移除排名最后高斯模型并创建一个新模型
                if( kHit < 0 ) // no appropriate gaussian mixture found at all, remove the weakest mixture and create a new one
                {
                    kHit = k = min(k, K-1);
                    wsum += w0 - mptr[k].weight;
                    mptr[k].weight = w0;
                    mptr[k].mean = pix;
                    mptr[k].var = var0;
                    mptr[k].sortKey = sk0;
                }
                else
                    for( ; k < K; k++ )
                        wsum += mptr[k].weight;

                float wscale = 1.f/wsum;               // 权值归一化处理
                wsum = 0;
                for( k = 0; k < K; k++ )
                {
                    wsum += mptr[k].weight *= wscale;
                    mptr[k].sortKey *= wscale;         
                    if( wsum > T && kForeground < 0 )  // 背景模型分割,wsum>T的部分可以判断为前景
                        kForeground = k+1;             // 记录前景和背景分割界限
                }

				// 更新像素值 -( kHit>= kForeground ) == -1 == 255,- 0 == 0
                dst[x] = (uchar)(-(kHit >= kForeground));
            }
        }

混合高斯模型学习资料(GMM,EM算法推导及讲解,论文,GMM源码):http://download.youkuaiyun.com/detail/u011469591/6005419

3、非参数化背景模型

高斯背景模型对像素点值的概率密度分布做了假设,而这个假设不一定成立。非参数化背景模型不对像素点值做出任何假设,而通过概率密度估计的方法建立像素的背景统计模型。其基本思想是:为被建模场景中的像素点保存一段时间内的一系列颜色样本值,并根据这些样本值来估计当前帧图像中每一个像素点的概率。

4、codebook背景模型

CodeBook算法的基本思想是得到每个像素的时间序列模型。这种模型能很好地处理时间起伏,缺点是需要消耗大量的内存。CodeBook算法为当前图像的每一个像素建立一个CodeBook(CB)结构,每个CodeBook结构又由多个CodeWord(CW)组成。CB和CW的形式如下:

CB={CW1,CW2,…CWn,t}

CW={lHigh,lLow,max,min,t_last,stale}

其中n为一个CB中所包含的CW的数目,当n太小时,退化为简单背景,当n较大时可以对复杂背景进行建模;t为CB更新的次数。CW是一个6元组,其中IHigh和ILow作为更新时的学习上下界,max和min记录当前像素的最大值和最小值。上次更新的时间t_last和陈旧时间stale(记录该CW多久未被访问)用来删除很少使用的CodeWord。

Reference

http://underthehood.blog.51cto.com/2531780/484191/(推荐,算法讲解比较详细)

http://www.cnblogs.com/tornadomeet/archive/2012/04/08/2438158.html

http://www.umiacs.umd.edu/~knkim/paper/Kim-RTI2005-FinalPublished.pdf

http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf

http://www.zoranz.net/Publications/zivkovic2004ICPR.pdf




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值