通过某种算法对图像的背景进行建模,将当前的图像与所得的背景模型与进行某种比较,根据比较结果我们可以确定前景图像的大概位置,及将前景图像与背景分割
背景建模算法模型
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背景模型
http://personal.ee.surrey.ac.uk/Personal/R.Bowden/publications/avbs01/avbs01.pdf
http://www.zoranz.net/Publications/zivkovic2004ICPR.pdf