CV——基于Stitcher类实现图片拼接

这篇具有很好参考价值的文章主要介绍了CV——基于Stitcher类实现图片拼接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

[摘要]
图像拼接(Image Stitching)是将同一场景的多张有重叠部分的图像拼接成一幅无缝或高分辨率图像的技术。在计算机信息技术不断发展的背景下,图像拼接技术不仅得到了有效优化,也切实应用于运动检测和跟踪、增强现实、分辨率增强、视频压缩和图像稳定等计算机视觉领域。本项目通过三种方法(SIFT算法、ORB算法、直接调用Stitcher类)实现简单的图像拼接,进行对比、分析,旨在学习计算机视觉相关领域的知识,总结图像拼接技术算法,以便后续进行深入研究,可供初学者参考。
关键词:图像拼接;图像匹配;计算机视觉

1. 引言

图像作为一种可以帮助人们直接了解世界的信息渠道,不仅可以为人们与自然界提供交互方法,还是计算机视觉领域的重要研究内容。近年来,随着计算机信息技术的不断发展,在有限的视角下研究自然环境已经无法满足人们的需求,人们对获取更加丰富的图像有了更高的追求。图像拼接技术作为一种能够将原本视角较小,存在重叠区域的图片信息,融合成一张具有更为广阔视角的答复完整图像信息的技术方,受到了人们的广泛欢迎。已经被广泛应用于航空航天、医学医疗、虚拟现实、无人驾驶、安防监控等领域,并有效满足了人们对场景观察的需要。

目前,图片的拼接主要包括四个步骤,分别是图像序列的输入、图像预处理、图像配准和图像融合。对图像数据信息进行采集时,会对后续图像配准精度以及融合效果产生影响。在对图像进行捕获时可能会有非均匀光照等影响因素,导致图片产生模糊、噪声等问题,直接影响图像匹配精度和效率,图片预处理可以改善图片质量。对图像进行拼接最重要的就是图像配准,得到图像间对应关系,进行转换。最核心的图像融合环节,建立期几何模型,得到不同像素点之间的对应关系,进行图像变换以后可以确定出对齐重叠区域,并对重叠区域进行平滑过渡,确保视觉的连续与一致性。本项目通过直接调用Stitcher类实现简单的图像拼接,与组内其他同学采用的SIFT算法和ORB算法进行对比、分析,并进行简单优化,旨在学习计算机视觉相关领域的知识,总结图像拼接技术算法,以便后续进行深入研究,可供初学者参考。

2. 相关工作(对已有工作做总结分析)

纵观近年来发表的关于图像拼接和图像配准的论文,其中提出的相关理论和算法大致可分为两类:基于特征的方法和基于区域的方法。

基于特征的方法首先从待配准图像中提取特征集,利用特征的对应关系进行特征匹配,通过特征匹配实现全局匹配。这种方法利用了图像的显著特征(如角点、特征点和轮廓等),计算量小,速度快,对于图像的噪声、畸变、遮挡等具有一定的鲁棒性。1996年,Szeliski提出了一种2D空间八参数投影变换模型,将图像之间的刚性和仿射变换归结为一个8参数线性变换。这种方法在处理具有平移、旋转、尺度关系以及仿射等多种变换的待拼接图像方面效果好,收敛速度快,是图像拼接领域的经典算法。多种特征点的自动提取和配准算法也被应用到图像拼接领域。典型的特征点自动提取算法有以下三种:Harris角点检测器、最小单值分割相似核(Smallest Univalve Segment Assimilating Nucleus,即SUSAN算法)角点检测算法和SIFT(Scale Invariant Feature Transform)特征点匹配算法。除了特征点,轮廓特征也被用来进行图像配准。轮廓的匹配准则可以选取链码相关或者其他一些相似性准则,如主轴和不变矩等。

