苏龙生,古天驰,李晓东
(佛山科学技术学院 电子信息工程学院,广东 佛山 528000)
全景图是VR中一种实际场景表示方法,通常要获得高质量的全景图需要购买昂贵的专用拍摄设备,并且设备需要专业人员精确地校准,因此获取全景图成本高。用普通相机图像拼接生成全景图是一种比较灵活方便、成本低廉的方法,用户甚至可以通过调整参数来调整最终效果。
在VR全景拼接技术中,其核心是全景图像的拼接算法。目前人们比较常用的全景图拼接算法中通常包括特征提取[1],特征点匹配[2],单应性矩阵计算[3]及重叠图像融合[4]等算法。目前常用的全景拼接软件很多,例如Ptgui、Autopano Giga和PanoramicVR等,这些软件在图像拼接时偶尔会出现拼接配准不佳,图片缝合线错乱等问题,人工对其进行调整参数不方便。另外,由于拼接图像提取的特征点数量很多,维度高,进行特征点配对时计算量非常大,导致拼接过程比较耗时。针对以上问题,我们研究了一种SIFT+RANSAC,利用特征筛选和多维索引树KDG-tree[5],实现对图像的快速拼接。
本算法的核心思路是通过SIFT算法来获取拼接图片的特征点[6],利用KDG-tree建立多维索引来快速完成特征比对,RANSAC算法建立带有错误特征点的拟合迭代模型[7],在RANSAC中增加自适应特征点筛选算法[8],准确筛选出含有噪声数据的点,设置生成图像的局部特征点阈值,然后利用此阈值比较来检测相似特征点,计算描绘出特征描述符,之后在广义紧互对原型的基础上,相应调整图像匹配相似时最近距离与次近距离的比值的阈值来控制相互匹配相似成功的点对数,最后将RANSAC算法和最小二乘法结合计算找出两幅图像之间的正确映射关系,然后根据关系提取所有类似点形成点集[9]。
在图像特征提取算法中,可以选用的特征比较多,但在图像匹配中通常采用具有尺度不变性和旋转不变性的SIFT、SURF或ORBSIFT等。SIFT算法核心可理解为将原模型切割分离成多个特征点,提取关键特征点集,提取的关键特征点不受平移、旋转、放大缩小、光照照射角度和投影变化等影响[10]。SIFT算法的最基础应用为在不同尺度空间上查找特征点,拼接覆盖特征点,形成融合且平滑的相似模型。
(1)尺度空间。尺度空间是在二维平面中模拟人眼视角观察模型的概念与方法,可表示为:
式中:L(x,y,σ)表示原图像I(x,y)与一个可变尺度的2维高斯函G(xi,yi,σ)的卷积运算;*表示卷积运算;(x,y)代表图像的角点位置;σ是尺度空间因子。
(2)特征点的准确定位与特征点的方向确定。特征点方向由尺度不变性求取确定,检索图片的部分图像为特征点赋予初始方向,使描述子对图片旋转具有稳定性[11]。对于在DOG金字塔中检测出的关键点,采集其所在高斯金字塔图像3σ邻域内像素因子的梯度和方向分布特征。梯度的模值和方向如下:
SIFT算法为避免目标图片保留到包含过多噪点数据的特征,可借助高斯核函数排除过多噪点数据,错误特征点会相应减少,最后借助少量正确特征点去模拟出原始图片中正确特征点集。
(3)高斯核函数定义为:
式中:x′为核函数中心;‖x-x′‖2为向量x′和向量x′的欧式距离(L2范数),向量距离单调递增,高斯核函数单调递减;σ控制高斯核函数作用范围。
单应性矩阵是将一个平面内的点映射到另一个平面内的二维投影矩阵,可以实现经透视变换将图像原始视图投影到目标视图。单应性矩阵在建立尺度空间、找寻图像缝合线、纹理扭曲和创建全景图像中起着决定性的作用。单应性矩阵定义H如下:
式中,M是内参矩阵;
式中:x为尺度因子;gx、gy、γ、u0、v0为5个相机内参;t为相机外参。
改进RANSAC算法是用来排除正确模型中的错误数据后进行拟合的迭代方法。RANSAC的算法核心思想是随机性和假设性,随机性是根据正确数据出现概率去随机选取模型数据,假设性是假设选取出的随机数据都是正确数据,然后使用正确数据演算问题建立正确的模型,从而推算得到剩余点,最后统计比较得出最为接近精确的数据集。
式中:(x,y)为预定图片的落点坐标;(x′,y′)为中心场景图片角点坐标;S为尺度参数。
RANSAC算法向预定数据集中随机选取出4个数据(注意这4个数据之间不得共线),然后计算生成对应单应性矩阵,再重复如上步骤计算得出其余单应性矩阵直至预定数据集中所有数据都被检索,最后计算符合该模型的正确数据个数与对应函数,明确对应函数的值最小时,该模型为最优模型。
RANSAC算法的工作流程如图1所示。
图1 RANSAC算法流程图
在实际应用中,应用于单应性变换的数据十分冗杂(包含大量噪声数据),容易出现特征点匹配错误的现象。但只使用随机4个点对来计算单应矩阵,也会造成较大误差。为保证单应性矩阵正确率,先挑选出较多符合参数,再应用RANSAC算法筛选出具有一致性的部分数据,即可在保证高效的同时找到单应性矩阵最优解。
KDG-tree是利用多维空间的非空点通过二维指针(横、纵指针)链接起来,构成一颗动态不平衡的二叉索引树,KDG-tree算法特点是从k维最简树开始搭建,中心节点为主要索引节点,叶子为包含噪点数据的数据节点。
KDG-tree有效避免大量高维数据集“逐条”比对时效率低下,采用KDG-tree索引是可能出现的维度灾难。减少无效数据的比对占用过多运算资源问题,加快了特征点进行比对的速度。因此当特征点数呈现规模较大和计算维度很高时,采用KDG-tree作为索引是一个不错的选择,保证进行全景图拼接时运行系统能顺利进行,避免出现“运行崩溃”现象。
在图像拼接时,需要输入一组待拼接图像,这些图像要求是在同一场景下不同角度拍摄的。算法首先对输入的图像进行特征提取,然后进行图像特征点的比对,找到对应的特征点对,计算单应性矩阵,最后生成融合全景图。其算法流程如图2所示。
图2 图像拼接流程图
在特征比对和计算单应性矩阵时,我们在相应Python类中实现了fit()和get_error()函数,fit()函数将提取的4个对应点对并建立相应的单应性矩阵,然后应用get_error()函数对对应点对进行计算,再返回对应的平方距离和。我们在实际操作中需要在多个get_error()函数返回的值中进行分析比较筛选,推断建成的单应性矩阵合理性,必要时调整阈值。
在拼接完成后,在VR场景下,通常还需要通过“图片扭曲”技术将同一视位的中心与邻接图片扭曲成360度的平滑全景图[12]。
根据以上算法思想,我们编写了算法测试程序,编程环境为windows10+Python2.7。在测试程序中通过输入一组不同角度拍摄的同一场景的图像,能自动完成图像的特征提取,特征比对,特征点映射和图像融合等过程,并可以根据拼接效果调整参数。如图3(a)、(b)所示是不同角度的图像和其特征点匹配情况。
从图3可以看出,相邻图像的特征点配对准确,只有极少数的点配对错误。从图4的实验结果可以看出,采用以上算法可以使多张图片拼接融合生成全景图,得到的拼接图像拼接准确,图像比较清晰,实现了算法目标。尽管有少量的特征点配对错误,但对最终拼接的效果几乎没有影响,因此算法比较稳定,受图像噪声干扰小。
图3 拍摄图片与邻接图片特征点连接(左右两角度)
图4 拼接后生成的全景图
本文研究的VR全景图拼接算法,能较好地解决目标图像特征点的假设和随机提取的问题,排除了大部分特征点集中的噪点数据,通过增加多维索引树KDGtree提高了特征点比对匹配的效率,算法有较高的稳定性,并且可以根据需要调整阈值参数,能较好地满足实际工程问题的需求。