); 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)
推荐阅读
本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ...
[详细]
蜡笔小新 2023-12-14 15:47:35
本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ...
[详细]
蜡笔小新 2023-12-14 15:39:51
本文讨论了当某位排位靠前的涉众提供了一张精美的界面图片时,是否可以将其作为设计约束。同时还探讨了高质量素材和愿景之间的关系,以及老大自身的软件方法和建模技能。 ...
[详细]
蜡笔小新 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
本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ...
[详细]
蜡笔小新 2023-12-13 13:42:30
篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ...
[详细]
蜡笔小新 2023-12-13 12:59:48
本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ...
[详细]
蜡笔小新 2023-12-13 12:14:55
本文探讨了计算成像的原理与应用研究。首先介绍了小孔成像实验和软件方面的相关内容。随后从傅里叶光学的角度简单谈了成像的过程。成像是观测样品分布的一种方法,通过成像系统接收光的强度来呈现图像。视网膜作为接收端接收到的图像实际上是由像元组成的矩阵,每个元素代表相应位置像元接收光的强度。大脑通过对图像的分析,得出一系列信息,如识别物体、判断距离等。计算成像是一种采集记录系统,通过处理数据得到样品分布与像的对应关系,用于后续问题的分析。 ...
[详细]
蜡笔小新 2023-12-13 11:40:23
本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ...
[详细]
蜡笔小新 2023-12-13 11:31:26
本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ...
[详细]
蜡笔小新 2023-12-13 11:24:04
1.RoIPoolingRoIPooling顾名思义对Roi进行Pooling操作,主要用于目标检测任务。RoI(Regionofinterest ...
[详细]
蜡笔小新 2023-12-13 09:02:06