视频图像的处理(背景差分法、光流法、帧间差分法)

一、背景差分法
它的基本思想是将输入图像与背景模型进行比较,通过判定灰度等特征的变化,或用直方图等统计信息的变化来分割运动目标。首先建立好背景模型,存储背景图像。当当前帧与背景图像相减大于一定的阈值时,则判定该像素为前景目标:输入图像减去背景图像,T为阈值(差值)。经过阈值处理后,图像中0值对应的点即为背景图像,1值对应的点即为场景中运动的像素点。
该方法实现较为简单,且实时性好,在完整的背景图像时,能够较好的捕获物体。但是该方法鲁棒性较差,动态场景的变化对结果又很大的影响,比如:光照的变化,天气的变化,采集位置的移动等。

(一)BackgroundSubtractorMOG
这是一个以混合高斯模型为基础的前景/背景分割算法。2001年,P. KadewTraKuPong 和 R. Bowden在论文"An improved adaptive background mixture model for real-time tracking with shadow detection" 中进行了介绍。它使用 K(K=3 或 5)个高斯分布混合对背景像素进行建模。混合的权重表示这些颜色停留在场景中的时间比例,背景颜色是那些保持更长时间和更静态的颜色。

在编写代码时,我们需要使用函数:cv2.createBackgroundSubtractorMOG()创建一个背景对象。这个函数有些可选参数,比如要进行建模场景的时间长度,高斯混合成分的数量,阈值等。将他们全部设置为默认值。然后在整个视频中我们是需要使用 backgroundsubtractor.apply()就可以得到前景的掩码图。
简单例子:

import numpy as np
import cv2 as cv
cap = cv.VideoCapture('D:/Desktop/abc/5.mp4')
fgbg = cv.bgsegm.createBackgroundSubtractorMOG()

while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    cv.imshow('frame',fgmask)
    k = cv.waitKey(30) & 0xff
    if k == 27:
        break
        
cap.release()
cv.destroyAllWindows()

(二)BackgroundSubtractorMOG2
这个也是以高斯混合模型为基础的背景/前景分割算法。它是以 2004 年和 2006 年 Z.Zivkovic 的两篇文章为基础的,分别是"Improved adaptive Gaussian mixture model for background subtraction" 和 “Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction” 。这个算法的一个特点是它为每一个像素选择一个合适数目的高斯分布。(上一个方法中我们使用是 K 高斯分布)。它能更好地适应光照不同等各种场景。
和前面一样我们需要创建一个背景对象。但在这里我们我们可以选择是否检测阴影。如果 detectShadows = True(默认值),它就会检测并将影子标记出来,但是这样做会降低处理速度。影子会被标记为灰色。
简单例子:

import numpy as np
import cv2 as cv

cap = cv.VideoCapture('D:/Desktop/abc/5.mp4')

fgbg = cv.createBackgroundSubtractorMOG2()

while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    cv.imshow('frame',fgmask)
    k = cv.waitKey(30) & 0xff
    if k == 27:
        break
        
cap.release()
cv.destroyAllWindows()

(三)BackgroundSubtractorGMG
此算法结合了静态背景图像估计和每个像素的贝叶斯分割。这是 2012 年Andrew_B.Godbehere,Akihiro_Matsukawa 和 Ken_Goldberg 在文章"Visual Tracking of Human Visitors under Variable-Lighting Conditions for a Responsive Audio Art Installation"中提出的。
它使用前面很少的图像(默认为前 120 帧)进行背景建模。它采用概率前景分割算法,使用贝叶斯推断识别可能的前景对象。这是一种自适应的估计,新观察到的对象比旧的对象具有更高的权重,从而对光照变化产生适应。一些形态学操作如开运算闭运算等被用来除去不需要的噪音。在开始的前几帧图像中你会看到一个黑色窗口。
对结果进行形态学开运算对与去除噪声很有帮助。
简单例子:

import numpy as np
import cv2 as cv

cap = cv.VideoCapture('D:/Desktop/abc/5.mp4')

kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE,(3,3))
fgbg = cv.bgsegm.createBackgroundSubtractorGMG()

while(1):
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    fgmask = cv.morphologyEx(fgmask, cv.MORPH_OPEN, kernel)
    cv.imshow('frame',fgmask)
    k = cv.waitKey(30) & 0xff
    if k == 27:
        break
        
cap.release()
cv.destroyAllWindows()

二、光流法
光流是基于像素点定义的,反映了在时间间隔dt内由于运动所造成的图像变化,光流场是通过二维图来表示物体点的三维运动的速度场。使用光流法可以将与运动模型相适应的像素区域求出,然后再对区域进行合并以形成运动的对象进行物体检测。
采用光流法能够将物体独立的检测出来,不需要摄像机提供其他信息,但是在大多数的情况下,光流法比较耗费时间、计算复杂性大,并且抗噪声的能力很差,只有在特殊的硬件支持下,才能够实现实时的检测,即光流法的时间开销很大,其实时性和实用性也较差。由于仅利用光流方法的人脸跟踪方法会造成速度误差积累,容易导致长序列跟踪失败。

三、帧间差分法
即将前后两帧图像的像素值做相减。在环境亮度变化不大的情况下,如果对影响素质相差很小,可以认为该物体是静止的,如果图像区域某处的像素值变化很大,则认为该变化是由于运动物体所导致的。
该方法也有优缺点,在负载的环境下,如运动缓慢,光照或者雨雪天气时,帧差法的检测效果并不是很好。另外,当运动物体一旦静止或者被物体遮挡时,帧差法及其改进算法容易丢失物体信息。此外,由于帧间差分法的前提是图像背景的不变性,如果背景运动,该方法就不合适了。对于这种情况,可先补偿由摄像机移动引起的背景的运动,之后再对图像进行差分的计算。我们可以用两种方法来消除背景的相对运动所构成的不良效果:一种是补偿闭环系统中的自反馈对得到的运动镜头参数;另一种是匹配背景图像中特征比较突出的区域,在背景偏移量得到之后再进行一定的弥补。与第一种方法相比较来说,第二种方法在本质上不依靠在跟踪算法中的回路参数,进一步来说,当背景图像中有显著的框架特征时可以有好的背景弥补效果被获取,并且配准精度较高。

  • 5
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值