看到网上博客介绍光流法的帖子写的太学术了,那我就用人话来记录一下我对光流法的理解吧
一、光流法定义
“光流” 顾名思义 就是 光的流动,放在图像中的像素级别,可以理解为像素的流动,即同一像素值的流动。
举个例子:
假设你拍摄的是一辆车在前进的场景,假设车的前部从图像中的 (100, 200)
位置开始,并且前一帧和当前帧中车前部的像素有明显的位移。光流法就会估算该点的位移(如 (u=5, v=3)
),意思是该像素在前一帧时位于 (100, 200)
,而在当前帧中它已经移动到了 (105, 203)
。
通过这种方式,光流法不仅能够计算出每个像素的运动,还能够得到图像中物体整体的运动趋势。
(理解:其实就是相当于在一运动的物体上打个标记,看这个标记的运动,这个标记就是光流法中的每个像素)
二、两个假设
(一)假设一:亮度一致性假设(Brightness Constancy Assumption)(打标记)
假设内容:在连续的帧之间,相同物体上的像素的亮度值保持不变。
具体来说,假设在一段时间内,图像中一个像素点代表的是物体的某一部分(例如一辆车的某个部件,或背景中的某个特征),而这个物体在连续的帧之间并没有发生太大变化。因此,假设该物体上相同位置的像素亮度值是相同的,即使物体发生了平移或旋转,物体上的相同点亮度值应该是相等的,或者差异很小。
举例:
- 假设图像中有一个红色球,前一帧中球的像素值为
(255, 0, 0)
(代表红色)。如果该球在下一帧中发生了运动,那么假设这个球的表面没有发生变化,它的颜色(亮度值)应当仍然是(255, 0, 0)
,即相同。
基于这个假设,光流法能够通过 匹配相同亮度的像素 来判断该像素在图像中是如何移动的。
亮度一致性假设的意义:它为光流法提供了一个推断像素运动的依据:如果前后帧中的像素亮度相同(或者非常相似),那么这些像素的运动就可以通过计算其在图像中的位置变化来进行估计
翻译成人话:就是前后两帧相同物体上像素值的亮度是相同的,如果有一个篮球,前面一帧在白天 后面一帧在晚上,那么就不能基于这个假设来判断篮球的运动。
(二)假设二:小运动假设(Small Motion Assumption)(描述物体运动)
假设内容:图像中的物体在相邻帧之间的运动较小,因此可以通过线性化的方式来近似计算光流。
在实际视频中,物体通常不会在短时间内发生剧烈的位移。小运动假设表示,在两帧之间,物体的位移较小,因此我们可以 用一个简单的线性模型 来描述物体的运动。这个假设使得光流计算变得更简便,也使得算法在大多数实际情况中能够快速有效地工作。
例如,假设一个物体在连续两帧中只有微小的位移,可以通过简单的数学公式(如泰勒级数展开的线性近似)来计算光流,而不需要考虑过于复杂的非线性运动模型。
小运动假设的意义:这个假设让光流法能够有效地估算像素运动,而不需要考虑过多的复杂情况。如果物体的位移较大,光流法可能就不太准确,特别是在高速运动或快速场景变化时,光流估计可能会出现误差。
三、建模策略
经过上述学习,我们知道两个假设,一个是标记,另一个是描述物体运动(建模策略:在光流估计过程中为了更好地建模物体的运动而采用的不同方式)。那么描述物体运动的方法包括全局平滑约束 和 金字塔策略。
(一) 全局平滑假设(Horn-Schunck算法)
基本思想:
- 在光流估计中,假设相邻像素的运动应该是 相似的,即图像中的物体(尤其是背景)在一小段时间内的运动通常是平滑的。因此,全局平滑 假设认为,在图像的整个区域内,光流场(每个像素的运动向量)应该是平滑和连续的。
如何实现:
- 全局优化:Horn-Schunck算法通过最小化一个能量函数来估计光流。这个能量函数有两部分:
- 亮度一致性约束:要求在两个相邻的帧中,相同位置的像素亮度变化应该最小,即保持亮度不变。
- 平滑约束:要求相邻像素的光流向量相似,即图像中的大部分区域应该有 相似的运动,尤其是在没有发生大幅度变化的区域(比如静态背景)。
优点:
- 对于平稳的运动场景,能够有效地平滑图像中的运动估计,避免了噪声或不规则运动对结果的影响。
限制:
- 如果图像中存在 快速运动 或 大位移,这种全局平滑会造成光流估计的误差,因为假设运动是平滑的在这些情况下可能不成立。
(二) 多分辨率金字塔(Farneback算法)
基本思想:
- 多分辨率金字塔方法(如Farneback算法)通过 逐层计算光流,即在 低分辨率 下先进行粗略的光流估计,然后再逐步在 更高分辨率 下细化估计,最终获得更精确的光流。
如何实现:
-
金字塔结构:首先,图像被 降采样 成多个分辨率层次,通常从最低分辨率(最小尺寸的图像)开始,每个分辨率上的图像都会计算出相应的光流。在低分辨率下,由于图像细节较少,计算的光流估计会比较粗糙,主要用于捕捉大致的运动趋势。
接着,逐渐向更高分辨率层次上推进,在每个更高分辨率的图像上,使用前一层的估计结果作为初始化,逐渐细化运动估计。通过这种方式,低分辨率 先捕捉 大范围运动,而 高分辨率 进一步细化,能够捕捉到图像的更精细的运动。
优点:
- 由于低分辨率图像对 大范围运动 更加敏感,所以能够很好地 处理大范围的运动(例如快速移动的物体或大范围的相机运动)。
- 可以避免 大位移 或 快速运动 导致的误差,因为在低分辨率下大运动已经得到捕捉,然后逐步细化。
限制:
- 计算复杂度较高,因为需要处理多个分辨率的图像,尤其是在处理高分辨率图像时需要消耗更多的计算资源。
(三)局部运动假设(基于图像块)
-
描述:这种假设认为,在小范围内,像素的运动是相似的。也就是说,图像中的 局部区域(图像块)的像素运动是相似的。这个假设在像素运动较小或者物体运动不剧烈的情况下有效。
-
应用场景:适用于 稀疏光流估计,例如 Lucas-Kanade光流法。这种方法利用局部区域的运动来推断特定点的光流,常用于追踪图像中的特征点(如角点)。
-
核心思想:
- 局部估计:光流场在局部区域内是平滑的,可以通过对小区域的亮度一致性进行计算来估计光流。
- 局部窗口:在一个特定的窗口或区域内,计算相邻像素之间的亮度变化,进而推算出光流。
-
优势与劣势:
- 优势:适合小范围运动,计算高效,能够准确地追踪特征点。
- 劣势:只能估算图像中的特征点光流,不能处理全图的运动,因此无法处理较大范围的运动。
(四)能量最小化方法
-
描述:这类方法通过 最小化能量函数 来求解光流,尝试通过 全局优化 来计算像素之间的运动。这类方法通常基于 Brox光流法,并适用于需要高精度估计的场景,能够较好地应对 大范围运动 和 复杂场景。
-
应用场景:适用于高精度的光流估计任务,如 视频稳像 和 运动分析。
-
核心思想:
- 能量函数:通过定义一个包含亮度一致性和光流平滑的能量函数,来计算图像的光流。
- 全局优化:最小化这个能量函数,找到全图最优的光流解,避免不连续的光流场。
-
优势与劣势:
- 优势:能够提供高精度的光流估计,尤其在复杂场景中表现较好。
- 劣势:计算量大,可能需要较长的时间来进行全局优化,处理速度较慢。
总结:光流法的建模策略
- 全局平滑假设:强调光流场的平滑性,适用于需要稳定、连续估计的场景。常用于 Horn-Schunck 方法。
- 多分辨率金字塔:通过从粗到细的分辨率逐层估计光流,适用于大范围运动的场景,能够提高算法的鲁棒性。常用于 Farneback 和 Brox 方法。
- 局部运动假设:假设局部区域内的像素运动相似,适用于稀疏光流估计,常用于特征点跟踪。常见于 Lucas-Kanade 方法。
- 能量最小化方法:通过全局优化来最小化能量函数,计算精确的光流估计,适用于高精度要求的任务,常用于 Brox 方法。
每种算法通过不同的建模策略,解决了不同类型的光流估计问题。全局平滑假设通常适用于运动较小的场景,而多分辨率金字塔则适合处理大范围的运动或复杂的背景变化。
四、实现光流法的不同算法
基于不同的建模策略或者不同策略的组合可以分为不同算法:
1. Lucas-Kanade光流法(稀疏光流估计)
适用场景:
- 适用于 稀疏光流估计,主要关注 特征点(例如角点或其他局部区域的关键点)。
- 常用于 兴趣点跟踪,例如目标追踪、物体检测中的角点检测等。
算法原理:
- 亮度一致性假设:假设相邻帧之间,同一物体的像素亮度在短时间内保持一致,即物体表面亮度不发生显著变化。
- 局部运动假设:光流是在小区域内平滑变化的,因此采用 局部光流估计,计算图像中小区域(图像块)内每个像素的运动。
- 基于图像块的方法:对每个特征点(例如角点),通过计算局部图像块的亮度变化,来估计该点的光流。
使用情况:
- 特别适用于 特征点跟踪,例如在视频或连续帧中追踪角点或其他兴趣点。
- 由于计算的是稀疏光流,它仅估算图像中一小部分特征点的运动,而不是整个图像。
2. Farneback光流法(稠密光流估计)
适用场景:
- 适用于 稠密光流估计,即计算图像中 每个像素的运动。
- 适合处理 大范围的运动 和 复杂场景,如视频中的全局运动估计。
算法原理:
- 使用 金字塔结构 和 多分辨率方法:通过构建金字塔图像结构,逐层估计光流。首先在低分辨率下估计大范围的粗略运动,然后逐步细化到高分辨率图像中,得到精确的光流估计。
- 通过图像的 局部相似性 来推测运动信息。Farneback方法将图像块建模为多项式模型,并使用图像的 局部块的位移 来估计光流。
使用情况:
- 用于 全图的光流计算,即对整个图像进行稠密光流估计。
- 特别适合 大范围运动,如场景中的物体快速移动或整体平移。
3. Brox光流法(稠密光流估计)
适用场景:
- 适用于 高精度的稠密光流估计,能够处理 大范围运动 和 复杂背景变化。
- 常用于要求高精度运动估计的任务,如运动检测、视频稳像等。
算法原理:
- 基于 能量最小化方法:Brox方法通过最小化一个 全局能量函数 来计算光流,该函数同时包含数据项和光滑项。
- 数据项:用于衡量图像在连续帧中的亮度一致性。
- 光滑项:确保光流场的平滑性,避免局部噪声的干扰。
- 该方法在 稠密光流计算 中表现出色,尤其在复杂背景和大范围运动的场景中,能够提供较高的精度。
使用情况:
- 适合 高精度运动估计,尤其是那些包含复杂动态、变形或噪声的场景。
4. Horn-Schunck光流法(全图光流估计)
适用场景:
- 适用于 全图光流估计,强调 光流场的平滑性。
- 常用于静态场景或者背景变化较小的场景。
算法原理:
- 基于 全局优化:Horn-Schunck方法假设整个光流场是 平滑的,因此采用 全局优化方法 通过最小化一个能量函数来估计光流。
- 这个能量函数包括两部分:
- 数据项:确保相邻帧之间的亮度一致性。
- 光滑项:确保光流场在空间上是平滑的,避免不自然的变化。
- 该方法通过 局部亮度一致性 和 全局光流平滑 来计算光流。
使用情况:
- 适合于对 平滑光流场的估计,如在背景变化较少或运动较小的场景中,能够稳定估计整个图像的运动。
- 由于光流场要求平滑,Horn-Schunck方法对 大范围运动 或 边界 较为敏感,可能会受到影响。
5. Dense Optical Flow(稠密光流估计)
适用场景:
- 计算图像 每个像素的光流,常用于 全图光流估计。
- 适合处理 大范围运动,如物体快速移动、场景整体变化等。
算法原理:
- 稠密光流估计方法试图计算每个像素的运动,即估算图像中所有像素的光流。
- 包括了 Farneback 和 Brox 等算法,它们能够有效地处理大范围的运动和复杂背景,计算全图的光流信息。
- 稠密光流 与 稀疏光流(仅计算特征点的光流)不同,它会提供每个像素的光流估计,从而形成完整的光流场。
使用情况:
- 稠密光流常用于场景中的 全面运动估计,尤其是在需要对每个像素的光流变化进行估计的场景中(例如在视频分析、动作识别、物体检测等应用中)。
总结
这些算法的主要区别在于它们的 光流估计策略 和 适用场景:
- Lucas-Kanade 适用于稀疏光流估计,关注特征点的运动。
- Farneback 和 Brox 是 稠密光流估计 的代表,适用于全图运动估计,能够处理复杂的场景和大范围运动。
- Horn-Schunck 强调 全局光流平滑,适用于光流场平滑的场景,但对大范围运动较为敏感。
- Dense Optical Flow 提供每个像素的光流估计,适用于全面估计图像中的运动。
这些方法的核心建模方式,如 亮度一致性假设、光流平滑、全局优化 或 金字塔结构,体现了不同算法对图像运动建模的不同策略,最终目标是准确地估计图像中物体或场景的运动。
五、应用模式
上述提到的稠密光流估计和稀疏光流估计是光流法中的两种不同应用模式:
1. 稠密光流估计 (Dense Optical Flow)
- 定义:稠密光流估计是对图像中每个像素进行光流计算,即为每个像素估算出运动向量。
- 建模策略:
- 稠密光流估计通常使用多分辨率金字塔策略(例如 Farneback 和 Brox 算法),通过从低分辨率到高分辨率逐步估计光流,避免了大范围运动时的光流估算错误,并且能处理复杂的场景变化。
- 稠密光流算法一般使用全局平滑假设或局部平滑假设来确保相邻像素的光流变化平滑。特别是对于较大的运动,使用金字塔方法可以更有效地平滑光流估计结果。
- 能量最小化方法(如 Brox 算法)也用于稠密光流估计,通过全局优化来得到更加精确的光流场。
- 应用:
- 稠密光流适用于对图像每个像素的运动进行精确估算的任务,特别是在需要全面描述图像中物体运动的场景下。例如视频中的全局运动分析、背景去除等。
- 与建模策略的关系:
- 稠密光流通常需要依赖于多分辨率金字塔策略来处理复杂的场景和大范围的运动,因为金字塔方法可以逐层细化光流估计,避免低分辨率下大范围运动引起的误差。
- 稠密估计方法对光流场的平滑性要求较高,因此通常采用全局平滑假设(如Horn-Schunck方法)或局部平滑假设(如Lucas-Kanade方法)。
2. 稀疏光流估计 (Sparse Optical Flow)
- 定义:稀疏光流估计只关注图像中的某些特定点(如角点、特征点、边缘等)的光流计算,而不是对整个图像进行估算。
- 建模策略:
- 稀疏光流估计一般基于局部平滑假设,即假设小区域内的像素光流相似。这使得它可以通过局部估计快速计算某些特征点的光流。例如,Lucas-Kanade算法就是典型的稀疏光流估计方法,它通过局部图像块的亮度一致性来计算特定点的光流。
- 由于只关注图像中的特征点,因此稀疏光流方法不需要像稠密光流那样使用多分辨率金字塔,但有时也会结合其他方法来提高估算的鲁棒性。
- 应用:
- 稀疏光流适用于特征点追踪、物体检测等任务。例如,目标跟踪和物体识别任务中的特征点追踪,计算量小且速度快,适合实时应用。
- 与建模策略的关系:
- 稀疏光流估计算法通常采用局部平滑假设,通过对图像中特定的特征点进行估算,从而避免了对整个图像的复杂计算。Lucas-Kanade就是一个典型的例子,它通过局部亮度一致性来估计每个特征点的光流。
- 稀疏光流计算不依赖于多分辨率金字塔,因为它只关心特定特征点的运动,通常计算量更小。
稠密与稀疏光流估计的建模策略对比:
特性 | 稠密光流估计 | 稀疏光流估计 |
---|---|---|
光流估计范围 | 所有像素 | 特征点或局部区域 |
建模策略 | 多分辨率金字塔 + 全局/局部平滑假设 | 局部平滑假设 |
算法示例 | Farneback、Brox | Lucas-Kanade |
计算复杂度 | 高 | 低 |
适用场景 | 全图光流估计、复杂场景分析 | 特征点跟踪、物体检测 |