【opencv-python】全景图像拼接
参考资料
- Panoramic Image Mosaic
- R. Szeliski and H.-Y. Shum. Creating full view panoramic image mosaics and texture-mapped models, SIGGRAPH 1997, pp251-258.
- M. Brown, D. G. Lowe, Recognising Panoramas, ICCV 2003.
概述
图像全景拼接技术对于商用和艺术领域都有很高的价值。自从摄影术诞生以来,人们发明了许多特定的设备来制作全景图像,但由于价格低廉的数码相机也可以胜任,使得人们对自动全景图像拼合的需求度大大增加。在我们这个示例项目中,我们使用圆柱形扭曲创建全景图像。圆柱形翘曲是最容易实现的,但它有严格的要求,所有的图像必须采取相机放置或已知的倾斜角度。而使用这种方法,我们不需要进行完全单应性计算,只需要沿角度方向进行平移即可创建全景图像。技术路线图如下图所示:
正向翘曲:
根据图像坐标 ( x , y ) (x,y) (x,y),获得柱面投影坐标 ( x ′ , y ′ ) (x',y') (x′,y′)可以按照下式计算:
x ′ = s ⋅ θ = s ⋅ t a n − 1 ( x / f ) y ′ = s ⋅ h = s ⋅ y x 2 + f 2 x'=s·θ=s·tan^{-1}(x/f)\\ y'=s·h=s·\frac{y}{\sqrt{x^2+f^2}} x′=s⋅θ=s⋅tan−1(x/f)y′=s⋅h=s⋅x2+f2 y
反向翘曲:
从柱面投影坐标 ( x ′ , y ′ ) (x',y') (x′,y′)计算图像坐标 ( x , y ) (x,y) (x,y)可以按照下式计算:
x = f ⋅ t a n θ = s ⋅ t a n − 1 ( x ′ / s ) y = h ⋅ ( x 2 + f 2 ) = y ′ / s ⋅ f ⋅ 1 + t a n 2 ( x ′ / s ) = f ( y ′ s ) ⋅ s e c ( x ′ s ) x=f·tanθ=s·tan^{-1}(x'/s)\\ y=h·\sqrt(x^2+f^2)=y'/s·f·\sqrt{1+tan^2(x'/s)}=f(\frac{y'}{s})·sec(\frac{x'}{s}) x=f⋅tanθ=s⋅tan−1(x′/s)y=h⋅( x2+f2)=y′/s⋅f⋅1+tan2(x′/s) =f(sy′)⋅sec(sx′)
在前向翘曲中,源图像映射到柱面上,但它可以在目标图像中产生空洞(因为某些像素可能永远不会映射到那里)。因此,我们使用反向映射,将目标图像中的每个像素映射到源图像。由于这两种映射都不可能精确到像素值,因此使用双线性插值来计算目标像素处的颜色。
径向畸变
由于相机中经常使用厚镜头,因此有必要校正图像中的径向畸变。一种常用的简化畸变模型如下式表达:
x d = x u ( 1 + k 1 ∗ r 2 + k 2 ∗ r 4 ) y d = y u ( 1 + k 1 ∗ r 2 + k 2 ∗ r 4 ) x_d=x_u(1+k_1*r^2+k_2*r^4)\\ y_d=y_u(1+k_1*r^2+k2*r^4) xd=xu(1+k1∗r2+k2∗r4)yd=yu(1+k1∗r2+k2∗r4)
其中 ( x d , y d ) (x_d,y_d) (xd,yd)是失真图像像素的位置, ( x u , y u ) (x_u,y_u) (xu,yu)是失真修正后(非失真)的图像位置。 ( k 1 , k 2 ) (k_1,k_2) (k1,k2)取决于相机本身,并且可以通过相机标定技术获取。反向映射和镜像畸变矫正都需要插值技术进而计算目标图像像素的颜色值。插值技术比较容易实现,可以实现对特征的平滑,因此这步要得到高质量的最终目标图像。在应用中有两个地方需要进行插值,一是反向翘曲阶段从柱面图像变换到源图像;二是从非失真图像灰度变换到失真图像灰度。我们可以把上述两步骤和计算柱面图像灰度值直接结合起来,进而避免中间的插值过程。源图像如下图所示:
畸变图像如下图所示:
SIFT特征检测
随机抽样一致性平移变换(Ransac Translation)
随机抽样一致性(RANSAC:Random sample consensus)算法是一种可用于计算现存异常值中完全单应性的通用算法。柱面翘曲方法的使用具备只需要计算翘曲图像中平移运动的优势。同样适用于平移估计,只需一个特征就足够了。RANSAC估计方法给予容差值去计算非离群点数量,容差值基于图像噪声确定。由于我们的图像获取质量较高,为取得较好的估计效果,两个像素的容差值就足够了(我们发现图像中只有5-10%数量的离群点)。
图像融合
在这个最简单的方法中,融合区域中的像素值通过两个交叠图像加权平均的方式确定。有时这个简单的方法不起作用(例如在一些曝光差异存在的场景中)。但是在我们的场景中,所有的图像都是保证相机架在三脚架上同时拍摄,因此这个简单的算法可以获得完美的结果。加权平均图像融合算法的数学表达为:
P B ( i , j ) = ( 1 − w ) ⋅ P A ( i , j ) + w ⋅ P B ( i , j ) PB(i,j)=(1-w)·PA(i,j)+w·PB(i,j) PB(i,j)=(1−w)⋅PA(i,j)+w⋅PB(i,j)
金字塔融合
拉普拉斯金字塔是一种使用高斯核在融合图像时能同时保持足够多特征的算法。这种算法通过高斯核将图像降维至不同的等级(尺寸)。随后将高斯核扩展到较低的级别,并从该级别的图像中提取以获得拉普拉斯图像,原理如下图所示:
在为了交叠图像A和B生成完拉普拉斯金字塔之后,我们将两个图像在不同拉普拉斯等级通过彼此部分图像融合起来,如下图所示:
然后,我们将LS从顶级向下一级(N-1)扩展并将其添加到在相关层中的原始拉普拉斯图像中,进而生成相关层中的最新的拉普拉斯图像。我们重复这个过程直至最低级,最终得到融合图像结果,image A apple如下图所示:
image B orange如下图所示:
特征融合结果:
拉普拉斯金字塔融合结果:
漂移修正:
视场内第一张图片和最后一张图片经常没有很对齐,这种对不齐可以通过“剪切翘曲”和其他光束评查算法调整。在我们的案例中,由于不对齐的量值仅仅是1-2像素,所以我们无需做调整。
结果:
我们使用Canon SX100相机和Kedan三脚架做实验,一些相机的具体信息如下所示:
- 相机分辨率:480✖️640;
- 相机焦距:678.0541;
- k1:-0.22982
- k2:0.22952
下面是我们实现的两张全景图拼接效果:
感谢支持,欢迎关注,丰富技术/学术内容持续更新!
opencv-python快速入门视频教程
【opencv-python】全景图像拼接相关推荐
- python 全景图像拼接( python3.6 + opencv3.4.2.16) 融合
全景图像拼接 全景图像拼接的手动实现 环境: python3.6 + opencv3.4.2.16 ## 示例图片 本次实验使用的图像拼接素材为以下三张图像: https://andreame.com ...
- python全景图像拼接_Python+OpenCV实现图像的全景拼接
本文实例为大家分享了Python+OpenCV实现图像的全景拼接的具体代码,供大家参考,具体内容如下 环境:python3.5.2 + openCV3.4 1.算法目的 将两张相同场景的场景图片进行全 ...
- python全景图像拼接_超详讲解图像拼接/全景图原理和应用 | 附源码
研究好玩又有用的技术第 008 期 在学习中发现快乐,在应用找到价值.这是我第八期分享图像技术应用的文章. 前七期欢迎阅读和分享: 概述 作者:Thalles Silva 编译:AI算法与图像处理 图 ...
- python全景图像拼接_python实现图像全景拼接
图像的全景拼接包括三大部分:特征点提取与匹配.图像配准.图像融合. 1.基于SIFT的特征点的提取与匹配 利用Sift提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置.尺度.方向信息. 具体步 ...
- 基于OpenCV全景图像拼接
本文转载基于SIFT特征的全景图像拼接http://blog.csdn.net/masibuaa/article/details/9246493 主要分为以下几个步骤: (1) 读入两张图片并分别提取 ...
- python计算机视觉--全景图像拼接
目录 一.RANSAC算法 1.1 RANSAC算法简介 1.2 算法基本思想和流程 1.3 RANSAC求解单应性矩阵 二.图像映射与全景拼接 2.1 简介 2.2 计算第二张图像与第一张图像之间的 ...
- opencv 全景 android,基于OpenCV的Android手机全景图像拼接技术研究
摘要: 21世纪是信息化时代,人们每天被各式各样的信息所包围,这些信息中90%来自于图像.在生活中很多情况下,人们需要记录某些场景,常用的工具就是相机,包括带拍照功能的智能手机.随着科技的发展,软硬件 ...
- Opencv 实战五 图像拼接
图像拼接技术就是将数张有重叠部分的图像(可能是不同时间.不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术. 下面用opencv实现一下多张图像进行拼接 如下图所示,三张不同角度的 ...
- 概述 | 全景图像拼接技术全解析
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 图像/视频拼接的主要目的是为了解决相机视野(FOV-Fie ...
- opencv4 图像特征匹配_概述 | 全景图像拼接技术全解析
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言 图像/视频拼接的主要目的是为了解决相机视野(FOV-Field Of View)限制,生成更宽的FOV图 ...
最新文章
- R语言SVM支持向量机模型数据分类实战:探索性数据分析、模型调优、特征选择、核函数选择
- Centos版本 32或64位查看命令
- Java使用内部类的意义
- 【数据结构与算法】之深入解析“分割回文串”的求解思路与算法示例
- java n*n矩阵求值及求逆矩阵
- lua语言和python_[动态语言]python和lua中的三元操作符and-or
- vue+sortable实现表格拖拽
- 记一次被自己DDOS攻击
- asp.net开源项目及学习资料
- su灯光插件_lightup插件下载|lightup for sketchup下载v4.0中文免费版 附使用教程 - 欧普软件下载...
- 手机app性能测试简介了解
- 未来教育考试系统V4.0——安装后双击打不开
- C语言12进制逆序输出,C语言将整数以二进制逆序
- Matlab快速导入数据文件
- 加拿大计算机工程研究生,加拿大维多利亚大学电子与计算机工程系副教授诚招硕士研究生 - 导师招生 - 小木虫 - 学术 科研 互动社区...
- 2003服务器安全攻略
- 2018SCAU校赛题解
- Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题
- 深度学习之迁移学习介绍与使用
- 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇5、实时表观反射率产品生产