图像拼接 之 特征点匹配

图像拼接 之 特征点匹配

  • 介绍
  • 特征点对搜索
    • 建立 K-D 树
    • 搜索 K-D 树
    • 特征点对的筛选
  • 计算单应性矩阵
    • 基于特征点对计算单应性矩阵
    • RANSAC 优化单应性矩阵
  • 总结
  • 参考资料

介绍

在人们实际生活和工作中时常需要获得宽视角、高分辨率的全景图像,但是由于摄像设备的机械限制,一般只能得到局部的成像。全景相机、广角镜头等可以直接获得全景图像的硬件设备往往代价高昂,难以广泛推行,因此催生出了使用计算机视觉的方法来将多个局部的图像拼接生成全景图像,也即是图像拼接技术。
图像拼接是将多张小尺寸的相同场景的图像拼接成为一张大尺寸图像的技术。OpenCV 提供了 Stitcher 类对传统的图像拼接算法进行了实现,其算法流程如下图所示:

图像拼接 之 特征点匹配_第1张图片
来自 Stitching Pipeline

Stitcher 提供的图像拼接算法流程可以划分为 RegistrationComposition 两个阶段,其中 Registration 阶段中又包含了特征点提取、特征点匹配、相机参数估计等步骤。本文内容主要针对于图像拼接中的特征点匹配步骤相关算法进行介绍。

特征点对搜索

输入原始图像后,可以通过 SIFT、SURF 或者 ORB 等特征点提取算法计算出图像的特征点。通过这些特征点,可以对图像之间的特征点进行匹配。
传统算法中使用 KNN 算法计算两个图像之间的匹配特征点对。每个提取出的特征点均包含特征点描述向量,从而可以计算出两个特征点之间的距离。对于特征匹配的 K 个最近邻计算,如果使用简单遍历,在提取出的特征点数量较高的情况下需要耗费大量计算时间。对此可以使用 K-D 树来优化计算过程。计算得到的最近邻通过一定的筛选方法获取到最可靠的匹配特征点。

建立 K-D 树

K-D 树是对于 k 维数据的二叉树结构,应用于多维键值搜索,其中每个节点均是 k 维数据。
一种典型的创建 K-D 树的方法如下:

  • 对于 k 维的数据,轮流选择其中一个维度计算轴垂直分割面,例如 32 维的 ORB 特征描述符则对于 0 - 31 维执行轮转;
  • 计算选定轴的中位数并将所有数据划分为两部分放入左右的子树。
    通过轮流选择维度,可以使得计算生成的 K-D 树平衡,每个叶节点与根节点的距离相近。

搜索 K-D 树

建立完成 K-D 树后,可以通过以下流程对目标数据进行搜索:

  • 从根节点开始向下递归,根据当前维度选择进入左右子树,直到到达叶节点,将其作为最佳点;
  • 回溯递归过程,如果当前节点距离优于最佳点,则使用其替换当前最佳点。并检查另一侧的子树中是否存在更优的点,如果存在则从该节点向下递归;
  • 回溯到根节点后,当前最佳点则为最终选择点。

特征点对的筛选

KNN 算法会为每个特征点计算出对应的最近距离匹配点,但是由于两个图像并不一定重合,因此部分特征点可能找不到对应的匹配点,需要对计算出的匹配结果进行筛选以删除不可靠的匹配点对。

其中一种筛选方法如下:

  • 设置 KNN 算法中 K 值为2,计算出当前特征点的最近邻以及次近邻;
  • 计算特征点与两个邻点的距离之比是否小于阈值,即在这里插入图片描述
  • 选择小于阈值的特征点与最近邻作为匹配点对,筛除不匹配的点对。

计算单应性矩阵

计算获取到特征点匹配对后,可以基于其计算两个图像之间的射影变换关系,进而得到两个图像之间的重叠部分并执行后续的图像融合等操作。计算两个图像的射影变换,也即是计算两个图像之间的单应性矩阵 H。

基于特征点对计算单应性矩阵

图像中的某一像素点可以通过单应性矩阵变换到另一图像的对应点,如公式1所示:
公式1
公式1(1)
其中 pa 为图像a中的像素点,pb 为图像b中的像素点,Hab 为 a、b 图像之间的单应性矩阵。
将公式1展开并改写成矩阵形式可以得到公式2:
图像拼接 之 特征点匹配_第2张图片 (2)
不难发现左侧矩阵前两行线性组合可以得到第三行,因此可以将公式2改写为公式3:
图像拼接 之 特征点匹配_第3张图片 (3)
由于单应性矩阵包含8个自由度,因此选择4个特征点匹配对即可以求解单应性矩阵,即公式4:
图像拼接 之 特征点匹配_第4张图片 (4)

对于公式4进行奇异值分解可以获取单应性矩阵,其中 V 的最后一列即为单应性矩阵的值。

RANSAC 优化单应性矩阵

上述的单应性矩阵计算方法仅仅依赖于计算得到的特征点对的其中4个,这在实际使用过程中是巨大的浪费并且结果准确性依赖于特征点对的选取。对于这一问题,可以使用 RANSAC 算法进行优化。
首先明确内点的概念:内点是重映射误差在给定阈值之内匹配点对,与外点相对应。其中重映射误差的计算公式如公式5所示:
公式5 (5)
RANSAC 算法的核心是从样本集中抽取多少次才能保证至少有一次不是外点的概率为q。根据概率q可以计算出迭代次数,相关公式如公式6所示:
公式6 (6)
其中 ε 表示样本集中外点的比例。

RANSAC 算法过程如下:

  1. 给定概率值q,重映射误差η,并计算最大迭代次数;
  2. 进入迭代,选择4个特征点对,按上述单应性矩阵的方法计算出当前 H;
  3. 计算所有特征点对的重映射误差,计算内点的数量;
  4. 通过公式6对最大迭代次数进行更新;
  5. 结束迭代后选择最大的内点数量,并根据这些内点计算出相应的单应性矩阵作为最终的输出。

在计算得到两个图像单应性矩阵后并不确定两个图像之间是否存在可靠的匹配关系,此时可以通过计算置信度来反应这一匹配关系。置信度 c 计算方法如公式7所示:
公式7 (7)
一般置信度阈值设为 1 左右,当两图像之间置信度大于1,则可认为两个图像可以进行拼接。

总结

本文内容主要介绍了图像拼接中特征点匹配相关的基础算法以及相关流程,其中还有一些优化的方法并未包含,例如将图像坐标归一化以消除图像尺度等造成的干扰、应用 LM 算法优化单应性矩阵等。
虽说对于上述的流程已经做了简单的 C++ 实现,但是计算性能极其低劣,同时代码也十分丑陋,还是不贴上来损害读者的眼睛了。

参考资料

  1. Opencv2.4.9源码分析——Stitching(二)
  2. k-d树

你可能感兴趣的:(计算机视觉,图像拼接,特征点匹配,单应性矩阵)