使用基于Kalman滤波理论的时域递归低通滤波来预测缓变的背景图像也可以看作是一种基于运动检测的多帧降噪方法。利用Kalman滤波器的记忆特性, 对一定时间长度的视频图像信息进行加权平均从而获得与实际背景图像近似的初始背景, 同时达到了滤除颗粒噪声、消除摄像机抖动不良效果的目的, 为下一步提取我们感兴趣的运动目标创造了有利条件, 而且获得的初始背景的质量不依赖于起始时间。
视频图像序列经过Kalman滤波器时,图像序列的缓变部分可以从图像的快速变化过程中分离出来,并在加权平均中使得背景得到更新。其表达式为:
B(i, j, k + 1) = B(i, j, k) + G(k) * [F(i, j, k) - B(i, j, k)]
G(k) = α * M(i, j, k) + β * [1 - M(i, j, k)]
若|F(i, j, k) - B(i, j, k)| > T,则M(i, j, k) = 1,否则M(i, j, k) = 0
其中,k是当前帧的序号,B(i, j, k)是当前帧的背景在坐标(i, j)处的灰度值,B(i, j, k + 1)是估计得到的更新背景在(i, j)处的灰度值,F(i, j, k)是当前输入的第k帧图像在(i, j)位置的像素灰度值。α是运动因子,β是背景因子,这是两个经验值,取值介于0和1之间, 必须足够小, 以便运动物体能够从背景序列中有效地分离出来。T是当前输入的第k帧图像的分割阈值,可使用OTSU算法得到,详情可以参考:OTSU算法提取图像阈值的C语言实现
以下是一段在OpenCV中实现的C语言程序,即一个使用Kalman滤波更新运动图像背景的函数,输入的参数依次为:当前灰度图像数据指针、背景图像数据指针、图像宽度、图像高度、图像的分割阈值。函数更新了背景图像数据指针所指向的数据。
void kalmanFilter(uchar* gdata, uchar* bdata,
int width, int height, int threshold)
{
float alpha = 0.025, beta = 0.01, g;
int i, j, index, m;
for(i = 0;i < height;i++)
{
for(j = 0;j < width;j++)
{
index = i * width + j;
if(abs((float)gdata[index] - (float)bdata[index])
> threshold)
{
m = 1;
}
else
{
m = 0;
}
g = alpha * m + beta * (1 - m);
bdata[index] = (float)bdata[index] +
g * ((float)gdata[index] -(float)bdata[index]);
}
}
}
--End--



