最近做opencv项目时,使用肤色分割的方法检测目标物体时,背景带来的干扰非常让人头痛。于是先将背景分割出去,将影响降低甚至消除。由于初次接触opencv,叙述不当的地方还请指正。

背景减除法

(以下文字原文来源于https://docs.opencv.org/3.4.7/d8/d38/tutorial_bgsegm_bg_subtraction.html)
背景减除法是很多基于视觉的应用的一个主要预处理步骤。例如使用一个静止的摄像头拍摄进出房间的人数,或是交通摄像头捕获车辆信息等。在以上的例子中,首先你需要单独把人和交通工具提取出来。从技术上来说,你需要从静止的背景中提取移动前景目标。

通常情况下,我们的背景往往是未知的,因此需要通过一定的方法得到视频背景,然后用新的图像减去背景图片即可。

在opencv中提供了几种背景减除的方法:

(1)BackgroundSubtractorMOG

这是基于高斯混合模型的算法,混合模型表示了观测数据在总体中的概率分布,高斯分布即正态分布,正态分布如下图:
(图片来源于网络)

而高斯混合模型就是使用高斯分布的混合模型,由于高斯分布具有良好的数学性质和计算性能,它的概率分布遵循高斯分布。

cv2.bgsegm.createBackgroundSubtractorMOG()
使用时可以不用传入参数

import cv2cap = cv2.VideoCapture(0)
fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))while cap.isOpened():ret, frame = cap.read()# 用于计算前景掩模fgmask = fgbg.apply(frame)_, binary = cv2.threshold(fgmask, 215, 255, cv2.THRESH_BINARY)binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, se)res = cv2.bitwise_and(frame, frame, mask=binary)cv2.imshow("res", res)if cv2.waitKey(1000 // 12) & 0xff == ord('q'):breakcap.release()
cv2.destroyAllWindows()

运行结果:

(2)BackgroundSubtractorMOG2

它是改进的高斯混合模型,为各个参数设置了一些合适的值。

