计算机视觉——全景拼接

1. 图像拼接简介

图像拼接在运动检测和跟踪、增强现实、分辨率增强、视频压缩和图像稳定等机器视觉领域有很大的应用。

分为四个步骤:

  • 图像匹配(registration):是指一对描绘相同场景之间的几张图片的几何对应关系。一组照片可以是不同时间不同位置的拍摄,或者由多个传感器同时拍摄多张图像。
  • 重投影(reprojection):通过图像的几何变换,把一系列图片转换成一个共同的坐标系
  • 缝合(stitching):通过合并重叠部分的像素值并保持没有重叠的像素值使之生成更大画布的图像
  • 融合(blending):通过几何和光度偏移错误通常导致对象的不连续,并在两个图像之-间的边界附近产生可见的接缝。因此,为了减小接缝的出现,需要在缝合时或缝合之后使用混合算法.

2. 图像拼接算法分类

图像匹配融合是直接影响图像拼接性能两个显著的研究领域。
作为图像拼接的第一个和最后一个步骤,如果没有正确的图像匹配和融合算法,几乎不可能进行成功的图像拼接。

现存的图像拼接算法中“图像匹配”和“融合”的方法分类如下:

  • 对“图像匹配方法”分类:图像拼接算法可分为基于空间域频域
    1.基于空间域的图像拼接可以进一步划分为基于区域的图像拼接和基于特征的图像拼接。
    2.基于特征的图像拼接可以再细分为基于底层特征的图像拼接(low level feature-based image mosaicing)和基于轮廓的图像拼接(contour-based image mosaicing)。
    3.基于底层特征的拼接可以分为四类:基于Harris角点检测器的拼接、基于FAST角点检测器的拼接、基于SIFT特征检测器的拼接、以及基于SURF特征检测器的拼接。

  • 对 “融合方法”分类:拼接算法可分为基于平滑过渡(transition smoothening-based)和基于最佳接缝(optimal seam-based)。基于平滑过渡拼接可以进一步被分成基于羽化(feathering-based)、基于金字塔(pyramid-based)、和基于梯度(gradient-based)的拼接。
    -在这里插入图片描述

3. “图像匹配方法(registration)”的选择

3.1 基于空间域(Spatial domain)图像拼接算法

这类算法使用像素的属性进行图像匹配,因此它们是最直接的图像拼接的方法。现有的图像拼接算法大部分都属于这一类。图像拼接算法大部分都属于这一类。
这里选择的是SIFT算法:尺度不变的特征点检测算法。
可用于识别其他图像中的相似目标。SIFT的图像特征表示为关键点描述符(key-point-descriptors)。在检查图像匹配时,将两组关键点描述符作为输入提供给最近邻搜索(Nearest Neighbor Search,NNS),并生成一个紧密匹配的关键点描述符(matching key-point-descriptors)。
具体内容可以查看上一篇博客。

4. 有关 “图像融合方法(blending)”的介绍

4.1 APAP算法

虽然图像配准已较为成熟,但其实其精度、鲁棒性等在某些场合仍不足够,如光线差异很大的两张图片、拍摄角度差异很大的图片等。2013年,Julio Zaragoza等人发表了一种新的图像配准算法Apap(As-Projective-As-Possible Image Stitching with Moving DLT),该算法的效果还是不错的,比opencv自带的auto-stitch效果要好。而2015年也有一篇cvpr是介绍图像配准(Non-rigid Registration of Images with Geometric and Photometric Deformation by Using Local Affine Fourier-Moment Matching),其效果貌似很牛,但没有源码,难以检验。

  • 1.提取两张图片的sift特征点
  • 2.对两张图片的特征点进行匹配,匹配的过程引用了论文(Distinctive Image Features from Scale-Invariant Keypoints)
  • 3.匹配后,仍有很多错误点,此时使用论文(Accelerated Hypothesis Generation for Multi-Structure Robust Fitting)提到的RANSAC的改进算法进行特征点对的筛选。筛选后的特征点基本能够一一对应。
  • 4.使用DLT算法(Multiple View Geometry p92提到),将剩下的特征点对进行透视变换矩阵的估计。
  • 5.因为得到的透视变换矩阵是基于全局特征点对进行的,即一个刚性的单应性矩阵完成配准。为提高配准的精度,Apap将图像切割成无数多个小方块,对每个小方块的变换矩阵逐一估计。

Apap虽然能够较好地完成配准,但非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。

这里参考:APAP图像标准算法

4.2 图像割法

  • 最小割能解决的问题: 当两张图像拼接完成后,可能会存在拼接缝隙,拼接线两侧的灰度变化较为明显。最小割问题可以解决这个问题。在这里插入图片描述
    如图,这是一个有向带权图,共有4个顶点和5条边。每条边上的箭头代表了边的方向,每条边上的数字代表了边的权重。G = < V, E >是图论中对图的表示方式,其中V表示顶点(vertex)所构成的集合,E表示边(edge)所构成的集合。顶点V的集合和边的集合E构成了图G(graph)。

    • 什么是最小割
      现在要求剪短图中的某几条边,使得不存在从s到t的路径,并且保证所减的边的权重和最小。那么很明显,剪掉边”s->a”和边”b->t”。我们就能得到下图:
      在这里插入图片描述
      图中已不存在从s到t的路径,且所修剪的边的权重和为:2 + 3 = 5,为所有修剪方式中权重和最小的。我们把这样的修剪称为最小割。
    • 什么是最大流:还是看最上面那张图,因为s->a只能通过2,那么s->a->t这条路的流量被限制在了2,同理,s->b->t被b->t限制,最多只能通过3的流量,所以s->t的流量总和为2+3=5,为这条路的最大流。

