MOG,MOG2和GMG之间的差异

时间:2015-10-21 18:03:48

标签: difference background-subtraction

这三种背景减法方法有什么区别?

1 个答案:

答案 0 :(得分:11)

您可以参考此链接:
http://docs.opencv.org/master/db/d5c/tutorial_py_bg_subtraction.html#gsc.tab=0

为此目的引入了几种算法。 OpenCV已经实现了三种非常容易使用的算法。我们将逐一看到它们。

  

BackgroundSubtractorMOG

     

这是一种基于高斯混合的背景/前景分割算法。本文介绍了一种改进的自适应背景混合模型,用于带阴影检测的实时跟踪"作者:P. KadewTraKuPong和R. Bowden在2001年。它使用一种方法通过K高斯分布(K = 3到5)的混合来模拟每个背景像素。混合物的重量表示这些颜色在场景中停留的时间比例。可能的背景颜色是保持更长和更静态的颜色。

     

编码时,我们需要使用函数cv2.createBackgroundSubtractorMOG()创建一个后台对象。它有一些可选参数,如历史长度,高斯混合数,阈值等。它们都设置为某些默认值。然后在视频循环中,使用backgroundsubtractor.apply()方法获取前景蒙版。

     

请参阅下面的简单示例:

1 import numpy as np
2 import cv2
3 
4 cap = cv2.VideoCapture('vtest.avi')
5 
6 fgbg = cv2.createBackgroundSubtractorMOG()
7 
8 while(1):
9     ret, frame = cap.read()
10 
 11     fgmask = fgbg.apply(frame)
 12 
 13     cv2.imshow('frame',fgmask)
 14     k = cv2.waitKey(30) & 0xff
 15     if k == 27:
16         break
17 
18 cap.release()
19 cv2.destroyAllWindows()
     

(所有结果都显示在最后以供比较)。

     

BackgroundSubtractorMOG2

     

它也是基于高斯混合的背景/前景分割算法。它基于Z.Zivkovic的两篇论文,"用于背景扣除的改进的自适应Gausian混合模型"在2004年和"每个图像像素的高效自适应密度估计用于背景减法的任务"该算法的一个重要特征是它为每个像素选择适当数量的高斯分布。 (请记住,在最后一种情况下,我们在整个算法中采用了K高斯分布)。由于光照变化等原因,它可以更好地适应不同的场景。

     

与前一种情况一样,我们必须创建一个背景减法器对象。在这里,您可以选择是否检测阴影。如果detectShadows = True(默认情况下是这样),它会检测并标记阴影,但会降低速度。阴影将以灰色标记。

1 import numpy as np
2 import cv2
3 
4 cap = cv2.VideoCapture('vtest.avi')
5 
6 fgbg = cv2.createBackgroundSubtractorMOG2()
7 
8 while(1):
9     ret, frame = cap.read()
 10 
 11     fgmask = fgbg.apply(frame)
12 
13     cv2.imshow('frame',fgmask)
14     k = cv2.waitKey(30) & 0xff
15     if k == 27:
16         break
17 
18 cap.release()
19 cv2.destroyAllWindows()
     

(最后给出的结果)

     

BackgroundSubtractorGMG

     

该算法结合了统计背景图像估计和逐像素贝叶斯分割。它由Andrew B. Godbehere,Akihiro Matsukawa,Ken Goldberg在他们的论文"可变照明条件下的人类访问者的视觉跟踪中引入,用于响应音频艺术装置"根据该报告,该系统于2011年3月31日至7月31日在加利福尼亚州旧金山的当代犹太博物馆举办了一场名为“我们在那里吗?”的成功互动音频艺术装置。

     

它使用前几个(默认为120个)帧进行背景建模。它采用概率前景分割算法,使用贝叶斯推断识别可能的前景对象。估计是适应性的;较新的观测值比旧的观测值更重,以适应可变照明。进行了几种形态滤波操作,如关闭和打开,以消除不必要的噪音。在前几帧中你会得到一个黑色的窗口。

     

最好在结果上应用形态学开口来消除噪音。

1 import numpy as np
2 import cv2
3 
4 cap = cv2.VideoCapture('vtest.avi')
5 
6 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
7 fgbg = cv2.createBackgroundSubtractorGMG()
8 
9 while(1):
10     ret, frame = cap.read()
11 
12     fgmask = fgbg.apply(frame)
13     fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
14 
15     cv2.imshow('frame',fgmask)
16     k = cv2.waitKey(30) & 0xff
17     if k == 27:
18         break
19 
20 cap.release()
21 cv2.destroyAllWindows()