本文全文翻译自http://ppwwyyxx.com/2016/How-to-Write-a-Panorama-Stitcher/。
这是一个关于作者如何编写OpenPano算法的一个总结,OpenPano是一个开源的全景拼接软件。相关代码在github上。
翻译 https://blog.csdn.net/wys2011101169/article/details/53925377
SIFT Feature 特征算子
Lowe 的SIFT[1]算法实现放在feature/目录下。这个算法的流程和一些结果在这一章里做简单的介绍。
Scale Space & DOG Space 尺度空间&差分高斯空间
- 首先,一个尺度空间(Scale Space)由 S×O 个灰度尺度图组成。最初的图片被调整成O种不同大小(即层级,octaves),每一层加上S个不同sigma的高斯模糊。
- 由于不同大小尺寸的图片上检测特征点,这些特征点将具备尺度不变性。
- 高斯模糊通过两个一维卷积实现,而不是一个二维卷积。这将显著地加速该计算过程。
- 在每个层级(octave),计算每两个相邻的高斯模糊后图片的差值,可以构建一个
差分高斯空间(DOG)
。DOG空间由(S−1)×O 个灰度图组成
Extrema Detection 特征提取
- 在DOG空间中,通过比较相邻的三个方向26个像素来检测所有的极大或极小值:x,y,sigma。
- 然后使用
抛物线插补(parabolic interpolation)
去搜索精确的(x,y,σ)位置。为了去得到更多有区别的特征点,低对比度(设定DOG图像中的阈值像素值)和边缘的点(设定主曲率阈值)不被接受。结果如下:
- Orientation Assignment 方向分配
- 首先,在尺度空间计算每个点的
梯度和方向
。 - 在之前的流程中检测到的每个关键点,根据他们的
梯度幅度值
作为权重,将它的相邻点的方向将累积起来并建立一个方向直方图
, - 直方图的峰值对应的方向被选为关键点的主方向。
Descriptor Representation 特征描述
- Lowe建议[1]选择关键点附近的16点来为每个店建立一个方向直方图并且合成为一个SIFT特征。每个直方图使用8个从0到360度的不同的格子。因此,结果特征是一个128位浮点向量。因为每个关键点的主方向是已知的,利用相对于主方向的相对方向,这个特征是旋转不变的。
- 利用论文[2]的建议,利用一个简单修改的SIFT——RootSIFT,鲁棒性更强。
Feature Matching 特征匹配
-
这个128维描述子的
欧氏距离
是两幅图之间特征匹配的 距离标尺。 -
如果一个点和他最近邻和次近邻的点之间的距离是相似的会被认定是不可信的而被拒绝。
-
特征匹配被认为是最耗时的一步。所以使用FLANN library去特征向量中查询两个最临近特征。Intel SSE intrinsics被用来加速去计算两个特征向量的欧氏距离。
Transformation Estimation 变换估计
Estimate from Match 根据匹配点根据
- 众所周知,对于任意两幅相机在固定点拍摄的图片,匹配对的齐次坐标都能够由一个单应变换矩阵H联系起来,因此对于一对对应的点p=(x,y,1),q=(u,v,1) , ,可以得到
p∼Hq - 单应矩阵是一个不考虑尺度影响的矩阵。
给定一组匹配点,以上的任何一个方程都能够通过直接线性变换(Direct Linear Transform)估计出来。这些估计方法的实现放在lib/imgproc.cc中。具体参照[3] - 这些方法对于噪声的鲁棒性并不强。实际上,由于错误匹配对的存在,RANSAC(Random Sample Consensus)算法[4]经常被用来在变矩阵的求解中剔除噪声。在RANSAC的每一步迭代中,几组匹配点对被随机地选择用来生成一个最佳的变换矩阵,并且和该矩阵一致的点对被看做是内点。在一定量的迭代后,拥有最多内点对的变换被看做最后的结果。该算法实现放在stitch/transform_estimate.cc中。
Match Validation 匹配验证
-
在每次矩阵估计后,我对每个矩阵进行了优劣检查(health check),以避免因为错误的匹配对而产生畸变的变换估计。这个过程包括两种检查:(具体参见stitch/homography.hh中)
- 单应变换中的尺度参数不能太大。他们的绝对值应不能超过0.002。
- 跳动不能够出现在图像拼接过程中。如果x或y坐标发生了跳动那么这个单应变换是不能够被接受的。
-
再无限制地拼接中,有必要判断两幅图是否匹配。上面流程中估计得到的大量内点能够作为一个评判尺度。然而,对于高分辨率图片,即使执行了足够多次的RANSAC迭代,也有可能实际上得到了一个有着大量内点的错误匹配。为了解决这个问题,考虑到错误匹配在空间上通常是更加随机分布的,通过设置匹配之间的几何限制条件能够帮助找出错误匹配对出来。因此,在RANSAC完成后会返回一组内点,按照论文[5]中的建议,可以通过一些重叠检测来进一步验证匹配情况。
-
特别的,知道了一个候选的变换矩阵,通过计算变换对应角点的凸包,我能够找出两幅图之间的重叠区域。在重叠区域被找到后就可以应用两个滤波器了。
- 两幅图的重叠区域不能够区别太大。
- 在重叠区域内,应该有足够大比例的匹配点对是内点。我使用了内点率来描述该匹配的置信度。
-
由于错误的匹配可能是随机和无规律的,这种方法能够帮助滤除带有错误几何信息的误匹配对。