Background subtraction is a way of eliminating the background from image. To achieve this we extract the moving foreground from the static background.

In OpenCV we have three algorithms to do this operation:

1. BackgroundSubtractorMOG

It is a Gaussian Mixture-based Background/Foreground Segmentation Algorithm.

2. BackgroundSubtractorMOG2

It is also a Gaussian Mixture-based Background/Foreground Segmentation Algorithm. It provides better adaptibility to varying scenes due illumination changes etc.

3. BackgroundSubtractorGMG

This algorithm combines statistical background image estimation and per-pixel Bayesian segmentation.

How to apply OpenCV in-built functions for background substraction:

  1. Create an object to signify the algorithm we are using for background subtraction.
  2. Apply backgroundsubtractor.apply() function on image.

Implemented code in Python:

#importing libraries
import numpy as np
import cv2

#creating object
fgbg1 = cv2.bgsegm.createBackgroundSubtractorMOG();   
fgbg2 = cv2.createBackgroundSubtractorMOG2();
fgbg3 = cv2.bgsegm.createBackgroundSubtractorGMG();

# capture frames from a camera 
cap = cv2.VideoCapture(0);
while(1):
    #read frames
    ret, img = cap.read();
    
    #apply mask for background subtraction
    fgmask1 = fgbg1.apply(img);
    fgmask2 = fgbg2.apply(img);
    fgmask3 = fgbg3.apply(img);
    
    cv2.imshow('Original',img);
    cv2.imshow('MOG',fgmask1);
    cv2.imshow('MOG2',fgmask2);
    cv2.imshow('GMG',fgmask3);
    k = cv2.waitKey(30) & 0xff;
    if k == 27:
        break;

cap.release();
cv2.destroyAllWindows();

OUTPUT:

We can see that there is a lot of noise in the resultant image for BackgroundSubtractorGMG, hence it is always preferred to use morphological transformation to the result to remove the noises.

Implemented code in Python:

#importing libraries
import numpy as np
import cv2

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3));

#creating object
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG();

# capture frames from a camera 
cap = cv2.VideoCapture(0);
while(1):
    #read frames
    ret, img = cap.read();
    
    #apply mask for background subtraction
    fgmask = fgbg.apply(img);
    
    #with noise frame
    cv2.imshow('GMG noise',fgmask);
    
    #apply transformation to remove noise
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel);
    
    #after removing noise
    cv2.imshow('GMG',fgmask);
    
    k = cv2.waitKey(30) & 0xff;
    if k == 27:
        break;

cap.release();
cv2.destroyAllWindows();

OUTPUT:

Thank you Rishika Gupta for this article.


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert