); Mat img_result = img_1.clone(); for ( int i = 0 ;i < img_result.rows;i ++ ) { for ( int j = 0 ;j < img_result.cols;j ++ ) { img_result.at < Vec3b > (i,j) = 0 ; } } int W = img_1.cols; int H = img_1.rows; float r = W / ( 2 * tan(PI / 6 )); float k = 0 ; float fx = 0 ; float fy = 0 ; for ( int i = 0 ;i < img_1.rows;i ++ ) { for ( int j = 0 ;j < img_1.cols;j ++ ) { k = sqrt(( float )(r * r + (W / 2 - j) * (W / 2 - j))); fx = r * sin(PI / 6 ) + r * sin(atan((j - W / 2 ) / r)); fy = H / 2 + r * (i - H / 2 ) / k; int ix = ( int )fx; int iy = ( int )fy; if (ix < W && ix >= 0 && iy < H && iy >= 0 ) { img_result.at < Vec3b > (iy,ix) = img_1.at < Vec3b > (i,j); } } } imshow( "桶状投影 " , img_1 ); imshow( "img_result" ,img_result); waitKey( 0 ); return 0 ; } ;
2.1.4 难道就没有其他模型了吗
在论文中和实际的项目中,看到最多的就是 “柱状模型 ” ,容易让人认为: “ 全景拼接只适合柱状模型 ” ,甚至以为 “ 图像拼接只适合柱状模型 ” 。
实际上,只要采集的图像中的信息包含了原始全景图片的信息,那么就应该能够有办法将其复原。之所以采用 “柱状模型 ” 是因为最容易实现,再说一遍:之所以采用 “ 柱状模型 ” 是因为最容易实现。事实上,针对不同的应用场景,可能会有很多其他的模型:
1) 步进电机控制的精密采集设备;
2) 消费类,手机拍摄形成 “蜂窝状 ” 图片拼接;
类似的情况还可能会有许多,但是如果能够理解第二章整个的流程、掌握配套的代码编写,就能够灵活运用于不同的模型上面。 后面在代码程序设计的时候,我会将一些其它方面的考虑一起放出来。
光是采集方法就说了好多,再一次说明了图像拼接的复杂。 选用什么样的采集方法就决定了以后图像投影变换的细节,间接地决定了最后拼接结果的质量。
2.2投影变换
二维平面运动参数模型是根据建立的数学模型,将待拼接图像转换到参考图像的坐标系中,以此来构成完整的拼接图像。
2.2. 1两步成像
到了这里,就必须涉及相机模型的简单介绍。在我们正常的图像采集中,采用的是 “两步成像”方法,将三维物体展现在相机二维的成像面上(比如ccd 或者 cmos) 。
我们在电子图片中,看到的是图像的像
同样可以再举一个图
可以明显地看到,首先物体反射光源的光,呈现在虚拟的 “像平面”上,这个虚拟的“像平面”,其具体情况是由相机的物理属性决定的,此为第一步;而后在根据“小孔成像”法制显示在相机的光学设备上。这个基本情况需要了解。
2.2. 2 圆柱面投影算法
( 分清楚什么是先验知识) 圆柱面投影算法 由于采集的原始图像是在绕视点一周不同角度下拍摄的,它们并不在同一投影平面上,投影存在一定的夹角。如果对图像直接进行拼接,得到的拼合图像在重叠区域会发生局部扭曲现象,并会破坏实际场景的视觉一致性,无法满足实际场景中各对象间的几何关系。比如场景中本来是直线的景物,在拼接后变成了折线,为了保证实际场景在视觉上的一致性,维持实际场景中的空间约束关系。我们必须将拍照得到的反映各自投影平面的各局部图像映射到一个标准投影即柱面投影上,以便获得从投影中心观察图像在柱面上的成像。这样一方面消除了实景图像之间可能存在的重复景物信息,同时也得到了每张实景图像上的像素点在视点空间中的位置信息。
( 提示:哪些是虚拟像平面)
展平的过程肯定是一个非线性变换,具体来说就是三角变换。
2.2.3 二维坐标体系中的 8参数模型。
其中,各个参数定义
(简单推导和证明)
投影变换需要用到所有 8个参数。投影变换具有更一般的形式,可以描述摄像机的平移、水平扫动、垂直扫动、旋转、镜头缩放等运动,其中刚性变换模型和仿射变换模型是投影变换模型的特例。它适用于景物平面相对于像平面有一定倾斜的情况。
2.3 特征匹配
1)什么是特征点?
可以这样简单理解,所谓 “特征点 ” 就是能够表明物体本身特征的点。也就是说,这种特征提取的方法具有独特的算法,使得即使你处理在不同的拍摄条件下拍摄同一物体,都能够得到同样的特征值。(所谓 “ 尺度不变性 ”).
这种特性对于图像拼接来说具有重要意义,因为目前计算机无法识别出图片中的物体,但是如果有一种统一的计算方法,能够告诉计算机不同图片中同一物体的特征点,那么也就是得到了物体的位置和形态了。(可以看图)
2)常用的特征点寻找方法。
SIFT,即尺度不变特征变换( Scale-invariant feature transform , SIFT ),是用于 图像处理 领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。该方法于 1999年由 David Lowe 首先发表于计算机视觉国际会议( International Conference on Computer Vision, ICCV ), 2004年再次经 David Lowe 整理完善后发表于 International journal of computer vision ( IJCV )。截止 2014年 8 月,该论文单篇被引次数达 25000 余次。
SURF(Speeded Up Robust Features)是一个稳健的图像识别和描述算法,首先于 2006 年发表在欧洲计算机视觉国际会议 用于 计算机视觉 任务,如物件识别和 3D重构。他部分的灵感来自于 SIFT 算法。 SURF标准的版本比 SIFT 要快数倍,并且其作者声称在不同图像变换方面比 SIFT 更加稳健。 SURF 基于近似的 2D 离散小波变换响应和并且有效地利用了积分图。该算法由 Herbert Bay 于 2006 年首次发表于 ECCV , 2008 年正式发表在 Computer vision and image understanding 期刊上,论文被引 9000 余次。
ORB,从它的名字中可以看出它是对 FAST 特征点与 BREIF 特征描述子的一种结合与改进,这个算法是由 Ethan Rublee,Vincent Rabaud,Kurt Konolige 以及 Gary R.Bradski 在 2011 年一篇名为 “ORB : An Efficient Alternative to SIFT or SURF” 的文章中提出。就像文章题目所写一样, ORB 是除了 SIFT 与 SURF 外一个很好的选择,而且它有很高的效率,最重要的一点是它是免费的, SIFT 与 SURF 都是有专利的,你如果在商业软件中使用,需要购买许可。
关于 SIFT/SURF/ORB,可以通过发表的论文看出之间的相互关系,特征点提取是一个复杂的话题,网络上有很多资料需要去消化吸收。在我的博客中现有调用 SURF 进行图像处理的一些实验的例子,可以帮助学习。 关于这三者的深入解读的课程已经在筹备。
需要注意一点,即 使你不懂特征提取的原理,也是可以利用其进行图像拼接的。 当然要解决复杂问题,最好还是要懂原理。在实际的使用过程中, ORB速度很快,并且能够提供足够的特征点,同时相比较其他两者编译起来比较简单 ( 因为 SIFT/SURF 要联编 contrib 库), 所以本拼接教程采用 ORB算法。
特征点有没有失效的时候?怎么办?
由于在图像采集的时候设置不当,或者就是由于物体本身特征不明的情况下,找不到足够的特征点?肿么办?
首先想到的是采用前后的变换矩阵进行拟合,也就是估计出可能的情况。但是这里是 8参数估计,所以只是在一些特殊的情况下效果较好(比如有机械臂控制的平面移动)。或者可以采用模板识别辅助获得变换的具体情况。
关于模板识别,可以参考 OpenCV官方 Wiki ,我的博客中也有相关内容,网络上同时资料比较丰富。
3)特征提纯
采用特征匹配可能会得到很多匹配的结果。对于自然图像来说,效果一般比较好:
但是,另外一些情况,匹配的结果很多,也有很多错误
就需要有特定的方法提纯这些特征点。主流方法为 RANSAC(Random Sample Consensus),它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。同样不展开,具体看博客。《 RANSAC 算法在图像拼接上的应用的实现》,都是带有原理解析和代码的。
4) 特征匹配最后得到一个什么结果,达到什么效果?
即使前面做了那么多工作,最后图像对准的结果还可能是这样:
这是什么情况?就是虽然按照算法匹配上了,但是这个匹配的结果是不符合实际情况的(右半边飞掉了)。这种情况在使用 OpenCV自己的 Stitching.cpp 拼接 3 图以上的时候就非常容易出现。但是我们不仅仅是要拼接 3 图, 4 图,而是要能够拼接全景的呀?这个时候,就需要对图和图之间计算出来的变换矩阵的参数进行统一处理,去除畸变点,获得统一模型。
2.4 图像对准
图像配准是整个图像拼接过程的核心部分,是将不同条件下 (气候、照度、摄像位置和角度等 ) 、不同时间或不同传感器获取的同一场景的两幅或多幅图像进行最优匹配的过程。
图像变换后,往往碰到坐标值非整数的情况,为了解决这个问题,图像的插值理论 (最近邻插值、双线性插值、三次样条插值 ) 经常会被运用到拼接算法中。
2.5 图像融合
图像在拍摄过程中可能会存在光照变换,若将配准后图像直接拼接在一起,会出现明显的拼接痕迹,使整个图像看起来光照不够自然,图像融合部分帮助我们解决这一问题。 当然 但是如果前面做的不好,最后的结果即使要不融合不好;要不融合后的结果和实际不相符 。
融合的方法,常见的为 liner、 feather 、 multiband ,对于他们的单独分析和代码实现可以见我的博客《使用 liner 、 feather 、 multiband 对已经拼接的数据进行融合》。这里简单说明一下主流的 multiband. 基本思想是把待拼接的两幅图像进行金字塔分解,而后再在不同的金字塔上面进行 liner 融合,最后再叠加起来。这么做效果是很好的,但是消耗资源,现在掌握的代码容易溢出。上图可以看出,苹果和橘子很好地融合到了一起,
过渡
一点都不维和。
2.6 反向投影(显示结果)
所谓反向投影这个玄乎的名字,其实想说明的就是将最后拼接的结果显示出来。最直接的就是还是显示成为一个图片(也是我们这个教程要做的),那么复杂一点,可以显示成一个 flash;可以显示成一个 VR 的双目的效果。大家自己发挥,这里抛砖引玉。
来自为知笔记(Wiz)
推荐阅读
生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ...
[详细]
蜡笔小新 2023-12-14 17:51:18
本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ...
[详细]
蜡笔小新 2023-12-14 17:46:55
本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ...
[详细]
蜡笔小新 2023-12-14 14:53:02
九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ...
[详细]
蜡笔小新 2023-12-14 14:51:26
本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ...
[详细]
蜡笔小新 2023-12-14 14:37:52
本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ...
[详细]
蜡笔小新 2023-12-14 14:29:36
一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ...
[详细]
蜡笔小新 2023-12-14 11:39:45
本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ...
[详细]
蜡笔小新 2023-12-14 11:31:05
本文记录了作者进行家装的过程,包括家具采购和瓷砖选择。作者介绍了自己家的装修风格以及选择烤漆家具和红白系列的原因。作者还提到了装修风格以简约为主,不可以太花哨的要求。最后,作者提到了价格较贵的问题。 ...
[详细]
蜡笔小新 2023-12-13 20:55:52
本文讨论了当某位排位靠前的涉众提供了一张精美的界面图片时,是否可以将其作为设计约束。同时还探讨了高质量素材和愿景之间的关系,以及老大自身的软件方法和建模技能。 ...
[详细]
蜡笔小新 2023-12-13 20:31:55
本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ...
[详细]
蜡笔小新 2023-12-13 18:08:58
本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ...
[详细]
蜡笔小新 2023-12-13 17:45:15
本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ...
[详细]
蜡笔小新 2023-12-13 16:47:45
这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ...
[详细]
蜡笔小新 2023-12-13 15:03:06
本文研究了使用条件对抗网络进行图片到图片翻译的方法,并提出了一种通用的解决方案。通过学习输入图像到输出图像的映射和训练相应的损失函数,我们可以解决需要不同损失函数公式的问题。实验证明该方法在合成图片、重构目标和给图片着色等多个问题上都很有效。这项工作的重要发现是不再需要人为构建映射函数和损失函数,同时能够得出合理的结果。本文的研究对于图片处理、计算机图片合成和计算机视觉等领域具有重要意义。 ...
[详细]
蜡笔小新 2023-12-13 14:13:28