CV | 运动目标检测 之 背景差分法

简介

最近开始上手运动目标检测和跟踪,对于传统的目标检测算法比如帧差法、背景差分法、光流法之类的,从理论上学习了无数次,但是从来没有见到过程序长什么样。导致学一遍忘一遍。准备把这几类方法和程序归纳和学习一下,好记性不如烂笔头,有备无患。

背景差分法

转自:https://www.jianshu.com/p/58c6ca1b66af

1. 原理

背景差分法的思想是用图像序列中的当前帧和背景参考模型比较来检测运动物体。其核心是背景的建模方法。这里实现一种简单的背景建模方法,即对视频的全部帧取像素平均值得到背景。
当然,这种简单的算法局限性很大,视频的时长,光线与背景的变化都会对检测效果产生极大的影响。

2. 实现步骤

  • 背景建模: 对视频的全部帧取像素平均值得到背景
  • 比较: 当前帧与背景做差,差值大于一定阈值的像素点识别为前景
  • 提取:在原始帧上扣取出前景

3. 源代码


import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
 
# 读取帧数
img_number = 48
 
# 各帧的集合
all_img = [np.array(Image.open('F:/input/'+str(i+1)+'.jpg', 'r')) for i in range(img_number)]
 
# 帧的宽高
h = all_img[0].shape[0]
v = all_img[0].shape[1]
 
# 计算得到背景
back_img = np.zeros((h, v))
for single_img in all_img:
    back_img += single_img
back_img /= img_number
 
# 保存背景
Image.fromarray(back_img).convert('RGB').save('F:/output/background.jpg')
 
# 原视频与背景逐帧相减后取绝对值 得到前景
front_img = np.array([i - back_img for i in all_img])
front_img = front_img.__abs__()
 
# 前景二值化 设定阈值将前景像素值化为0或1
threshold_level = 50
threshold = np.full((h, v), threshold_level)
front_img = np.array([i < threshold for i in front_img], dtype=np.int8)*255
 
# 在原帧上抠图 得到真实的前景
front_img = np.fmax(np.array(front_img), all_img)
 
# 保存
for i in range(img_number):
    Image.fromarray(front_img[i]).convert('RGB').save('F:/output/'+str(i+1)+'.jpg')
 
# 显示
loc_h = 6
loc_v = int(img_number / loc_h)
for i in range(loc_h * loc_v):
    plt.subplot(loc_v, loc_h, i+1)
    plt.imshow(front_img[i], cmap='gray')
plt.show()
 

视频转为图像是使用matlab实现的。


%将视频转换为图片
clear
clc
 
file_name = 'F:\input.avi';       %视频所在文件夹
obj = VideoReader(file_name);     %读取视频文件
 
numFrames = obj.NumberOfFrames;   %视频总的帧数 
for k = 1: numFrames
    frame = read(obj,k);
    %imshow(frame);                
    gray_frame = rgb2gray(frame); %若每一帧为彩色图片,转换为灰度图
    imshow(frame);                %显示每一帧图片
    %保存每一帧图片
    imwrite(gray_frame,strcat('F:\input\',num2str(k),'.jpg'),'jpg');
end

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!运动目标检测是计算机视觉中的重要任务之一。背景差分法是一种常用的运动目标检测方法之一,其基本原理是通过比较当前帧图像与背景模型的差异来识别出运动目标。 在MATLAB中,你可以使用以下步骤来实现基于背景差分法运动目标检测: 1. 首先,建立一个背景模型。这可以通过采集一段静态视频或者从静态图像序列中选择一些帧作为背景图像来实现。你需要将这些背景图像取平均或者进行其他合适的操作来得到一个背景模型。 2. 加载视频帧或图像序列,并将当前帧与背景模型进行差分。你可以使用`imabsdiff`函数来计算两幅图像的差异。 3. 对差分结果进行阈值处理,以得到二值图像。你可以使用`im2bw`函数将差分结果转换成二值图像,并设定适当的阈值。 4. 对二值图像进行形态学运算,以去除噪声并连接相邻区域。你可以使用`imopen`和`imclose`函数来进行开运算和闭运算操作。 5. 根据目标特征对二值图像中的连通区域进行检测和分析。你可以使用`regionprops`函数获取连通区域的属性,例如面积、边界框等。 以上是背景差分法在MATLAB中的基本流程。当然,你还可以根据实际需求进行适当的优化和改进,例如应用自适应背景更新、使用多帧背景模型等方法来提高检测效果和鲁棒性。希望对你有所帮助!如有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值