问题背景:最近在做图像拼接,思路是首先对输入的两幅图进行特征提取,提取的方法使用的是经典的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方向上的坐标为负的问题。对上文中的第一幅图进行变换后的结果如下图所示:

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

转载自:https://blog.csdn.net/huang1004943336/article/details/51741034

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

  1. 解决透视变换后图片信息丢失的问题,附程序

    解决透视变换后图片信息丢失的问题,附程序 问题背景 问题描述 问题原因 解决方法 问题背景 最近在做图像拼接,思路是首先对输入的两幅图进行特征提取,提取的方法使用的是经典的SIFT(Scale-inv ...

  2. win10系统更新后文件丢失的解决办法

    win10系统更新后文件丢失的解决办法 一.下载CCleaner的免费版Recuva软件 win10更新系统后,文件夹中的文件丢失了.百度了很久,一开始是参考了这个链接:win10系统更新导致文件丢失 ...

  3. 解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了

    解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了 参考文章: (1)解决win7系统重启后ip丢失问题,即每次电脑重启都要重新设置ip地址,重启后ip地址没了 ...

  4. 计算机里的文件丢失6,u盘修复后文件丢失解决方法

    相信有很多朋友都遇到过u盘修复后文件丢失的情况,那么修复u盘后文件丢失的话我们要如何解决呢?说实话小编早就在研究修复u盘后文件丢失的问题了!下面win7之家小编就给大家带来u盘修复后文件丢失的解决方法 ...

  5. 解决导出Excel后0丢失的问题

    需求背景 今天我们来看一个比较有价值的需求,这个需求中提到的一系列问题我们可能也会遇到并感到难以解决.好,闲话少叙,看一下具体需求: 1. 报表中的0.XXX导出Excel后0丢失,变成了.XXX,如 ...

  6. 重启计算机后ip丢失,win7系统重启后ip丢失的解决方法

    win7系统使用久了,好多网友反馈说win7系统重启后ip丢失的问题,非常不方便.有什么办法可以永久解决win7系统重启后ip丢失的问题,面对win7系统重启后ip丢失故障问题,我们只需要1.在win ...

  7. java excel 0没了,解决导出Excel后0丢失的问题

    需求背景 1.报表中的0.XXX导出Excel后0丢失,变成了.XXX,如0.5变成.5: 2.报表数据集中数据有存在空和0的数据,在报表显示的时候要求空值不显示,0值显示0,当前都显示为0: 3.横 ...

  8. RAMdisk保存文件方案,解决关机后无盘镜像文件没了的方案

    RAMdisk保存文件方案,解决关机后 无盘 镜像文件没了的方案 内存大了用不完 可以用ramdisk在内存中虚拟一个磁盘 把常用软件.系统缓存.浏览器缓存.bt下载都放到这个 虚拟磁盘 中 速度又快 ...

  9. 计算机缺少log怎么解决方法,win10 计算机丢失logmanager怎么办_win10丢失log.dll文件的解决方法-win7之家...

    有win10系统用户在启动电脑后,系统却只见出现了logmanager文件丢失的情况,文件丢失一般都是误操作导致的,出现这种情况的话,我们可以使用第三方软件恢复,那么win10计算机丢失logmana ...

最新文章

  1. keepalived mysql集群_keepalived + Mysql(主主)实现高可用集群
  2. 依图颜水成:AI芯片设计要深度融合算法,才能实现极致性能
  3. CTE 中字符串拼接
  4. python 使用记录
  5. 手机做条码扫描传给电脑_有线和无线扫描枪常用测试工具和软件你知道哪些?...
  6. 第二十七讲 微分方程组解的图像
  7. volatile关键字解析~高级java必问
  8. 同步中断和异步中断区别
  9. 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东
  10. html+form+multipartform-data,表单 – 如何处理node.js中的multipart / form-data
  11. *(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  12. android 布局防抖动,Android全屏返回布局抖动问题
  13. Linux NULL定义
  14. 曲师大教务系统服务器,曲师大教务处信息门户入口地址
  15. java多组List所有的排列组合
  16. python读取txt文件数据并存到list中
  17. ubuntu 安装dep文件
  18. php 教程推荐,php基础入门视频教程合集推荐
  19. 带你了解计算机网络的背景和框架
  20. 二值图像连通区域标记matlab,二值图像快速连通区域计算方法与流程

热门文章

  1. 面试精讲之面试考点及大厂真题 - 分布式专栏 14 全面了解Kafka的使用与特性
  2. 原来浏览器原生支持JS Base64编码解码
  3. 通过NodeJS自动生成的MySQL的REST风格API
  4. Nginx访问403异常问题处理
  5. ElasticSearch面试 - es 写入数据的工作原理是什么啊?
  6. 分布式面试 - 如何基于 dubbo 进行服务治理、服务降级、失败重试以及超时重试?
  7. leetcode 实现 strStr()
  8. 让你惊叹的 Markdown 写作工具推荐
  9. C#LeetCode刷题之#371-两整数之和(Sum of Two Integers)
  10. 通用职责分配软件原则之9-受保护变量原则