import cv2cap = cv2.VideoCapture(0)
fgbg = cv2.createBackgroundSubtractorMOG2()
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))while cap.isOpened():ret, frame = cap.read()fgmask = fgbg.apply(frame)_, binary = cv2.threshold(fgmask, 215, 255, cv2.THRESH_BINARY)binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, se)backImage = fgbg.getBackgroundImage()res = cv2.bitwise_and(frame, frame, mask=binary)cv2.imshow("backImage", backImage)cv2.imshow("res", res)if cv2.waitKey(1000 // 12) & 0xff == ord('q'):breakcap.release()
cv2.destroyAllWindows()

运行结果:

(3)BackgroundSubtractorGMG

GMG:Geometric Multigid,几何多重网格。它默认使用前120帧图像进行建模,使用贝叶斯推断方法判断可能的前景物体。

import cv2cap = cv2.VideoCapture(0)
fgbg = cv2.bgsegm.createBackgroundSubtractorGMG()
se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))while cap.isOpened():ret, frame = cap.read()fgmask = fgbg.apply(frame)_, binary = cv2.threshold(fgmask, 215, 255, cv2.THRESH_BINARY)binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, se)res = cv2.bitwise_and(frame, frame, mask=binary)cv2.imshow("res", res)if cv2.waitKey(1000 // 12) & 0xff == ord('q'):breakcap.release()
cv2.destroyAllWindows()

运行结果:

以上这三种方法对于检测运动物体行之有效,但如果检测静态物体就不适合了。

帧差法

在可以确定背景时采用帧差法,此方法不仅可以用于动态目标检测,也能检测静态目标。
帧差法需要一个变量来检测当前是第几帧。即通过后面的帧减去第一帧得到所需前景。
(代码参考https://blog.csdn.net/qq_32791307/article/details/85134536)

import cv2cap = cv2.VideoCapture(0)
frameNum = 0while cap.isOpened():ret, frame = cap.read()frameNum += 1tmp = frame.copy()if frameNum == 1:bgFrame = cv2.cvtColor(tmp, cv2.COLOR_BGR2GRAY)elif frameNum > 1:foreFrame = cv2.cvtColor(tmp, cv2.COLOR_BGR2GRAY)foreFrame = cv2.absdiff(foreFrame, bgFrame)_, thresh = cv2.threshold(foreFrame, 30, 255, cv2.THRESH_BINARY)gaussian = cv2.GaussianBlur(thresh, (3, 3), 0)cv2.imshow('gaussian', foreFrame)if cv2.waitKey(1000 // 12) & 0xff == ord('q'):breakcap.release()
cv2.destroyAllWindows()

运行结果:

上述除了使用滤波的方法,也可以直接用cv2.subtract()进行图像减法运算。

opencv 去除背景算法的比较相关推荐

  1. opencv 去除背景

    过程:先拍一张背景图,然后待去除背景的图片减去背景,然后二值化,再调用findContours得到轮廓,然后把必要的轮廓合并起来,最后用boundingRect包起来,作为ROI区域保存该区域内的图片 ...

  2. OpenCV python GrabCut算法提取前景背景图片

    OpenCV python GrabCut算法提取前景背景图片 处理图片:[lena_color.jpg] 手动mask[mask.jpg] import numpy as np import cv2 ...

  3. pythonopencv算法_python opencv之分水岭算法示例

    本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下: 目标 使用分水岭算法对基于标记的图像进行分割 使用函数cv2.watershed() 原理: 灰度图像可以被看成拓扑平面, ...

  4. 编程去除背景绿幕抠图,基于.NET+OpenCVSharp

    摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时"抠人像.替换背景"的方式,对于项目中的算法进行了分析.本文中给出了简化OpenCVSharp中Mat.M ...

  5. Python OpenCV去除图片水印

    问题描述 去除百度水印 1.jpg,背景简单 2.jpg,背景复杂 解决方案 安装 pip install opencv-python pip install numpy 方法一.OpenCV提取颜色 ...

  6. OpenCV使用 GrabCut 算法进行交互式前景提取

    OpenCV使用 GrabCut 算法进行交互式前景提取 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python,OpenCV中的GrabCut 算法来提取图像中的前景,并为此创建一个交互 ...

  7. 用openCV去除文字中乱入的线条

    用openCV去除文字中乱入的线条 原文:http://blog.csdn.net/sinat_28309919/article/details/73604109 目录(?)[+] 今天上午,朋友发来 ...

  8. pythonopencv算法_python opencv之SURF算法示例

    本文介绍了python opencv之SURF算法示例,分享给大家,具体如下: 目标: SURF算法基础 opencv总SURF算法的使用 原理: 上节课使用了SIFT算法,当时这种算法效率不高,需要 ...

  9. 使用OpenCV的分水岭算法

    <使用OpenCV的分水岭算法>   之前利用watershed想对相对前背景较为明显的图像进行图像语义分割的预打标,因为虽然前景明显,但是边缘打标也是很困难的,可以用该方法对大部分的边缘 ...

最新文章

  1. java查看对象锁级别_对象级别锁 vs 类级别锁(Java)
  2. Gallery的使用(一)
  3. 使用CSS3悬停效果打造不同的页面版式
  4. python中中括号中的负数
  5. 导入依赖和加上注释后,lombok gettersetter识别不到
  6. 不同用户同时并发测压_简单聊聊吞吐量(TPS)、QPS、并发数、响应时间(RT)概念...
  7. ado mfc mysql_MFC 中用ADO访问数据库
  8. SSM框架之Spring MVC(二)常用注解说明
  9. C语言程序设计练习题解
  10. 读书笔记-泛型有限通配符
  11. 首都师范 博弈论 5 5 1大联盟合作博弈中如何量化决策影响力 班扎夫权力指数
  12. 真正的即插即用!盘点11种CNN网络设计中精巧通用的“小”插件
  13. 通过快捷指令给 Mac 添加右键菜单「使用 VSCode 打开」
  14. Floyd-Warshall算法过程中矩阵计算方法—十字交叉法(转)
  15. 【修真院“善良”系列之十】初级Java程序员的学习路线 1
  16. MMDet——基于Chamfer Distance评估点集
  17. oeasy教您玩转vim - 21 - 状态横条
  18. 计算机房灭火器如何配置,机房灭火器配置标准
  19. 登录的双因素认证-Golang实现
  20. ReadingTime-十一月

热门文章

  1. DMSP/OLS夜间灯光数据——应用
  2. iframe(标签的使用)
  3. 小米Note4、小米8、一加6刷机(三方rec+rom+root)
  4. 汽车在线升级系统(OTA)开发浅析
  5. sealed java_sealed 关键字
  6. R语言中的fitted() 和 predict()
  7. 简述锂离子电池的分类及结构
  8. Oracle数据库服务器端和客服端的安装
  9. 数据脱敏技术的实践指南
  10. sql join备忘