图像拼接技术步骤归纳

前言

    图像拼接也是计算机视觉领域的一个研究热点,本人这段时间内也对该算法进行了一番研究,在这里把其思想步骤简单归纳总结一下,以免忘记。


一、算法目的

    随便拍摄两张图片(图1和图2),两图之间有相同的拍摄区域,需要将两幅图无缝拼接在一起,完全接壤。(不就是全景拼接嘛!!)


二、存在问题

    有人说:既然两图有同样的区域,把相同的区域重合起来不就行了吗?
    非也非也~!由于镜头拍照的位置不同,会导致图1和图2虽然有相同的拍摄区域,但是并不能简单地将图2和图1重叠的区域覆盖进行拼接。因为,拍摄图1和图2时,相机的世界坐标位置基本都会发生变化。试想一下,你首先站在A位置看物体1,然后换到B位置再看物体1,物体1虽然仍然在你的视野中,但是,它在你眼中与周围参照物的距离都会发生变化(除非你只是转一下眼珠)。
    


     所以,我们要有将图2进行透视变换的一个过程,变换后的图2在进行简单的平移后就能完全与图1中的重叠部分重合。

三、处理步骤

    总体思路就如上面所述,那么,我们来看看具体的操作步骤吧(如有错误欢迎指正):

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

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


    
    那为什么桶形变换后就能改善拼接效果呢?作者认为由于图1和图2的重叠区域主要是在边缘,进行桶形变换后缩减了边缘图像匹配的发散,尽量让匹配点的纵坐标的差值减小,缩减透视变换后的变形。
    步骤二、桶形变换后,需要找到两幅图中相同的特征点,也就是特征点匹配。
     在此首先需要计算特征点,然后将特征点进行匹配(可用到的特征有sift、surf、fast、角点等)。作者用的是sift,它具有旋转不变性和缩放不变性,效果很好,理论资料以及代码都可以在网上找到,这里不作详解,只是速度非常慢,如果只是离线计算透视矩阵,可以考虑选用它。



    步骤三、经过上面步骤后,我们获得了特征匹配点(即图1和图2中同样特征点分别在两图中的坐标),但是经过观察,所匹配的点并不会百分百正确,有少数匹配点是不正确的(如下图中最长的那根黄线,明显找错位置了,但如果绝大多数匹配点都找错了,那就没有往下继续的必要了,而该回头看看是不是重叠区域过少,或者图片特征点太少造成的,再或者特征点计算的算法本身就有错误),透视矩阵需要选取4对特征点计算(如有时间讲解一下透视矩阵的计算过程,先占一个坑),万一选中了不正确的匹配点,那么计算的透视矩阵肯定是不正确的。因此,为了提高计算结果的鲁棒性,我们下一步就是要把这些不正确的匹配点给剔除掉,获得正确的透视矩阵。


    那要如何剔除不正确的匹配点呢?在这里使用了一个暴力的方法RANSAC(我觉得经过这一步骤已经可以把匹配错误的点给剔除掉了,除非匹配错误的点数大于匹配正确的点数):随机抽取不同的4对特征匹配坐标(在图1中随机抽取4个特征坐标,以及这4个特征坐标在图2中匹配的4个特征坐标,组成4对特征匹配坐标),利用这4对特征匹配坐标计算出透视矩阵H1(3x3的一个矩阵,图2经过透视矩阵变换后,可以把图2映射到图1的坐标空间中,再将图2进行简单的平移即可与图1实现无缝拼接),再将图2中所有特征匹配点经过该透视矩阵H1映射到图1的坐标空间,然后与图1匹配点实际坐标求欧氏距离(就是为了验证计算出来的这个H1矩阵是否满足绝大多数特征匹配点);之后重复上面内容,再随机抽取不同的四组特征匹配坐标,再计算透视矩阵H2,再求欧式距离,如此重复多次(次数自己定,本人取了1000次)。最后以欧式距离最小的那个透视矩阵(表示这个特征矩阵H满足最多的特征匹配点,它最优秀)作为最终计算结果,同时将欧氏距离过大的匹配特征点剔除(表示由这4组计算出来的透视矩阵满足不了绝大多数匹配点)。这时可以看到下图中,不正确的匹配点已经剔除了。而为什么说这种方法暴力呢?因为它每计算一次透视矩阵,就要用这个透视矩阵把所有的匹配点都测试一遍,如果匹配点的数量太多,速度会很慢。

    步骤五、最后,我们对图2进行透视变换,与图1进行拼接,来看看拼接效果吧,是否做到了无缝呢?对的,图像基本做到无缝了,但是你还能看到有明显的衔接线条存在,如果重叠区域用模糊处理后,衔接线条应该就不会那么明显了。

    什么?你还想看看没经过桶形变换就进行拼接的效果?



四、总结

    

    最后,我们再来总结一下吧。

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

    计算出透视矩阵H之后,剩下的就是把图2经过H矩阵进行透视变换,让图2在图1的坐标系下表示,这时再进行简单的平移拼接即可实现。

    本文只是将算法思路以通俗的语言简单描述了一下,有些算法并没深入介绍,如仿射矩阵的理论,sift的理论,但是这些算法可以在网上很方便地查找,甚至有现成的代码,如果有想学习的还是自己动动手,搜集一些资料吧。

    最后来一张多图拼接的效果:

发布了107 篇原创文章 · 获赞 342 · 访问量 113万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览