OpenCV图像注册模块
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
注册模块实现了参数化图像配准。所实现的方法是直接对齐(direct alignment),即,它直接使用像素值来计算一对图像之间的配准,与基于特征的配准方法相对。该实现基本上遵循了[254]中对应的部分。
基于特征的方法在尝试配准在不同光照条件或曝光时间下拍摄的图像,或当图像仅部分重叠时,相比基于像素的方法具有一些优势。另一方面,与基于特征的方法相比,基于像素的方法的主要优势在于,对于某些图像(在相似光照条件下拍摄且具有显著重叠的图像),其精度更高,这是因为我们使用了图像中所有可用的信息,从而能够实现亚像素精度。这对于某些应用(如多帧去噪或多帧超分辨率)尤其重要。
事实上,基于像素和基于特征的配准方法可以相互补充:一个应用程序可以首先使用特征获得粗略的配准,然后在图像的重叠区域上使用基于像素的方法来细化配准。所开发的代码允许这种使用场景。
该模块实现了从抽象类 cv::reg::Map 或 cv::reg::Mapper 派生的类。前者对两个参考帧之间的坐标变换进行建模,而后者封装了一种调用方法的方式,该方法计算两个图像之间的映射(Map)。尽管目标是实现基于像素的方法,但该模块可以扩展以支持其他能够计算图像间变换的方法(基于特征的方法、光流等)。
每个从 Map 派生的类实现了一种运动模型,如下所示:
MapShift:对简单的平移进行建模。
MapAffine:对仿射变换进行建模。
MapProjec:对投影变换进行建模。
MapProject 也可以用于对仿射运动或平移进行建模,但它的一些操作成本更高,这就是定义另外两个类的原因。
从 Mapper 派生的类有:
MapperGradShift:基于梯度的对齐,用于计算平移。它产生一个 MapShift(两个参数,对应于平移向量)。
MapperGradEuclid:基于梯度的对齐,用于欧几里得运动,即旋转和平移。它计算三个参数(角度和平移向量),尽管结果为了方便存储在 MapAffine 对象中。
MapperGradSimilar:基于梯度的对齐,用于计算相似性变换,即在欧几里得运动的基础上增加了缩放。它计算四个参数(两个用于反对称矩阵,两个用于平移向量),尽管结果为了更好的方便性存储在 MapAffine 对象中。
MapperGradAffine:基于梯度的对齐,用于仿射运动模型。参数数量为六个,结果存储在 MapAffine 对象中。
MapperGradProj:基于梯度的对齐,用于计算投影变换。参数数量为八个,结果存储在 MapProject 对象中。
MapperPyramid:它使用高斯金字塔实现分层运动估计。它的构造函数接受任何实现 Mapper 接口的其他对象作为参数,并且正是该 mapper 被 MapperPyramid 在金字塔的每个尺度上调用。
如果图像之间的运动不是非常小,使用这些类的正常方式是创建一个 MapperGrad* 对象并将其用作创建 MapperPyramid 的输入,然后调用 MapperPyramid 来执行计算。然而,如果图像之间的运动足够小,我们可以直接使用 MapperGrad* 类。另一种可能性是先使用基于特征的方法进行粗略配准,然后通过 MapperPyramid 或直接使用 MapperGrad* 对象进行细化。mappers 的 “calculate” 方法接受运动的初始估计作为输入。
在决定使用哪个 MapperGrad 时,我们必须考虑到,参数更多的 mappers 可以处理更复杂的运动,但涉及更多的计算,因此速度更慢。此外,如果我们对序列遵循的运动模型有信心,增加超出我们需要的参数数量会降低精度:最好使用我们能用的最少自由度数量。
在模块测试中有示例,展示了如何使用任何已实现的 mappers 来配准一对图像。