基于梯度法的简易MATLAB光流场计算项目
项目介绍
本项目实现了一个基于经典梯度法(Lucas-Kanade 算法)的光流场计算模型。该模型通过分析连续两帧图像序列中亮度的时空梯度变化,推导出图像中像素点的运动矢量。该项目旨在提供一个纯净、无第三方工具箱依赖的算法原型,展示光流场估计的基本数学原理和实现流程,非常适合计算机视觉初学者理解亮度恒定假设和局部一致性假设。
功能特性
- 自主生成测试序列:内置模拟数据生成功能,可产生带噪声并具有预设位移(dx=3, dy=2)的运动圆环图像序列。
- 鲁棒的梯度计算:采用特定的 $2 times 2$ 卷积核进行空间与时间维度的导数提取,结合跨帧平均技术增强对噪声的抵抗力。
- 局部约束求解:应用 Lucas-Kanade 局部区域一致性假设,通过最小二乘法求解超定方程组,估算最优运动矢量。
- 病态区域过滤:通过矩阵条件数及行列式检查,自动识别并排除纹理缺失(如纯色区域)导致的无效估值。
- 多维度可视化:提供原始序列对比、降采样位移矢量图以及运动幅度热力图的综合展示。
使用方法
- 确保您的计算机上已安装 MATLAB 环境。
- 将程序代码文件放置在 MATLAB 的工作路径下。
- 在命令行窗口直接运行该程序的主函数。
- 程序将自动生成模拟运动图像并弹出计算结果的可视化图形窗口。
- 观察命令行输出的预设位移与实际估计位移的对比结果。
系统要求
- MATLAB R2016a 或更高版本。
- 无需安装 Image Processing Toolbox(程序已内置所需的基础图像处理辅助函数)。
实现逻辑与算法细节
#### 1. 模拟环境构建
程序首先创建两帧 $256 times 256$ 的灰度图像。在第一帧中绘制一个中心位于 (128, 128) 的圆。在第二帧中,将该圆移动至 (131, 130)。为了模拟真实场景,程序向图像中添加了随机高斯噪声,并利用内置的高斯滤波算法进行平滑处理,以优化后续的一阶导数计算。
#### 2. 时空梯度估计
程序核心基于光流约束方程 $I_x u + I_y v + I_t = 0$。
- 空间梯度 ($I_x, I_y$):利用四像素平均差分算子计算水平和垂直方向的亮度变化。
- 时间梯度 ($I_t$):通过两帧图像之间的像素差值并结合空间平均,获取随时间演变的亮度变化率。
#### 3. 最小二乘求解
由于光流约束方程在单个像素点上有两个未知数($u, v$),程序引入了 $9 times 9$ 的局部窗口假设,即认为该窗口内所有像素的运动矢量一致。
- 构建方程组:将窗口内 81 个像素的梯度数据组合成矩阵 $A$ 与向量 $b$。
- 正规方程求解:计算 $A^T A$ 的逆矩阵来获得最小二乘解。
- 数值稳定控制:通过检查 $A^T A$ 的矩阵行列式(需大于 $1e-6$)和条件数(需小于 $1e6$)来确保结果的可靠性,避免在图像平滑区域产生错误的运动估计。
#### 4. 可视化与评估
- 矢量场展示:为了防止箭头过密,程序对计算出的光流场进行了 8 倍降采样处理,使用红色箭头(Quiver 图)叠加在原始图像上显示运动方向和大小。
- 运动强度:通过计算每个像素点的模长 $sqrt{u^2 + v^2}$ 生成热力图,直观反映运动物体的轮廓。
- 精度验证:程序最后会统计运动幅度大于阈值的像素点,计算其平均运动分量,并与预设的偏移量(3.0, 2.0)进行比对,以验证算法的准确性。
关键辅助功能
程序内部集成了一个自定义的高斯算子生成函数,用于在不依赖额外工具箱的情况下生成标准的高斯卷积核,确保了程序在基础 MATLAB 环境下的独立运行能力。