返回

帧差法与运动检测

Frame Difference & Motion - 相邻帧变化检测
第三章 / 简单背景方法
参数面板

播放连续帧运动序列,点击像素后只追踪当前像素的前后帧差分、阈值判定和运动掩膜结果。

连续帧播放
9
52
6
10
帧差法只比较 I(t) 与 I(t-1),阈值越低,变化区域越容易被标为运动。
窗口定位辅助操作
用方向键或下方 4 个按钮移动当前窗口;也可以直接点击原图或结果图跳转。
当前像素 (48, 42)4081 / 6144
方向
概念说明

帧差法怎样发现运动

帧差法通过比较相邻帧,把发生变化的位置转换成运动掩膜。图源:项目帧差法三联图
任务

当我们看一段视频,想知道哪些区域在动、哪些背景保持不动时,需要比较连续两帧的像素差异。问题是差异多大才算运动,以及如何减少噪声和拖影的干扰。

思路

常用办法是先算当前帧与前一帧对应位置的灰度绝对差,再用阈值把差值分成“静止”和“运动”两类;更稳的做法是三帧差法,比较当前帧与前后帧的两次差异,取交集来抑制噪声和空洞。

观察

切换播放或拖动到不同帧,对比当前帧、前一帧、差分图和运动掩膜:阈值调低会连噪声一起标成运动,目标移动越快、帧间距越大,运动区域越宽。

方向键移动 / 点击任意帧、差分图或掩膜定位像素当前结果像素 (48, 42)
4081 / 6144
连续帧小人运动序列
公共序列生成器输出 96×6424 帧;当前计算第 9 帧。
前一帧 I(t-1) / t=896×64
I(t-1)(48,42) = 96
当前帧 I(t) / t=996×64
I(t)(48,42) = 219
前向差分 |I(t)-I(t-1)|96×64
差值 = |219 - 96| = 123
二值运动掩膜96×64
原始判定 D = 1,T = 52
形态学清理结果96×64
清理后判定:运动候选像素
当前位置
(48, 42)
当前差值
123
运动像素数量
349(5.7%)
阈值比较
运动候选像素
当前像素时间线
每个柱表示选中像素在连续帧中的灰度值;红色表示该帧被判为运动。
I = 219, D = 1
选中像素

当前查看 (48, 42),两帧灰度为 96 / 219

差分与阈值

前向差分 123,当前阈值 T = 52

运动判定

帧差法只要求前向差分超过阈值。当前结果:运动候选像素

动态像素代入

点击任意图像都会更新同一个像素坐标,下面公式直接使用当前像素的真实灰度值。

帧差法判定
Dt(x,y) = [ |It- It-1| >T ] = [|219-96|>52] = [123>52] =1
当前位置前向差分为 123(保留一位小数),阈值 T = 52。
形态学清理
Bclean =Close(B) =Erode(Dilate(B))
原始运动像素 283 个,清理后 349 个。闭运算用于填充小空洞、平滑边缘;本页不做连通区域提取。

算法特点

优点:只需要相邻帧作差,计算量小,能快速找出画面变化区域。

限制:对噪声和光照闪动敏感,运动目标内部可能出现空洞,因此常接形态学处理。

教材补充:帧差法示例

当前帧 I_t(x,y)
当前帧 I_t(x,y)
当前帧的前一帧 H
当前帧的前一帧 H
运动目标 D(x,y)
运动目标 D(x,y)

教材补充:对称差分法实验效果

1. 三帧图像序列

输入第一帧、第二帧和第三帧。

(a) 第一帧
(a) 第一帧
(b) 第二帧
(b) 第二帧
(c) 第三帧
(c) 第三帧

2. 两次帧间差

分别计算第一帧与第二帧、第三帧与第二帧的绝对差。

(d) |f1 - f2|
(d) |f1 - f2|
(e) |f3 - f2|
(e) |f3 - f2|

3. 二值化结果

对差分图做阈值化,得到候选运动区域。

(f) 二值化结果
(f) 二值化结果

4. 形态学处理

填充内部空洞,清除小噪声,平滑物体边缘。

(g) 形态学处理结果
(g) 形态学处理结果

5. 结果示意

教材中常将清理后的掩膜叠加或轮廓化作为示意;本页动态实现只到形态学闭运算,不再做连通区域提取。

(h) 清理后掩膜示意
(h) 清理后掩膜示意