图像全景拼接
1.实验原理
1.1图像拼接整体流程
- 根据给定图像/集,实现特征匹配。
- 通过匹配特征计算图像之间的变换结构。
- 利用图像变换结构,实现图像映射。
- 针对叠加后的图像,采用APAP之类的算法,对齐特征点。(图像配准)
- 通过图割方法,自动选取拼接缝。
- 根据multi-band blending策略实现融合。
1.2实验步骤的基本原理
1.2.1 SIFT算法(图像匹配特征)
SIFT是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。
SIFT算法相较于Harris算法精确不仅提高了精度,而且大大提高了关键点的稳定性,所以较为通用。
SIFT算法在多尺度空间由于采用DOG算子检测关键点,相比传统的基于LOG算子的检测方法,运算速度大大加快;
SIFT算法在构造描述子时,以子区域的统计特性,而不是以单个像素作为研究对象,提高了对图像局部变形的适应能力。
1.2.2 RANSAC算法( 图像匹配特征优化,求解单应性矩阵)
-
优化
SIFT算法的描述子稳健性很强,比Harris角点要来得精确,但是它的匹配正确率也并不是百分百的,会受到一些噪声点的干扰,有时就会因为不同地方有类似的图案导致匹配错误。
RANSAC算法便是用来找到正确模型来拟合带有噪声数据的迭代方法。 -
求解单应性矩阵
RANSAC算法用于图像变换的单应性矩阵的计算。
fit()方法对选择的4个点对拟合一个单应性矩阵。get_error()方法对每个对应点对使用该单应性矩阵,然后返回相应的平方距离之和,所以RANSAC算法能够判断哪些点对是正确的,哪些是错误的。
在拼接的过程中,通过将响速和单应矩阵H相乘,然后对齐次坐标进行归一化来实现像素间的映射。通过查看H中的平移量,我们可以决定应该将该图像填补到左边还是右边。当该图像填补到左边时,由于目标图像中点的坐标也变化了,所以在“左边”情况中,需要在单应矩阵中加入平移。
具体参考上个实验博客。
1.2.3 APAP算法(精确图像配准,消除鬼影)
因为得到的透视变换矩阵是基于全局特征点对进行的,即一个刚性的单应性矩阵完成配准。为提高配准的精度,Apap将图像切割成无数多个小方块,对每个小方块的变换矩阵逐一估计。
Apap虽然能够较好地完成配准,但非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。
这条博(https://blog.csdn.net/xuanwu_yan/article/details/9400321)里面较为详细地介绍了APAP算法的原理。
1.2.4 网络流的最小割和最大流(选取最佳拼接缝切割)
寻找最佳拼接缝算法中,Graph Cut很经典。它将计算机视觉问题和网络流联系在一起。寻找最佳拼接缝等价于求网络流的最小割。 在网络流问题中,最小割和最大流相等。
- 最小割问题
一个有向图,并有一个源顶点(source vertex)和目标顶点(target vertex).边的权值为正,又称之为容量(capacity)
一个st-cut(简称割cut)会把有向图的顶点分成两个不相交的集合,其中s在一个集合中,t在另外一个集合中。
这个割的容量(capacity of the cut)就是A到B所有边的容量和。注意这里不包含B到A的。最小割问题就是要找到割容量最小的情况。
- 最大流问题
跟mincut问题类似,maxflow要处理的情况也是一个有向图,并有一个原顶点(source vertex)和目标(target vertex).边的权值为正,又称之为容量(capacity)。
一个st-flow(简称flow)是为每条边附一个值,这个值需要满足两个条件1 0<=边的flow <<边的capacity2 除了s和t外,每个顶点的inflow要等于outflow。一个flow的值(value of the flow)就是t的inflow。Maxflow就是找到这个最大值。
会发现Mincut和maxflow的问题是对偶的,解出了maxflow也就知道了incut的解。
- 解maxflow的算法Ford-Fulkerson,简称FF算法。
(1)初始化,所有边的flow都初始化为0
(2)沿着增广路径增加flow。增广路径是一条从s到t的无向路径,但也有些条件,可以经过没有满容量的前向路径(s到t)或者是不为空的反向路径(t->s)
两个定理:
- 增广路径定理(Augmenting Path theorem):一个流f是最大流当且仅当没有增广路径。
- 最小割最大流定理(Maxflow-mincut theorem):Maxflow的值等于最小割的容量。
1.2.5 multi-band blending策略(融合拼接图像曝光)
多波段融合的思想是对待融合的图像分别构建拉普拉斯金字塔,(拉普拉斯算子可以提取出图像的高频信息,在拉普拉斯金字塔中,越往上层的图像越高频)然后对同一层图像按照某种规则融合,一般是Alpha blending/Feathering;对于不同层图像(不同频率段的图像)进行不同规则的融合,高频部分blend slowly,低频部分blend quickly;对融合后的图像金字塔重建得到最终结果图,如下图。
2.图像拼接的实现与分析
2.1 核心代码
# -*- coding: utf-8 -*-
from pylab import *
from numpy import *
from PIL import Image
# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift
"""
This is the panorama example from section 3.3.
"""
# set paths to data folder
path = r"D:\testdata\sift"
# set paths to data folder
featname = [path + str(i+1) + '.sift' for i in