单高斯模型
定义
单高斯模型是一种图像处理背景提取的处理方法,适用于背景单一不变的场合。可以使用单高斯模型对背景进行建模,然后通过背景减除提取出运动目标。
数学定义
单高斯模型认为,对一个背景图像,特定像素点灰度值的分布满足高斯分布,即对背景图像B,每一个点(x,y)的亮度满足
B
(
x
,
y
)
~
N
(
μ
,
σ
2
)
B(x,y)\text{\textasciitilde} N(\mu,{\sigma}^2)
B(x,y)~N(μ,σ2),即:
I
(
x
)
=
1
2
π
σ
e
−
(
x
−
μ
)
2
2
σ
2
I(x)=\frac 1 {\sqrt{2\pi}\sigma}e^{-{\frac {(x-\mu)^2} {2\sigma^2}}}
I(x)=2πσ1e−2σ2(x−μ)2
也就是说,每一个像素点都包含两个属性,均值
μ
\mu
μ和方差
σ
\sigma
σ。在提取目标的过程中,首先计算一段时间内的视频序列中图像每一个点的均值和方差,作为背景模型,然后对于一幅包含前景的任意图像G,对G上每一个点(x,y)计算,若:
1
2
π
σ
e
−
(
I
G
(
x
,
y
)
−
I
B
(
x
,
y
)
)
2
2
σ
2
>
T
\frac 1 {\sqrt{2\pi}\sigma}e^{-{\frac {(IG(x,y)-IB(x,y))^2} {2\sigma^2}}} > T
2πσ1e−2σ2(IG(x,y)−IB(x,y))2>T
则认为该点是背景点,否则是前景点,其中T为一个常数阈值,IG(x,y)表示图G中点(x,y)的灰度值,IB(x,y)同理。
随着时间的变化,背景图像也会发生变化,因此需要调整每个像素点的参数:
μ
(
x
,
y
,
t
)
=
l
r
∗
μ
(
x
,
y
,
t
−
1
)
+
(
1
−
l
r
)
∗
I
(
x
,
y
,
t
)
\mu(x,y,t)=lr*\mu(x,y,t-1)+(1-lr)*I(x,y,t)
μ(x,y,t)=lr∗μ(x,y,t−1)+(1−lr)∗I(x,y,t)
σ
(
x
,
y
,
t
)
=
l
r
∗
σ
(
x
,
y
,
t
−
1
)
+
(
1
−
l
r
)
∗
(
I
(
x
,
y
,
t
)
−
μ
(
x
,
y
,
t
)
)
2
\sigma(x,y,t)=lr*\sigma(x,y,t-1)+(1-lr)*(I(x,y,t)-\mu(x,y,t))^2
σ(x,y,t)=lr∗σ(x,y,t−1)+(1−lr)∗(I(x,y,t)−μ(x,y,t))2
其中lr是一个常数,表示更新率,lr越大,背景更新的越慢。
Python编码实现
import cv2
import numpy as np
"""
使用单高斯模型检测静止相机下的运动目标
"""
np.set_printoptions(precision=2,suppress=True)
# 设置常数
T=3 # 前后景区分常数
lr=0.3 # 学习率
# 读取视频
cap=cv2.VideoCapture('video.gif')
isFirst=True
while cap.isOpened():
ret,frame=cap.read()
if frame is not None:
gray=cv2.cvtColor(frame,cv2.COLOR_RGB2GRAY)
# 使用第一帧来初始化参数
if isFirst:
mean=np.zeros(gray.shape)
var=np.zeros(gray.shape)
isFirst=False
else:
# 标识目标
frame[(gray-mean)**2 > T*var,2]=255
cv2.imshow('tracking',frame)
# 更新参数
mean=lr*mean+(1-lr)*gray
var=lr*var+(1-lr)*(gray-mean)**2
if cv2.waitKey(50) and 0xFF ==ord('q'):
break
else:
break
检测效果
静止相机:
非静止相机:
单高斯模型检测静止相机效果还行,非静止相机完全不能用