Python OpenCV – Resta de fondo

La sustracción de fondo es una de las principales tareas de procesamiento de imágenes. Se utiliza en varias aplicaciones de procesamiento de imágenes como segmentación de imágenes, detección de objetos, etc. OpenCV nos proporciona 3 tipos de algoritmos de sustracción de fondo:-

  • FondoSubtractorMOG
  • FondoSubtractorMOG2
  • FondoSubtractorGMG

Normalmente, podemos realizar la sustracción de fondo usando la sustracción de array, es decir, simplemente sustrayendo el cuadro estático del video. Pero esto tiene muchos inconvenientes. Es un algoritmo muy menos eficiente para la sustracción de fondo porque no se actualiza solo. Este problema está siendo manejado por los algoritmos de sustracción de fondo proporcionados por OpenCV.

Uso de BackgroundSubtractorMOG

Para usar BackgroundSubtractorMOG podemos usar

cv2.bgsegm.createBackgroundSubtractorMOG()

Luego podemos aplicarlo usando el método «aplicar» en cada cuadro del video. Considere el siguiente ejemplo para una mejor comprensión del tema.

Ejemplo:

import numpy as np
import cv2
  
cap = cv2.VideoCapture('sample.mp4')
  
# initializing subtractor 
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() 
  
while(1):
    ret, frame = cap.read()       
  
    # applying on each frame
    fgmask = fgbg.apply(frame)  
  
    cv2.imshow('frame', fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
  
cap.release()
cv2.destroyAllWindows()

Producción :

Usando BackgroundSubtractorMOG2

En el sustractor anterior funcionaba bastante bien pero en situaciones del mundo real, también hay presencia de sombras. En BackgroundSubtractorMOG2, también podemos detectar sombras y en la salida del siguiente código, se ve claramente. Para aplicar BackgroundSubtractorMOG2, utilice

cv2.createBackgroundSubtractorMOG2()

Ejemplo:

import numpy as np
import cv2
  
cap = cv2.VideoCapture('sample.mp4')
  
# initializing subtractor 
fgbg = cv2.createBackgroundSubtractorMOG2()
  
while(1):
    ret, frame = cap.read()
   
    # applying on each frame
    fgmask = fgbg.apply(frame)
  
    cv2.imshow('frame', fgmask)  
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
  
cap.release()
cv2.destroyAllWindows()

Producción :

Usando BackgroundSubtractorGMG

Este algoritmo combina la estimación estadística de la imagen de fondo y la segmentación bayesiana por píxel. Emplea un algoritmo de segmentación de primer plano probabilístico que identifica posibles objetos de primer plano mediante la inferencia bayesiana. Para usar BackgroundSubtractorGMG, use

cv2.bgsegm.createBackgroundSubtractorGMG()

Nota: obtendremos una ventana negra durante los primeros fotogramas.

import numpy as np
import cv2
  
cap = cv2.VideoCapture('sample.mp4')
  
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
  
# initializing subtractor 
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()
  
while(1):
    ret, frame = cap.read()
  
    # applying on each frame
    fgmask = fgbg.apply(frame)
  
    fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)     
  
    cv2.imshow('frame', fgmask)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
  
cap.release()
cv2.destroyAllWindows()

Producción :

Publicación traducida automáticamente

Artículo escrito por ayushmankumar7 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *