[摘要]
图像拼接(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,两行代码就可以得到一个很好的拼接图像。
stitch有两个返回值,一个是status,表示是否拼接成功;另一个是pano,当图像匹配的特征点足够时,拼接成功,返回全景图,当图像匹配的特征点不够时,拼接失败,返回None。
3.2.1 Stitcher类
OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑太多的细节。低级别函数封装在detail命名空间中,展示了OpenCV算法实现的很多步骤和细节,使熟悉如下拼接流水线的用户,方便自己定制。OpenCV 网站提供的Stitching内部流程结构图为:
源码中提到了七个部分:
(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 黑边处理
由于拼接前的图片大小不一致,图片拼接完成后,会出现图像边界外的黑色像素,使得拼接后的图片不完美。
拼接前:
拼接后:
接下来对拼接后的图片进行黑边处理:
(1)提取黑边轮廓
利用copyMakeBorder函数扩充边界,让拼接后的图片上下左右分辨扩充10像素的黑色边框。threshold函数使得灰度大于某个数值像素点保留,返回处理后的二值化图像。在代码cv2.threshold(gray,0,255,cv2.THRESH_BINARY)中,如果像素值大于0的,则像素变为白色(255),其他像素值位置变为黑色(0)。图像像素值范围为[0,255],因此,除了黑色区域,其他部位全为白色。
(2)计算最大的轮廓边界
findContours寻找图像的轮廓,返回两个值,轮廓的点集和各层轮廓的索引。cv2.RETR_EXTERNAL表示只检测外轮廓。cv2.CHAIN_APPROX_SIMPLE表示压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。boundingRect找到一个最小的矩形,把找到的轮廓包起来;cv2.rectangle则画出矩形。
(3)寻找拼接后图片内部最大的矩形区域
这里创建了两个蒙版,循环使用腐蚀-像素相减,从而得到拼接后图片内部最大的矩形区域。通过cv2.erode()腐蚀minRect,直到sub为全黑。cv2.countNonZero返回灰度值不为0的像素数,用来判断图像是否全黑cv2.subtract()作用是两个图像像素相减,灰度图像素值范围0-255,如果两个数相减得到负数的话,会直接将其置为0;如果两个数相加,结果超过了255的话,则直接置为255。
(4)寻找矩形框的轮廓,进行裁剪
黑边处理后的拼接图:
4. 实验结果与分析
4.1 使用stitcher类得到的拼接对比
测试数据1:
拼接结果:
测试数据2:
测试结果:
测试数据3:(多图拼接)
测试结果:
分析评价:
调用stitcher类得到的拼接图片,对黑边处理之后,效果很好,但是,调用stitcher类实现时对图片的特征匹配有要求,一些特征点不够的图片无法拼接,并且,当图片较大或多张图片拼接时,速度较慢。
4.2 项目组内方法对比
方法一:使用SIFT算法得到的拼接
方法二:使用ORB算法得到的拼接
方法三:调用stitcher类得到的拼接
分析评价:
通过上述测试数据可以看出,得到图片的效果:Stitcher>ORB>SIFT.
ORB算法和SIFT算法只是不同的特征提取方法,ORB算法在FAST算法的基础上,提取了特征点的方向。同时根据特征点的方向,采用改进BRIEF算法的 Rotated BRIEF算法对特征进行描述,从而取长补短,即高效的完成了特征提取和特征描述,又使得特征描述向量具有旋转不变性,在噪声情况下更有效,但是会受到光线变化的影响。使用OpenCV自带的Stitcher类,虽然拼接效果最好,使用简单,并且可以一次拼接多张图片,但是需要足够的相同特征区域进行匹配,并且图片太大的话,速度较慢甚至报错。文章来源:https://www.toymoban.com/news/detail-786777.html
5. 结束语
本次计算机视觉项目我们为实现图片的拼接和融合,我们三人分别采用不同的方法实现,分别是基于SIFT算法、ORB算法和Stitcher类实现图片拼接。对比三种方法所得结果可以看出,Stitcher类实现对于图像的拼接的效果非常好,且可以拼接多张图片,但是当图片较大时速度较慢,且需满足足够的相同特征点才能进行图片拼接,对于SIFT算法和ORB算法,得到的图片需要经过再次处理,才能得到相对完美的图片,SIFT算法可以提供较高的准确率,ORB算法的速度非常快,但是最容易出现问题。文章来源地址https://www.toymoban.com/news/detail-786777.html
到了这里,关于CV——基于Stitcher类实现图片拼接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!