La sustracción de fondo es una forma de eliminar el fondo de la imagen. Para lograr esto, extraemos el primer plano en movimiento del fondo estático.
La sustracción de fondo tiene varios casos de uso en la vida cotidiana. Se utiliza para la segmentación de objetos, la mejora de la seguridad, el seguimiento de peatones, el recuento del número de visitantes, el número de vehículos en el tráfico, etc. Es capaz de aprender e identificar la máscara de primer plano.
En OpenCV tenemos 3 algoritmos para hacer esta operación –
BackgroundSubtractorMOG: es un algoritmo de segmentación de fondo/primer plano basado en una mezcla gaussiana.
BackgroundSubtractorMOG2: también es un algoritmo de segmentación de fondo/primer plano basado en una mezcla gaussiana. Proporciona una mejor adaptabilidad a diferentes escenas debido a cambios de iluminación, etc.
BackgroundSubtractorGMG: este algoritmo combina la estimación estadística de la imagen de fondo y la segmentación bayesiana por píxel.
Cómo aplicar las funciones integradas de OpenCV para la resta de fondo –
Paso n. ° 1: cree un objeto para indicar el algoritmo que estamos usando para la resta de fondo.
Paso #2 – Aplicar backgroundsubtractor.apply()
la función en la imagen.
A continuación se muestra la implementación de Python para la sustracción de fondo:
# 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();
Producción:
Podemos ver que hay mucho ruido en la imagen resultante para BackgroundSubtractorGMG
, por lo que siempre se prefiere usar la transformación morfológica del resultado para eliminar los ruidos.
# 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();
Producción:
Publicación traducida automáticamente
Artículo escrito por rishikagupta1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA