【CV】视频图像背景分割MOG2,KNN,GMG

当涉及背景分割器(Background Subtractor)时,Mixture of Gaussians(MOG2)、K-Nearest Neighbors(KNN)和Geometric Multigid(GMG)是常用的算法。它们都用于从视频流中提取前景目标,并在计算机视觉和图像处理任务中发挥重要作用。

Mixture of Gaussians (MOG2):

MOG2 是一种基于高斯混合模型的背景分割器,它使用多个高斯分布对每个像素的颜色进行建模。该模型适用于场景中有很多变化和动态光照条件的情况。MOG2 背景分割器在处理光照变化和动态背景时表现良好。

K-Nearest Neighbors (KNN):

KNN 背景分割器利用K最近邻算法来识别像素的前景或背景。该算法根据像素的颜色特征和邻近像素的情况进行分类。KNN 背景分割器在处理运动目标和部分遮挡时可能表现良好。

Geometric Multigid (GMG):

GMG 背景分割器结合了几何学和统计学的方法,通过对几何变化和像素之间的关系进行建模来进行背景分割。GMG 背景分割器在动态背景和光照变化下具有较好的鲁棒性。

优劣对比:

MOG2 适用于动态光照条件下的场景,但对于相对静态的背景可能效果不佳。

KNN 对于处理运动目标和部分遮挡情况可能更有效,但在复杂动态背景下表现可能欠佳。

GMG 在动态背景和光照变化下表现较好,但对于较为静态的场景可能不够精确。

示例代码(使用OpenCV库):

下面是一个简单的示例代码,演示了如何使用OpenCV库中的这三种背景分割器:

python 复制代码
import cv2

# 读取视频文件
cap = cv2.VideoCapture('input_video.mp4')

# 创建背景分割器对象
mog2_bg_subtractor = cv2.createBackgroundSubtractorMOG2()
knn_bg_subtractor = cv2.createBackgroundSubtractorKNN()
gmg_bg_subtractor = cv2.bgsegm.createBackgroundSubtractorGMG()

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 背景分割
    mog2_mask = mog2_bg_subtractor.apply(frame)
    knn_mask = knn_bg_subtractor.apply(frame)
    gmg_mask = gmg_bg_subtractor.apply(frame)

    # 显示前景对象
    cv2.imshow('MOG2 Foreground', mog2_mask)
    cv2.imshow('KNN Foreground', knn_mask)
    cv2.imshow('GMG Foreground', gmg_mask)

    if cv2.waitKey(30) & 0xFF == 27:  # 按下Esc键退出
        break

cap.release()
cv2.destroyAllWindows()

P.S.简单补充下高斯混合模型的知识

高斯混合模型(Gaussian Mixture Model,GMM)是一种用于对数据进行建模的概率模型。它假设数据是由多个高斯分布组合而成的,每个高斯分布对应着数据的一个聚类。GMM通常用于聚类分析和密度估计。

在GMM中,每个高斯分布都由均值和方差参数化,整个模型由多个高斯分布组成。给定数据后,可以使用期望最大化(Expectation-Maximization,EM)算法来估计GMM的参数,包括每个高斯分布的均值、方差和混合系数。

下面是一个使用Python的示例,演示如何使用scikit-learn库中的GaussianMixture类来构建和拟合一个GMM模型:

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture

# 生成示例数据
np.random.seed(0)
n_samples = 1000
# 生成两个高斯分布的数据
X = np.concatenate([np.random.normal(0, 1, int(0.3 * n_samples)),
                    np.random.normal(5, 1, int(0.7 * n_samples))]).reshape(-1, 1)

# 构建并拟合GMM模型
gmm = GaussianMixture(n_components=2, random_state=42)
gmm.fit(X)

# 绘制拟合的GMM模型
x = np.linspace(-5, 10, 1000)
x = x.reshape(-1, 1)
plt.hist(X, bins=30, density=True, alpha=0.5)
plt.plot(x, np.exp(gmm.score_samples(x)), label='GMM')
plt.xlabel('x')
plt.ylabel('Probability')
plt.legend()
plt.show()

在使用 GaussianMixture 模型时,random_state 参数用于控制初始化高斯混合模型的随机性,包括初始化聚类中心、对数似然函数等,从而控制着模型中的随机数生成过程

设置 random_state 参数的主要目的是为了在需要重复实验或结果可复现的情况下,确保每次运行模型时都能得到相同的结果。

当设置了 random_state 参数时,模型将会使用指定的随机种子来初始化,确保每次运行模型时都得到相同的随机初始化结果。这样可以使得模型的输出对于其他人来说更容易理解和复现。

参数 random_state 可以传入一个整数值,例如 random_state=42,这个整数值就是随机种子。通过设置相同的随机种子,可以确保在相同数据集上运行模型时得到一致的结果。

相关推荐
CoovallyAIHub3 小时前
突破360°跟踪极限!OmniTrack++:全景MOT新范式,HOTA指标狂飙43%
深度学习·算法·计算机视觉
CoovallyAIHub4 小时前
首个大规模、跨模态医学影像编辑数据集,Med-Banana-50K数据集专为医学AI打造(附数据集地址)
深度学习·算法·计算机视觉
LabVIEW开发9 小时前
LabVIEW液位边缘检测
图像处理·计算机视觉·labview·labview知识·labview功能·labview程序
诗句藏于尽头10 小时前
MediaPipe+OpenCV的python实现交互式贪吃蛇小游戏
人工智能·python·opencv
音视频牛哥11 小时前
从云平台到系统内核:SmartMediakit如何重构实时视频系统
计算机视觉·音视频·gb28181对接·rtsp播放器rtmp播放器·smartmediakit·智能机器人低延迟播放方案·rtmp摄像头同屏推流
智驱力人工智能13 小时前
智能安全管理 基于视觉分析的玩手机检测系统 手机行为AI模型训练 边缘计算手机行为监测设备
人工智能·安全·目标检测·计算机视觉·智能手机·视觉检测·边缘计算
王哈哈^_^1 天前
【数据集】【YOLO】【目标检测】共享单车数据集,共享单车识别数据集 3596 张,YOLO自行车识别算法实战训推教程。
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
std78791 天前
MATLAB 实用案例三:图像边缘检测、数据拟合与可视化、信号处理
图像处理·opencv·计算机视觉
躺平的赶海人1 天前
Halcon实战:精准定位与提取:基于形态学处理的猴子眼睛区域检测完整方案
图像处理·计算机视觉·halcon·形态学操作
_168168ww1 天前
计算机大类常见单词
计算机视觉