计算机视觉(五)--图像全景拼接原理及实现

一、图像全景拼接的原理

图像全景拼接就是将多张图片(两两间存在一定的重叠部分,可以是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。也就是将两幅存在一定重合部分的图像,通过算法(如SIFT)进行特征点匹配从而得到对应点,将这些得到的对应点重合并保留两张图片的未重合部分,就可运行出次两张图片的拼接结果。

1.特征点匹配

本次实验主要采用了SIFT算法进行,之前的博客中有讲SIFT算法的基本原理等,链接:
https://blog.csdn.net/weixin_42104269/article/details/88630089

2.图片匹配

2.1 RANSAC随机一致性采样

RANSAC算法的基本假设是样本中包含正确数据(可以被模型描述的数据),也包含异常数据(偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
基本思想描述如下:
A.首先,考虑一个最小抽样集的势为n的模型(n为初始化模型参数所需的最小样本数)和一个样本集P,集合P的样本数#§>n,从P中随机抽取包含n个样本的P的子集S初始化模型M;
B.余集SC=P\S中与模型M的误差小于某一设定阈值t的样本集以及S构成S*。S可认为是内点集,它们构成S的一致集;
C.若#(S
)≥N,认为得到正确的模型参数,并利用集S采用最小二乘等方法重新计算新的模型M;重新随机抽取新的S,重复以上过程。
D.在完成一定的抽样次数后,若未找到一致集则算法失败,否则选取抽样后得到的最大一致集判断内外点,算法结束。

2.2 Homography透视变换

Homography就是将图像投影到一个新的视平面。
在全景图像拼接的时候,很多图像会由于拍摄角度等问题出现一些方向上的不同步,有时需要将图片进行旋转。而控制这个变换的方式就是通过透视矩阵与原图像的矩阵形式相乘从而得到新的图像矩阵。

PS:因为我现在对这个也没有理解的很清楚,所以写的比较简略,不理解的地方建议多参考其他资料。

二、图像全景拼接的实现

首先要找到PVC文件夹下的tools文件,打开里面的ransac.py,找到下图的代码
计算机视觉(五)--图像全景拼接原理及实现_第1张图片
print格式加括号,然后重装PVC

注意:图片要从右向左

1.室内全景图

这里先温馨提示一下,室内图拼出了科幻虚空的感觉(hiahiahia~)
计算机视觉(五)--图像全景拼接原理及实现_第2张图片
计算机视觉(五)--图像全景拼接原理及实现_第3张图片
计算机视觉(五)--图像全景拼接原理及实现_第4张图片
计算机视觉(五)--图像全景拼接原理及实现_第5张图片
其实看到有一些的特征点匹配(从天匹配到地上那种),已经能预感到它飞一般的结果了

计算机视觉(五)--图像全景拼接原理及实现_第6张图片
我觉得主要还是图片的问题,场景选择的不好,有太多相似的场景结构,导致特征点匹配的时候出现了错误,没有得出足够的正确对应点,以至于在重叠图片对应点坐标的时候产生了很大的空间误差,导致图片的拼接发生了扭曲的情况。
而且,可以明显的观察到,较中间的图片比较清晰完整,两头的图像则会有点被拉伸的感觉,比较模糊。

2.室外全景图

对于景深落差的问题…我的理解就是,景深落差小即正常拍摄的风景图片,景深落差大就是镜头前有离镜头较近的某个参照物,图片中有远景与近景较大的落差。

景深落差小

下图是集美大学中山纪念馆和嘉庚图书馆的全景拼接图(为了实现的效果能好一点,我在拍摄时是竖着手机拍的,并且重叠的部分个人觉得还是蛮多的。不过事实证明效果还不错)
计算机视觉(五)--图像全景拼接原理及实现_第7张图片
计算机视觉(五)--图像全景拼接原理及实现_第8张图片
计算机视觉(五)--图像全景拼接原理及实现_第9张图片
计算机视觉(五)--图像全景拼接原理及实现_第10张图片
计算机视觉(五)--图像全景拼接原理及实现_第11张图片
我觉得总体来说这张室外拼接图还是比较不错的(毕竟对比前面的室内-全是柱子-图,简直天差地别),与上面的失败图片作对比就能跟好的看出,对图片的要求:要较为平稳 的拍摄,远景效果好于近景即图片内同一参照物大小差越小的效果越好(图片取景较近往往会出现两边图片会被拉伸、像素模糊的问题)、取景要尽量避免相似区域多的场景等。

景深落差大

我是在上图的基础上,找了一根灯柱作为离镜头近的参照物,以此来拉大景深(?不知道对不对,反正就是这样啦)
计算机视觉(五)--图像全景拼接原理及实现_第12张图片
计算机视觉(五)--图像全景拼接原理及实现_第13张图片
计算机视觉(五)--图像全景拼接原理及实现_第14张图片
计算机视觉(五)--图像全景拼接原理及实现_第15张图片
计算机视觉(五)--图像全景拼接原理及实现_第16张图片
这次的拼接效果没有景深小的图片效果好,图片的拼接缝隙比较明显,连接的也不是很平滑(反正我的图片是这样,不知道是不是大家做出来都类似)。而且灯柱有点歪了,我觉得我拍的时候挺直的,不过有可能是因为拍摄角度的问题出现了一些方向上的不同步,图片被扭曲旋转了?(诶,好好一根灯柱,就给扭曲掰弯了)

3.总结

1.可能是因为图片比较清晰,所以运行的时间会非常的慢(之前有了解一点点surf算法,有时间或许可以试试)。
2.选取的场景最好不要有太多的相似区域,会影响到特征点的匹配导致错误对应点数量过多影响到拼接,使得图片拼接失败(问题大的就会看到极其科幻的拼接结果)。
3.拍摄图片时要尽量使得图片内的同一参照物大小差不多。近景(室内)图片拼接的中间比较清晰完整,两边会被拉伸、像素会变得模糊,远景(室外)图片拼接时拉伸小,不会出现很夸张的问题。
4.个人实验结果中景深落差小的图片效果会更好,景深落差大的图片,在拼接时缝隙会较大,连接不够平滑;而且由于要选择一个离镜头较近的参照物,可能会使拍摄角度等问题出现一些方向上的不同步之类的,会需要将图片进行旋转,可能会导致效果不够理想(比如我可怜的灯柱)。
5.同组图片的运行结果会不同(有时候还会突然失败,可能是玄学吧),主要应该是因为特征点的匹配不同,所选取出的正确和错误的对应点集不同,有时会进行程度不同的透视变换。

你可能感兴趣的:(图像拼接)