基于模板匹配与透视变换图像拼接的步骤

各种变换的矩阵形式,其中透视变换的矩阵需要8个dof(自由度),所以我们至少需要4对点才能将矩阵求解。

四对点的含义是:你自己选取的4个和模板匹配的4个点,总共8个点求解8个未知数。

 

矩阵求解过程:

其中:(xi,yi)表示的是你自己选取的点。

     (u0,u1)表示在右图模板匹配后得到的相似度最高的点。匹配成功的话,他们的关系是一一对应的。

 

情景:

  假设有两张图片,简称左图和右图,需要将两张图拼接到一起,这两张图不是简单的平移、旋转和缩放关系,需要用到透视变换。

步骤:

1.在左图选取四个点,以点形成四块ROI(感兴趣区域),以右图为模板匹配的原图,以左图的模板进行模板匹配。

2.匹配成功之后会获得右图的四个相似度最高的四个点,利用左图的四个点和右图的四个点求矩阵,如果懂原理

   可以自己写求矩阵的函数,也可以调用opencv的getPerspectiveTransform函数求得矩阵。

3.用求得的矩阵进行透视变换,我的做法是用向后映射(后向映射)将右图的每一个点通过运算后存放到一张新的大图中。

   计算公式是,此公式可以从矩阵中推导出来。

   当然也可以调用opencv的warpPerspective函数实现透视变换。

4.将右图通过透视变换到一张新的大图之后,然后再将左图遍历到新的大图中,遍历需要注意的是要加一个判断,判断新的大图中

   的像素点是否有值,如果无值再将左图的像素值赋值下去。

 

原理:

模板匹配:通过计算相似度(匹配值)去匹配图像。其实网上有些博客所讲的什么从左至右,由上而下匹配,都注重说这个遍历过程,

而没有真正讲到这个过程是为了干什么?其实这个所谓的匹配移动过程的目的是为了计算相似度然后存放到一个CV_32FC1类型的结果图中,

如果能达到这个目标,那其实从上往下匹配还是从下往上匹配其实是无关紧要的。计算完相似度之后可以通过minMaxLoc函数求得结果图最

最匹配的位置。

还有一点就是opencv文档中,模板匹配的结果图像的长和宽,以宽为例子,为什么是”原图宽度-模板图宽度+1“,这个其实是为了保证你计算

相似度的时候,访问不会越界。比如原图的宽是53,模板的宽是20,53-20+1=24,意思为横向需要求出24个相似度,当x=24的时候,结尾

刚好是53(24~53一共有20大小的宽度,刚好是最后一个相似度求解所需的大小)。

 

其中模板匹配一共有六种计算相似度的方法,我是用第一种平方差之和求解相似度去实现模板匹配函数的:

 

 

 效果图:

  

 

 

 注:向前映射会导致图片有空洞,所以采用向后映射,而映射过程中我选择用最近邻插值,因为它比双线性插值简单而且效果也还不错。

总结:其实整个图像拼接主要用到几个点:模板匹配、求矩阵、通过矩阵透视变换,对结果图片大小计算之后进行”裁剪“,最后显示拼接后的图片。

 

posted @ 2021-04-21 09:36  will-z  阅读(912)  评论(0编辑  收藏  举报