基于区域的方法主要包括模板匹配法和频域法。1972年,Barmea和Silverman提出的序贯相似检测算法(SSDA)是一种经典的模板匹配算法。模板匹配算法是一种全搜索算法,通过匹配选定的图像模板(特征块)来实现两幅图像的全局配准。这类算法适用于图像间的平移检测,对图像将的旋转和尺度关系无能为力。1975年Koglin和Mines提出相位相关法,借助傅里叶变换将两幅待配准的图像变换到频域,该算法对噪声较为敏感,对光照具有很好的容错性。随着快速傅里叶变换算法的提出以及信号处理领域对傅里叶变换的成熟应用,1996年Reddy和Chatterji提出基于快速傅里叶变换(FFT-based)采用对数极坐标变量分离技术进行图像配准的方法,将频域配准技术成功的应用于存在平移、旋转和尺度的图像配准问题上。

随着深度学习的发展,使用神经网络方法进行特征提取的效果通常比传统算法更优,近年来有许多图像配准方向的研究人员做出了此类研究,提出了众多配准性能优越的算法,如MacheNet、PN-Net、LF-Net、RF-Net、ASLFeat 等。

2022年,You Y等人提出利用双接收域描述符进行多时相配准的算法 DRFD-Net,旨在解决天气、地表条件变化等多因素导致的多时相光学遥感图像配准精度问题。2022年,Yan X等人通过边缘分布自适应实现图像配准。首先将两幅图像特征向量映射到潜在空间然后通过最小化最大平均差值计算变换矩阵,特征向量的匹配在边缘分布相近的潜在空间进行,增加了特征映射的正确率。同年,针对可变形图像配准 Alexander Thorley等人提出学习模型驱动的级联变分网络VR-Net,该网络使深度学习在训练数据较少时可以快速计算和获取配准精度。
图像拼接技术经过几十年的研究己经取得了很大的进展和广泛的应用。但是,由于拍摄环境复杂多变,没有一种算法能够解决所有的图像拼接问题。现有的算法各有其优缺点,如果能综合利用这些方法的优点将会取得更好的拼接效果。

3. 研究方法(技术路线)

3.1 开发环境

软件:PyCharm Community Edition 2022.1
解释器:Python 3.9
相关库:Opencv-python(4.6.0.66),numpy库

3.2 拼接算法

OpenCV中从2.4.x版本之后有了一个新的模块图形拼接,该模块通过简单的高级API设置,可以获得比较好的图像拼接效果。OpenCV官方提供了一个高度集成的API函数 Stitcher,两行代码就可以得到一个很好的拼接图像。
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

stitch有两个返回值,一个是status,表示是否拼接成功;另一个是pano,当图像匹配的特征点足够时,拼接成功,返回全景图,当图像匹配的特征点不够时,拼接失败,返回None。

3.2.1 Stitcher类

OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑太多的细节。低级别函数封装在detail命名空间中,展示了OpenCV算法实现的很多步骤和细节,使熟悉如下拼接流水线的用户,方便自己定制。OpenCV 网站提供的Stitching内部流程结构图为:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

源码中提到了七个部分:
(1)Features Finding and Images Matching:特征查找和图像匹配
(2)Rotation Estimation:旋转估计
(3)Autocalibration:自动校准
(4)Images Warping:图像变形
(5)Seam Estimation:接缝估计
(6)Exposure Compensation:曝光补偿
(7)Image Blenders:图像混合器
由此可见,图像拼接是由一系列基础算法构成。其中影响凭借算法stitch工作常见的几个算法子模块为:
(1)特征发现与描述子:可以选择SIFT、SURF、AKAZE、ORB等特征算子进行匹配;
(2)相机参数。不同的相机参数与设置会导致不同的结果;
(3)融合方式(blender):不同的融合方式,也会导致不同结果;
(4)config threshold:如果显示无法特征匹配,可以尝试把阈值调小。

3.2.2 运行流程

1、命令行调用程序,输入源图像以及程序的参数;

2、特征点检测,判断是使用SURF还是ORB;
在源码中,特征点检测的默认设置第一选择是SURF,第二是ORB特征点检测。先对图一进行特征点提取和筛选匹配,再对图二进行该操作,这样可以保证更多的匹配点被选中。
SURF(Speeded Up Robust Features, 加速稳健特征) 是一种稳健的图像识别和描述算法。它是SIFT的高效变种,也是提取尺度不变特征,算法步骤与SIFT算法大致相同,但采用的方法不一样,SURF算法要比SIFT算法更高效。SURF使用海森(Hesseian)矩阵的行列式值作特征点检测并用积分图加速运算;SURF 的描述子基于 2D 离散小波变换响应并且有效地利用了积分图。
(1)构建尺度空间:SURF使用Hessian矩阵来检测特征点,该矩阵是x,y方向的二阶导数矩阵,可测量一个函数的局部曲率,其行列式值代表像素点周围的变化量,特征点需取行列式值的极值点。用方型滤波器取代SIFT中的高斯滤波器,利用积分图(计算位于滤波器方型的四个角落值)大幅提高运算速度。
(2)特征点定位:找到尺度空间的局域极大值,然后删除响应比较弱的关键点以及错误定位的关键点,以及进行亚像素分析
(3)特征点方向确认:采用的是统计特征点圆形邻域内的harr小波特征。即在特征点的圆形邻域内,统计60度扇形内所有点的水平、垂直harr小波特征总和,然后扇形以0.2弧度大小的间隔进行旋转并再次统计该区域内harr小波特征值之后,最后将值最大的那个扇形的方向作为该特征点的主方向。这样统计的方向更加精确,但是计算时间会略有上升。
(4)生成特征点描述子:在特征点周围取一个4*4的矩形区域块,每个子区域统计25个像素的水平方向和垂直方向的haar小波特征,水平和垂直方向都是相对主方向而言的。该haar小波特征为水平方向值之后、垂直方向值之后、水平方向绝对值之后以及垂直方向绝对值之和4个方向。
(5)特征点匹配:通过计算两个特征点间的欧式距离来确定匹配度,欧氏距离越短,代表两个特征点的匹配度越好,还加入了Hessian矩阵迹的判断,如果两个特征点的矩阵迹正负号相同,代表这两个特征具有相同方向上的对比度变化,如果不同,说明这两个特征点的对比度变化方向是相反的,即使欧氏距离为0,直接予以排除。

3、对图像的特征点进行匹配,使用最近邻和次近邻方法,将两个最优的匹配的置信度 保存下来;

4、对图像进行排序以及将置信度高的图像保存到同一个集合中,删除置信度比较低的图像间的匹配,得到能正确匹配的图像序列。这样将置信度高于门限的所有匹配合并到一个集合中;

5、对所有图像进行相机参数粗略估计,然后求出旋转矩阵;

6、使用光束平均法进一步精准的估计出旋转矩阵;

7、波形校正,水平或者垂直;
拍摄照片的时候角度不一定是相同的,导致拼接起来的照片会使全景图出现“飞机曲线”,因此要对图像进行波形矫正,寻找每幅图形的“上升向量”。
8、拼接;

9、融合,多频段融合,光照补偿;
拍照的时候角度光线等原因,会使图片的亮度不同,因此需要对图像进行光照补偿,将对应区域乘以一个值。

3.3 黑边处理

由于拼接前的图片大小不一致,图片拼接完成后,会出现图像边界外的黑色像素,使得拼接后的图片不完美。
拼接前:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

拼接后:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

接下来对拼接后的图片进行黑边处理:
(1)提取黑边轮廓
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

利用copyMakeBorder函数扩充边界,让拼接后的图片上下左右分辨扩充10像素的黑色边框。threshold函数使得灰度大于某个数值像素点保留,返回处理后的二值化图像。在代码cv2.threshold(gray,0,255,cv2.THRESH_BINARY)中,如果像素值大于0的,则像素变为白色(255),其他像素值位置变为黑色(0)。图像像素值范围为[0,255],因此,除了黑色区域,其他部位全为白色。
(2)计算最大的轮廓边界
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

findContours寻找图像的轮廓,返回两个值,轮廓的点集和各层轮廓的索引。cv2.RETR_EXTERNAL表示只检测外轮廓。cv2.CHAIN_APPROX_SIMPLE表示压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。boundingRect找到一个最小的矩形,把找到的轮廓包起来;cv2.rectangle则画出矩形。
(3)寻找拼接后图片内部最大的矩形区域
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

这里创建了两个蒙版,循环使用腐蚀-像素相减,从而得到拼接后图片内部最大的矩形区域。通过cv2.erode()腐蚀minRect,直到sub为全黑。cv2.countNonZero返回灰度值不为0的像素数,用来判断图像是否全黑cv2.subtract()作用是两个图像像素相减,灰度图像素值范围0-255,如果两个数相减得到负数的话,会直接将其置为0;如果两个数相加,结果超过了255的话,则直接置为255。
(4)寻找矩形框的轮廓,进行裁剪
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

黑边处理后的拼接图:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

4. 实验结果与分析

4.1 使用stitcher类得到的拼接对比

测试数据1:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

拼接结果:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

测试数据2:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

测试结果:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

测试数据3:(多图拼接)
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

测试结果:
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

分析评价:
调用stitcher类得到的拼接图片,对黑边处理之后,效果很好,但是,调用stitcher类实现时对图片的特征匹配有要求,一些特征点不够的图片无法拼接,并且,当图片较大或多张图片拼接时,速度较慢。

4.2 项目组内方法对比

方法一:使用SIFT算法得到的拼接
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

方法二:使用ORB算法得到的拼接
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

方法三:调用stitcher类得到的拼接
opencv stitcher拼接图片扭曲的问题,笔记,计算机视觉,人工智能,图像处理

分析评价:
通过上述测试数据可以看出,得到图片的效果:Stitcher>ORB>SIFT.
ORB算法和SIFT算法只是不同的特征提取方法,ORB算法在FAST算法的基础上,提取了特征点的方向。同时根据特征点的方向,采用改进BRIEF算法的 Rotated BRIEF算法对特征进行描述,从而取长补短,即高效的完成了特征提取和特征描述,又使得特征描述向量具有旋转不变性,在噪声情况下更有效,但是会受到光线变化的影响。使用OpenCV自带的Stitcher类,虽然拼接效果最好,使用简单,并且可以一次拼接多张图片,但是需要足够的相同特征区域进行匹配,并且图片太大的话,速度较慢甚至报错。

5. 结束语

本次计算机视觉项目我们为实现图片的拼接和融合,我们三人分别采用不同的方法实现,分别是基于SIFT算法、ORB算法和Stitcher类实现图片拼接。对比三种方法所得结果可以看出,Stitcher类实现对于图像的拼接的效果非常好,且可以拼接多张图片,但是当图片较大时速度较慢,且需满足足够的相同特征点才能进行图片拼接,对于SIFT算法和ORB算法,得到的图片需要经过再次处理,才能得到相对完美的图片,SIFT算法可以提供较高的准确率,ORB算法的速度非常快,但是最容易出现问题。文章来源地址https://www.toymoban.com/news/detail-786777.html

到了这里,关于CV——基于Stitcher类实现图片拼接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv多张图片实现全景拼接

       最近camera项目需要用到全景拼接,故此查阅大量资料,终于将此功能应用在实际项目上,下面总结一下此过程中遇到的一些问题及解决方式,同时也会将源码附在结尾处,供大家参考,本文采用的opencv版本为3.4.12。   首先说一下此源码的大概执行流程,此项目进行全

    2024年01月17日
    浏览(46)
  • Python 结合opencv实现图片截取和拼接

    python 3.6.2 scikit-build-0.16.7 win10 opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 下载地址: https://pypi.org/project/opencv-python/4.5.4.60/#files https://files.pythonhosted.org/packages/57/6c/7f4f56b2555d5c25dd4f41fc72a16dc6402cb2b4f967da11d8d26c669b55/opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 注意:下载时不用下abi版的,比如 o

    2024年02月08日
    浏览(45)
  • OpenCV完美实现两张图片的全景拼接(详细教程)

    目录 1,主要步骤 1.1  导入需要的包和模块,并读取两张待拼接的图片,这里我们假设它们为 left.jpg 和 right.jpg。 1.2  创建SIFT检测器 1.3 创建一个基于 FLANN 的匹配器 1.4  筛选过程删除掉一些不合适的匹配点,只保留最好的匹配点 1.5透视变换 1.6  消除重叠的效果,对两张

    2024年02月06日
    浏览(42)
  • python——使用cv2拼接图片(含代码)

    很多时候我们需要把几张图片拼到一起,当然可以使用PS之类的软件来处理,但是使用python更快并且能批量处理。 假设我们有三张图片:        使用代码把他们横向拼到一起:  当然也可以纵向: 直接上代码,这里需要使用python的cv2模块:

    2024年02月13日
    浏览(51)
  • 使用opencv实现图像的扭曲矫正

    在图像处理中,经常需要对图像进行各种操作如平移、缩放、旋转、翻转等,这些都是图像的仿射变换。图像仿射变换又称为图像仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。通常图像的旋转加上拉升就是图像仿射变换

    2024年01月17日
    浏览(51)
  • opencv视频截取每一帧并保存为图片python代码CV2实现练习

    当涉及到视频处理时,Python中的OpenCV库提供了强大的功能,可以方便地从视频中截取每一帧并将其保存为图片。这是一个很有趣的练习,可以让你更深入地了解图像处理和多媒体操作。 使用OpenCV库,你可以轻松地读取视频文件,并在循环中逐帧读取视频的每一帧。随后,你可

    2024年02月12日
    浏览(55)
  • 使用Python基于opencv实现多视频画面拼接融合算法demo

    单个相机视频画面尺寸有限,在需要全景展示的场景下,就需要将多个相机视频进行拼接融合,得到一张全景图。本文基于opencv实现一个视频拼接的demo,熟悉视频拼接流程和opencv接口。 直接上代码吧,注释还是比较清楚的: 该demo使用ORB算法检测关键点,使用BFMatcher进行特征

    2024年02月04日
    浏览(53)
  • opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)

    几何变换是计算机图形学中的一种图像处理技术,用于对图像进行空间上的变换,而不改变图像的内容。这些变换可以通过对图像中的像素位置进行调整来实现。 常见的几何变换包括: 平移(Translation) :将图像在水平和/或垂直方向上进行平移,即将图像的每个像素沿着指

    2024年02月15日
    浏览(46)
  • (OpenCV)图片拼接

            图片拼接在许多领域都有广泛的应用,包括但不限于以下几个方面: 全景摄影 :在摄影中,通过将多张照片拼接在一起可以实现全景照片的效果。这在旅游景点、房地产展示等领域有着广泛的应用,能够提供更加生动、真实的视觉体验。 医学影像处理 :在医学

    2024年02月22日
    浏览(40)
  • OpenCV处理图片拼接

    读入图片 预处理图片 图片特征提取 特征处理 特征匹配 透视变换 图片再处理 (可选)图片特征点连线配对 Sticher.py 引入头文件 创建类 自定义函数 def stich:外部接口函数 def detectAndDescribe:用于图片的特征点提取,内部逻辑函数 def matchKeypoints:特征点匹配 def drawMatches:显示2图片的特

    2024年02月21日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包