基于MATLAB的Horn-Schunck光流估计算法
项目简介
本项目是一个基于MATLAB环境完整复现的计算机视觉经典算法——Horn-Schunck (H&S) 光流估计算法。该项目不依赖外部视频文件,而是内置了合成数据生成模块,能够演示从图像序列生成、时空导数计算、变分模型迭代求解到最终光流场可视化的全过程。
Horn-Schunck算法是一种建立在亮度恒定假设(Brightness Constancy Assumption)和全局平滑约束(Global Smoothness Constraint)基础上的全局光流计算方法。本项目通过最小化能量泛函,求解欧拉-拉格朗日方程,从而获得图像中每个像素点的高精度稠密运动矢量。
功能特性
- 内置合成数据生成:无需外部数据集,通过代码自动生成包含高斯平滑边缘和矩形纹理的测试图像对,模拟特定的平移运动。
- 经典H&S算法实现:完整实现了经典的变分光流框架,包含拉普拉斯平滑项和数据保真项的平衡。
- 有限差分计算:利用 2x2x2 的时空卷积核精确计算图像在 x, y, t 方向的偏导数。
- 迭代求解器:采用类Jacobi/Gauss-Seidel迭代策略求解大型稀疏线性方程组,支持自定义迭代次数和平滑系数。
- 多维可视化结果:提供两种光流可视化方式——稀疏矢量场(Quiver图)和稠密光流色彩映射(Color Coded Flow),直观展示运动的方向和速率。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(用于图像滤波和显示函数)
算法原理与实现细节
本项目在
main.m 中实现了以下核心逻辑:
1. 数据准备与预处理
程序首先清空环境,随后调用内部函数生成两帧尺寸为 200x200 的合成图像。
- 场景构建:图像中心包含一个高斯分布的斑点和一个矩形块。
- 运动模拟:第二帧图像相对于第一帧向右下方移动了 (dx=2.5, dy=1.5) 个像素。
- 真实感模拟:对图像应用了高斯模糊以模拟光学模糊,并添加了少量高斯白噪声以测试算法的鲁棒性。
- 归一化:所有输入图像数据均被归一化到 [0, 1] 区间并转换为双精度浮点数。
2. Horn-Schunck 核心计算
光流计算过程封装在核心函数中,具体步骤如下:
A. 时空导数计算
使用经典的 Horn-Schunck 差分核计算图像的梯度:
- 核大小:2x2x2
- Ix (水平梯度):计算两帧图像在 x 方向的加权差分。
- Iy (垂直梯度):计算两帧图像在 y 方向的加权差分。
- It (时间梯度):计算两帧图像对应位置的亮度差。
B. 局部平均速度计算
为了实现全局平滑约束,算法利用卷积核近似拉普拉斯算子。项目中使用的平均滤波核权重矩阵为:
- 中心邻域 (上下左右):权重 1/6
- 对角邻域 (四个角):权重 1/12
- 中心点:权重 0
该步骤用于获取当前像素邻域的平均速度向量。
C. 迭代更新 (欧拉-拉格朗日方程)
程序执行固定次数(默认100次)的迭代更新。每次迭代根据当前的光流估值更新速度场 (u, v)。更新公式基于最小化能量泛函导出:
- 计算分母项 D = alpha^2 + Ix^2 + Iy^2
- 计算中间项 P = Ix * u_avg + Iy * v_avg + It
- 更新 u = u_avg - Ix * (P / D)
- 更新 v = v_avg - Iy * (P / D)
其中
alpha (默认为1.0) 是平滑系数,控制流场的平滑程度。
3. 光流可视化
计算完成后,项目通过两种方式展示结果:
- 稀疏箭头图:对光流场进行下采样(步长为10),使用红色箭头(Quiver)在原图上绘制运动矢量,箭头的指向代表运动方向,长度代表速率。
- HSV彩色映射:将稠密光流场转换为HSV颜色空间。
*
色相 (Hue):对应光流矢量的角度(方向)。
*
亮度 (Value):对应光流矢量的幅值(速率),并进行了非线性增强以便观察微小运动。
*
结果:不同颜色代表不同运动方向,明暗程度代表运动快慢。
代码结构说明
主程序入口
负责初始化环境、调用数据生成函数、设置算法参数(alpha=1.0, iterations=100)、记录计算时间,并最终调用可视化函数。
HornSchunck 函数
算法的核心实现。接收两帧图像及参数,执行卷积操作计算梯度,并通过循环迭代求解光流分量 u 和 v。
generateSyntheticData 函数
生成测试用的合成图像序列。不仅生成几何形状(高斯包络和矩形),还负责添加纹理梯度、高斯模糊处理及噪声注入,确保测试数据具有一定的挑战性。
visualizeOpticalFlow 函数
负责绘图逻辑。创建一个包含两个子图的窗口,左侧显示叠加了稀疏箭头的输入图像,右侧显示基于HSV颜色模型的稠密光流图,并附带图例说明。
flowToColor 函数
辅助函数,用于将二维速度场 (u, v) 转换为 RGB 图像。处理了极坐标转换、HSV空间映射以及最终的 RGB 合成,包含对最大幅值的自适应归一化处理。
使用方法
- 确保 MATLAB 已安装并在路径中包含本项目文件。
- 直接运行
main 函数。 - 程序将自动生成测试图像,在命令行输出迭代进度,并在计算完成后弹出一个图形窗口显示输入序列和计算出的光流场结果。