光流场经典算法 - Lucas-Kanade (LK) 算法实现
项目介绍
本项目提供了一个基于 MATLAB 环境实现的 Lucas-Kanade (LK) 光流估计算法。该算法是计算机视觉领域处理运动估计的经典方法,通过分析图像序列在时间上的亮度演变,推导出图像中各点的瞬时运动速度。本项目通过构建模拟图像序列,完整展示了从图像预处理、梯度计算到局部约束求解及结果可视化的全过程,旨在精确提取图像中的局部运动矢量。
功能特性
- 模拟序列生成:程序能够自动生成包含特定几何形状(矩形)移动的连续两帧图像,允许自定义位移矢量(du, dv)。
- 高斯平滑预处理:内置高斯滤波核生成功能,对原始图像进行平滑处理,以降低梯度计算过程中的噪声干扰。
- 梯度算子实现:利用卷积层级计算图像的水平、垂直及时间维度梯度(Ix, Iy, It)。
- 局部窗口约束:在目标像素周围建立 7x7 的局部邻域,将单点光流不可解问题(孔径问题)转化为超定方程组。
- 稳健最小二乘求解:通过计算结构张量的特征值来评估矩阵的良定性,剔除病态区域,利用最小二乘法精确求解运动分量。
- 多维度可视化:提供原始序列对比、下采样光流矢量场(Quiver Plot)以及运动幅度彩色热力图。
使用方法
- 启动 MATLAB 软件。
- 将主程序代码保存并运行。
- 程序将自动执行以下流程:生成模拟图像 -> 执行 LK 算法 -> 弹出包含四张子图的可视化窗口。
- 在结果界面观察红色矢量箭头对应的运动方向,以及热度图反映的运动区域。
系统要求
- 运行环境:MATLAB R2016b 或更高版本。
- 所需工具箱:Image Processing Toolbox(图像处理工具箱)。
算法实现逻辑
算法严格遵循以下技术流程:
- 参数初始化:设定图像尺寸为 200x200,定义局部分析窗口大小为 7x7 像素。
- 图像构建与平滑:
- 第一帧在中心区域生成一个白色矩形。
- 第二帧通过改变索引范围,使矩形产生水平 (2像素) 和垂直 (1像素) 的位移。
- 使用自定义高斯核(sigma=1.5,size=5)对两帧进行卷积运算。
- 梯度张量计算:
- 使用 [-1 1; -1 1] 算子计算水平梯度 Ix。
- 使用 [-1 -1; 1 1] 算子计算垂直梯度 Iy。
- 使用 [1 1; 1 1] 算子对两帧差异进行加权,得出时间梯度 It。
- 逐像素求解:
- 遍历图像内部区域(避开边缘边界)。
- 提取当前像素周围 7x7 范围内的 Ix, Iy, It 数值并向量化。
- 构造系数矩阵 A = [Ix, Iy] 与常数项向量 b = -It。
- 计算 A 的转置与 A 的乘积(ATA)。
- 稳定性判定:只有当 ATA 矩阵的最小特征值大于 0.01 时,才认为当前窗口特征显著,进行最小二乘解算。
- 结果生成:将计算出的位移矢量 (u, v) 存储到对应的光流场矩阵中。
关键函数与技术细节分析
- 手动高斯核实现:
通过 meshgrid 构建坐标系,并基于指数公式生成高斯分布权重,最后进行归一化处理。这保证了算法在不依赖特定外部库的情况下也能完成图像去噪。
- 超定方程组求解:
LK 算法的核心在于假设局部窗口内运动一致。对于 7x7 窗口,形成了 49 个方程构成 A * [u; v] = b 系统。代码通过 vel = ATA (A' * b) 直接利用 MATLAB 的反斜杠运算符高效完成最小二乘求解。
- 特征值过滤机制:
在计算光流前,通过 min(eig(ATA)) 检查局部区域的纹理信息。在图像平滑区域,由于梯度接近零,矩阵倾向于奇异。设定 0.01 的阈值能有效过滤图像噪声点和无特征区域,防止产生随机运动矢量。
- 可视化技术:
- 矢量图显示:为了防止箭头过于密集影响观察,代码对结果进行了步长为 5 的下采样处理。
- 运动模值:利用 sqrt(u^2 + v^2) 计算运动强度,通过 jet 色表将运动量级直观表现为冷暖色调,从而清晰辨别物体运动轮廓。