图像拼接 之 特征点匹配

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

介绍

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


来自 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)
其中 pa 为图像a中的像素点,pb 为图像b中的像素点,Hab 为 a、b 图像之间的单应性矩阵。
将公式1展开并改写成矩阵形式可以得到公式2:
(2)
不难发现左侧矩阵前两行线性组合可以得到第三行,因此可以将公式2改写为公式3:
(3)
由于单应性矩阵包含8个自由度,因此选择4个特征点匹配对即可以求解单应性矩阵,即公式4:
(4)

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

RANSAC 优化单应性矩阵

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

RANSAC 算法过程如下:

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

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

总结

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

参考资料

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

图像拼接 之 特征点匹配相关推荐

  1. python opencv图片拼接、特征点匹配

    一.算法目的: 在同一位置拍摄的两幅或者多幅图像是单应性相关的的,使用该约束将很多图片缝补起来,拼成一个大的图像来创建全景图像.两张图片的拼接必须首先找到相同特征,也就是说两张照片必须要有重叠的部分才 ...

  2. 特征点匹配+特征检测方法汇总

    特征点匹配+特征检测方法汇总 特征提取与匹配---SURF:SIFT:ORB:FAST:Harris角点 匹配方法 匹配函数 1. OpenCV提供了两种Matching方式: • Brute-for ...

  3. SIFT特征点匹配中KD-tree与Ransac算法的使用

    转自:http://blog.csdn.net/ijuliet/article/details/4471311 Step1:BBF算法,在KD-tree上找KNN.第一步做匹配咯~ 1.什么是KD-t ...

  4. 模板匹配,特征点匹配-全

    cnn网络: superpoint 18年的, https://github.com/magicleap/SuperPointPretrainedNetwork cnn图像匹配:权重5m torch ...

  5. 基于特征点匹配的自适应目标跟踪算法

    基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...

  6. OpenCV之feature2d 模块. 2D特征框架(2)特征描述 使用FLANN进行特征点匹配 使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 平面物体检测

    特征描述 目标 在本教程中,我们将涉及: 使用 DescriptorExtractor 接口来寻找关键点对应的特征向量. 特别地: 使用 SurfDescriptorExtractor 以及它的函数  ...

  7. CoSENT:特征式匹配与交互式匹配有多大差距?

    ©PaperWeekly 原创 · 作者 | 苏剑林 单位 | 追一科技 研究方向 | NLP.神经网络 一般来说,文本匹配有交互式(Interaction-based)和特征式(Representa ...

  8. 图像配准之特征点匹配的思考

    最近赶时髦,看了一些智能优化算法如蚁群算法,还有机器学习的一些东西,就想着怎么把这些先进的东西用在图像配准中.头脑风暴了一下,觉得在已经检测到两幅图像的特征点的基础上,就如何对它们进行匹配似乎有优化的 ...

  9. 基于图像特征点匹配的三维立体重建

    一.图像特征点检测与匹配 以下内容参考科学出版社康莱老师的<基于图像点特征的多视图三维重建>和华中科技大学王跃嵩的硕士论文<多视图立体匹配三维重建方法> 1.图像特征点检测 确 ...

最新文章

  1. Linux CPU数量判断命令
  2. USERADD命令详解
  3. 如果根据日志去禁用user_agent
  4. 透彻影像王书浩:三易其辙与功不唐捐
  5. SAP PM入门系列30 - IW39 Display Orders
  6. 显示-连接-删除管理数据库管理应用
  7. Linux 服务器安全技巧
  8. 强监管下 协议支付会是互金平台救命稻草?(协议支付是代扣协议的升级版)
  9. java函数实现进制转换与java实现八进制到十进制的转换(百练OJ:2735:八进制到十进制)
  10. ArcGIS Pro 制作与发布高程服务Elevation Layer
  11. java 不要使用魔法值_Java代码中的魔法值
  12. 11.2.4 jQuery动画
  13. 若川邀你进 源码共读 群~长期交流学习
  14. JavaScript学习笔记:类型检测
  15. 全国计算机民办二本学校排行,艺术类二本院校排名,2018最新民办和公办院校全国排名...
  16. LeetCode 1004. 最大连续1的个数 III(双指针+滑动窗口)
  17. go 对象json转map
  18. png批量转换成jpg,png批量转jpg方法
  19. java获取大写字母_获取中文大写首字母java实现
  20. 实现企业战略目标从做好项目管理开始

热门文章

  1. python进程实现生产者消费者模型
  2. Matplotlib图形总结
  3. Mysql空间清理,最硬核
  4. 打开acrobat pdf阅读器提示“内容准备进度”解决方法
  5. ES6---new Promise()讲解(尤其注意里面的参数resolve、reject)
  6. 与电容有关的几点解惑
  7. python3 爬虫实战之爬取网易新闻APP端
  8. h5的二维三维动画杂谈
  9. 开发板BMS系统充放电 SOC SOH控制模型
  10. 如何查看或下载Spring历史版本帮助文档