关于图割法在图中的应用:经典图割法的实现

4.3 图像融合

其实图像拼接完会发现在拼接的交界处有明显的衔接痕迹,存在边缘效应,因为光照色泽的原因使得图片交界处的过渡很糟糕,所以需要特定的处理解决这种不自然。那么这时候可以采用blending方法。multi-band blending是目前图像融和方面比较好的方法。

原理:

  • 1.建立两幅图像的拉普拉斯金字塔
  • 2.求高斯金字塔(掩模金字塔-为了拼接左右两幅图像)因为其具有尺度不变性
  • 3.进行拼接blendLapPyrs() ; 在每一层上将左右laplacian图像直接拼起来得结果金字塔resultLapPyr
  • 4.重建图像: 从最高层结果图将左右laplacian图像拼成的resultLapPyr金字塔中每一层,从上到下插值放大并和下一层相加,即得blend图像结果(reconstructImgFromLapPyramid)

可以将拉普拉斯金字塔理解为高斯金字塔的逆形式。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本篇的代码进行了图片融合所以拼接效果较好。

5. 实验过程

5.1 拼接视差变化小的场景

  • 针对固定点位拍摄多张图片,以中间图片为中心,实现图像的拼接融合
  1. 4张图片
    在这里插入图片描述
    特征点匹配:
    在这里插入图片描述
    拼接结果:
    在这里插入图片描述
    小结:
  • 因为是固定点位的同一视角拍摄,所以可以看到4张图片的特征点匹配非常的多(已经经过RANSAC删除错误匹配点)
  • 从拼接效果来看,第一个红框因为光照的原因可以看出一点点的不自然,但是第二个红色框是树并不是拼接造成的缝隙,整体来看拼接融合的非常好
  • 虽然着4张图片的像素已经调小了很多,已改成300*400大小,但是特征匹配点仍很丰富,可见该算法很精确
  1. 6张图片
    在这里插入图片描述
    特征点匹配
    在这里插入图片描述
    拼接结果:
    在这里插入图片描述
    小结:
  • 这组照片跟上组拍摄的地点完全一样,只是在上组的基础上左边多增加了2张照片,画红框的部分为树枝,并不是融合效果差,从结果来看,没有缝隙。

  • 从特征点匹配的结果来看,同一定位点因为视角没有变化,特征匹配点非常丰富,根据图像间变换矩阵H,可以对相应图像进行变换以确定图像间的重叠区域,并将待融和图像映射到到一幅新的空白图像中形成拼接图。

  • 因为只是进行的角度变化,并没有远近变化,所以图片拼接时扭曲不大,又因为是在同一时间段进行的拍摄,虽然普通的相机在拍摄照片时会自动选取曝光参数,这会使输入图像间存在亮度差异,但在在融和过程中对缝合线进行处理后效果非常好。

    5.2 拼接视差变化大的场景

  • 针对上一实验的同一场景,需选取视差变化大的场景(也就是有近景目标),更换拍摄位置。
    在这里插入图片描述
    特征点匹配
    在这里插入图片描述
    拼接结果:
    在这里插入图片描述

小结:

  • 这组图片是上一组的统一地点,为了拍摄更明显的出不同视角(即远近变化),我基本上是走10步拍摄一张,来刻意制造更大的远近变化
  • 但从实验结果来看,这里发现了一个有趣的现象,我的原图的有几张是有一辆黑色汽车的,但是在拼接的过程中,最后的全景图,这两车完全不见了,即使车上部分的楼肯定存在匹配的特征点,但是有车的部分完全没有拼入图像。
  • 从特征点匹配的结果来看,因为视角变化较大,已经走10步拍一张,特征匹配点非较少,根据图像间变换矩阵H,对相应图像进行变换以确定图像间的重叠区域较小,以至于最后拼接的效果右侧非常的扭曲。跟上一组的对比非常非常明显
  • 这一组即使进行了融和过程中对缝合线进行处理,但仍然因为视角跨度过大,导致拼接缝隙很严重。可见全景拼接还有很大的局限性和进步空间。
  • 这一组的红框不是物体而是真正的拼接缝隙。

6. 实验过程中发现的问题

第一次我在做实验时,输入图片的顺序导致有特征点的连接但无法拼接
在这里插入图片描述
在这里插入图片描述
之后更改了图片的输入顺序,完全倒了过来,就可以出现实验一的效果。

  • 原因分析:
    这是第一次的运行结果,在反复调试后发现图片的顺序要从右边往左边排,因为算法的匹配是从最右边的图像计算出来的,代码中有一步骤是将对应的顺序进行颠倒,使其从左边图像开始进行扭曲。

7. 总结

实现图像拼接的步骤:

  • 对每幅图进行特征点提取
  • 对对特征点进行匹配
  • 进行图像配准
  • 把图像拷贝到另一幅图像的特定位置
  • 对重叠边界进行特殊处理

对于视角变化过大的拼接情况,仍然有很大的改善空间。
如果需要代码可以私信,感谢阅读。

发布了15 篇原创文章 · 获赞 6 · 访问量 4462

猜你喜欢

转载自blog.csdn.net/weixin_43822880/article/details/105070819