图像拼接(image mosaicing) 技术,是指将数张有重叠部分的图像拼成一幅大型的无缝高分辨率图像的技术。普通的摄像器械只能拍摄有限视角、 有限范围内的景象,要想获得较大范围的全景图,就需要用到图像拼接技术。

基本流程

此部分具体请见参考文献1

图像拼接的过程

  1. registration,即建立需要拼接的、显示同一场景的一对图片之间的几何关系(或更详细地说,几何变换矩阵)。有时,需要拼接的图像有许多张,这时候就需要找出一张参考图片,并且建立所有图片与参考图片之间的变换关系了。最常见的变换,就是有八个自由度的平面单应性(the 8 degree of freedom planar homography)。
  2. reprojection,将需要拼接的图片,使用之前计算出的几何变换,放到同一个坐标系中。
  3. stitching,在一个大画布上,连接几张图片。没有发生重叠的地方保持原样;发生了重叠的地方,合并重叠的像素。
  4. blending。stitching 之后的图像仍然会出现不连贯的地方,这是由于几何变换的错误(不完全准确),或者光学不匹配(例如两张图片曝光度不同),或者图片本身的问题(如图片拍摄时间不一致,图片中的物体发生了移动或改变),这时就需要用一些特别的方法来增强图片的连贯性。

图像拼接的两个难点是 registration 和 blending 两个步骤的算法。

Registration 有许多种不同的方式,有基于空间域的,也有基于频域的。基于空间域的 registration 方法,又可被划分为基于区域的基于特征的。这两类也可以继续划分,如下图所示:

按照 registration 分类的图像拼接

Blending 也有许多不同的方式。按照 blending 方式的不同可以将 mosaicing 分成这些类:

按照 blending 分类的图像拼接

深入了解

本来想在这里比较详细地介绍图像拼接的原理,不料各种算法的数学原理太过复杂,我难以理解,因此此处就不写数学原理了。要深入了解的话,参考资料1是个很好的开始,它的引用文献列表代表了几十年来的图像拼接进展。

(开源的)图像拼接程序与库

(由于某些原因,这里只列举开放源代码的程序与库。)

GIMP 是一个开源的 PhotoShop 替代品,它具有图像拼接功能2

OpenCV 是一个开源的计算机视觉库,应用十分广泛。它有 C++、Python 和 Java 接口,支持 Linux、macOS、Windows、iOS 和 Android。网上能找到的许多有关图像拼接的示例程序,都是使用 OpenCV 来实现的。

笔记

网上能找到的相关内容,要么是商业秘密,要么是学术论文,真正通用的、开源的内容,绝大部分都是使用 OpenCV 的。

如果要想实现自主可控的、满足特定需求的图像拼接应用,首先应该自学一下计算机图形学,然后参考相关算法论文和 OpenCV 库的源代码,自己独立实现。

参考资料


  1. Ghosh, Debabrata, and Naima Kaabouch. “A survey on image mosaicing techniques.” Journal of Visual Communication and Image Representation 34 (2016): 1-11. ScienceDirect ↩︎

  2. Photo stitching/panorama API/DLL/Library anyone? - Stack Overflow ↩︎