python+opencv实现图像全景拼接

一、算法目的
随便拍摄两张图片(图一和图二),两图之间有相同的拍摄区域,需要将两幅图像无缝拼接在一起,完全接壤。

二、存在问题
由于镜头拍照的位置不同,会导致图一和图二虽然有相同的拍摄区域,但是并不能简单的将图二和图一的重叠区域覆盖进行拼接。因为拍摄图一和图二是,相机的世界坐标位置基本会发生变化。试想一下,你首先在A位置看到物体一,然后换到B位置再看物体一,物体一虽然仍在你的视野里,但是,它在你眼中与周围参照物的距离会发生变化(除非你只是转到一下眼珠),位置不同,光线也可能不同,这都是拼接过程中存在的问题

三、处理步骤
1、首先需要将图像进行桶形变换。该变换的主要目的是为了减少拼接后图片的畸变,如果没有进行桶形变换,拼接出来的图片可能是这样的:

如果还有更多的图片,拼出来的效果可能更加夸张:

那为什么桶形变换后就能改善拼接效果呢?作者认为由于图1和图2的重叠区域主要是在边缘,进行桶形变换后缩减了边缘图像匹配的发散,尽量让匹配点的纵坐标的差值减小,缩减透视变换后的变形。可是这一点我在网上看了好多,没有介绍怎么实现桶形变换的,大部分都是桶形变换的校正,如果哪位有相关的资料,希望能分享一下。
2、 桶形变换后,需要找到两幅图中相同的特征点,也就是 特征点匹配。
在此首先需要计算特征点,然后将特征点进行匹配(可用到的特征有sift、surf、fast、角点等)。作者用的是sift,它具有旋转不变性和缩放不变性,效果很好,理论资料以及代码都可以在网上找到,这里不作详解,只是速度非常慢,如果只是离线计算透视矩阵,可以考虑选用它。
3、 经过上面步骤后,我们获得了特征匹配点(即图 1 和图 2 中同样特征点分别在两图中的坐标),这时候使用BF匹配法(也可以使用FLANN),找到两幅图像之间的最佳匹配点,如果最佳匹配点小于4,就返回None,因为计算变换矩阵时,最少要四个点。
通过计算得到变换矩阵

扫描二维码关注公众号,回复: 1563074 查看本文章
4、利用得到的变换矩阵执行透视变化,然后两幅图像合并
可以看出来,合并以后效果并不好,有明显颜色区分,所以我们要进行下一步,图像的配准。

5、图像合并修补
从上图可以看出,两图的拼接并不自然,原因就在于拼接图的交界处,两图因为光照色泽的原因使得两图交界处的过渡很糟糕,所以需要特定的处理解决这种不自然。这里的处理思路是加权融合,在重叠部分由前一幅图像慢慢过渡到第二幅图像,即将图像的重叠区域的像素值按一定的权值相加合成新的图像。

通过透视变换,会产生黑边,所以还要特殊处理,通过对像素值处理,可以消除黑边问题,不过这又衍生了一个新的问题,当图像变换过大时,会产生锯齿黑边,通过黑色像素处理并不能解决这个问题。如果哪位有好的思路,请留言,大家共同进步。
如果你仔细观察的话,会发现中间的图像最上面中间部分其实有一点拼接的痕迹,这就是透视变换产生的锯齿边缘,由于颜色非常接近蓝色,所以单纯的黑色像素值判断识别不了,对此,我又对锯齿边缘部分做了特殊处理,但是还是有瑕疵,所以为了达到完美的效果,只能把这一点切除了。

四、总结
最后,我们再来总结一下,要进行图像的无缝拼接,我们的目标就是获得透视矩阵H,而为了获得透视矩阵,首先需要寻找到图像的特征点(sift,surf等),然后把两个图像中相同的特征点找出来,再根据最佳匹配点(bf,flann)计算透视矩阵H

计算出透视矩阵以后,剩下的就是让图二经过H矩阵进行透视变换,让图二在图一的坐标系下表示,然后在经过加权融和,进行黑边的处理,就可以实现无缝拼接了。
具体代码都放在:https://download.csdn.net/download/qq_36387683/10461258

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80589576
今日推荐