解决透视变换后图片信息丢失的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huang1004943336/article/details/51741034

        问题背景:最近在做图像拼接,思路是首先对输入的两幅图进行特征提取,提取的方法使用的是经典的SIFT(Scale-invariant feature transform)算法;然后进行特征匹配,匹配的思路是将一幅图中的特征点以K-D树的形式进行存储,再遍历另一幅图的所有特征点,在这颗K-D树中寻找与之匹配的特征点;匹配依据为最临近点与次临近点欧氏距离的比值,该比值人为设定,越小,匹配精度越高,相应的匹配点数目也会减少;利用欧氏距离匹配得到的结果,再使用RANASC(Random Sample Consensus)算法进行匹配点的筛选,滤除其中的错配点;使用上一步得到的较为精确的匹配点计算图2到图1的变换矩阵,该矩阵为3行3列,最后一个元素为1,除此之外共8个参数,因此,最少只需要四对匹配点就可以求得该矩阵;最后再基于上述变换矩阵对图2进行透视变换,把图1叠加到变换后的图2上,再做相应的融合,即完成了两幅图片的拼接。


        其实上述整个处理流程都是比较常见且通用的方法,具体的代码实现是参考一位博主关于SIFT的讲解。但是在使用过程中,还是出现了不少问题。此处主要介绍在根据变换矩阵进行透视变换时出现的图片信息丢失的问题。


       问题描述:先描述一下我遇到的问题和现象。由于暂时还没有理解到透视变换的本质,不过据我的实验效果,我推测是利用一个3*3的矩阵对图片中的每一个像素点求取一个新的坐标位置,再将原始坐标对应的RGB信息赋值到新坐标上,对于变换后可能产生的空隙采用插值的方式进行处理。标题中所谓的“图片信息丢失”问题,即在变换后,原图的某些区域被截取,不能展现完整的原图信息。具体效果如下图所示:


图1. 原图


图2. 透视变换后的结果

         图1是原始图片,根据求取的变换矩阵,对其进行变换后,得到如图2所示的结果。可以看到,图2右上角区域的部分信息已经被截取,造成信息丢失。


图3. 原始图片


图4. 变换后的图片

        上幅经过透视变换的图片左上角信息缺失。


         问题原因:通过计算原图四个角经透视变换后的新坐标,发现产生这一现象的原因是原坐标变换后的新坐标为负,而在一副图像中,通常以左上角的顶点作为原点(0,0),向右向下坐标都增大。因此为负数的坐标无法保存在变换后的图像中。例如原图左上角(0,0)变换后的坐标为(1000,-500),则该点就会被丢弃。


          解决方法:首先根据特征匹配阶段得到的变换矩阵计算原图四个角经过变换后的坐标,得到最小的X坐标minX以及最小的Y坐标minY,判断minX和minY是否小于零,如果其中一个数小于零,则表明会出现图像变换后信息丢失。现假设图像可以保存坐标点为负的信息,只是无法显示,如下图所示:

图5. 变换示意图

         上图示意了一幅图经过变换后的情况,整个矩形区域用于保存变换后的图像,蓝色部分是变换后能够看到的部分,绿色部分在Y方向上的坐标为负,不能看到,造成信息缺失。如果上述假设成立(即图片能保存坐标为负的绿色区域,只是无法显示),则我们可以通过将整幅图像向下平移,再将白色矩形增大,即可实现显示。但实际上,经过透视变换到目标图像后,坐标为负的区域已经被舍掉,因此实际的情况是下图所示:


图6. 信息缺失的图片

        因此我们无法通过透视变换后信息已经缺失的图片恢复全部信息。透视变换本质上时用一个矩阵将原图变换到目标图像上,既然我们不能从变换结果入手,那可以考虑改变变换矩阵或者原图,从而达到目的。因此有两种方法:

             (1)改变变换矩阵,原图不变;

             (2)先对原图进行平移,变换矩阵不变。

         本文中采用第一种方法。假设经过特征匹配求取的变换矩阵为H,原始图像某像素坐标为(x0, y0),改点经H变换后的坐标为(x, y),则有:

                                                             ,

                                                                 

          设 ,当MIn(y)或者Min(x)小于零时,则会出现信息丢失。此处以y坐标为例。当MIn(y)<0,则y-Min(y)>=0,所以有:

                                               

          可以看出,对图像在Y轴上进行平移,反应在变换矩阵上即是将H的第二行元素进行相应改变,改变后的变换矩阵为:

                                                      

       用次矩阵对原图进行透视变换,即可解决在Y方向上坐标为负的情况。同理,可以解决在X方向上的坐标为负的问题。对上文中的第一幅图进行变换后的结果如下图所示:


        通过上述方法,可以解决图片经过透视变换后信息丢失的问题。不过在具体操作时,给目标图片分配最够大的空间来放置变换后的图片也是必须的,否则,也可能出现类似的问题,甚至在程序运行时出现错误。

展开阅读全文

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