背景减法–OpenCV
背景减除是一种从图像中消除背景的方法。为此,我们从静态背景中提取运动前景。
背景减除在日常生活中有几个使用案例,它被用于对象分割、安全增强、行人跟踪、统计访客数量、交通中的车辆数量等。它能够学习和识别前景遮罩。
在 OpenCV 中,我们有 3 个算法来完成这个操作–
背景减法图–这是一种基于高斯混合的背景/前景分割算法。
【Background 减法公式 2–也是一种基于高斯混合的背景/前景分割算法。它提供了更好的适应因光照变化等变化的场景。
背景差分算法–该算法结合了统计背景图像估计和逐像素贝叶斯分割。
如何将 OpenCV 内置函数应用于背景减除–
步骤# 1–创建一个对象来表示我们用于背景减除的算法。
步骤# 2–在图像上应用backgroundsubtractor.apply()
功能。
Below is the Python implementation for Background subtraction –
# 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();
输出:
我们可以看到BackgroundSubtractorGMG
的合成图像中有很多噪声,因此总是倾向于对结果使用形态学变换来去除噪声。
# 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();
输出: