计算机视觉--全景图像拼接

全景图像拼接:从原理到实践
本文详细介绍了全景图像拼接的原理,包括特征点提取与匹配、图像配准和融合,并通过两个实验场景展示了不同的拼接效果。实验过程中分析了失败原因和成功因素,总结了影响拼接效果的关键因素,如拍摄角度、景深复杂度等,并记录了遇到的问题及解决方法。

1、全景图像拼接

1.1 原理

全景图像拼接,即将两幅或多幅具有重叠区域的图像,合并成一张大图。全景图像拼接的实现基本上包括特征点的提取与匹配、图像配准、图像融合三大部分。
特征点的提取与匹配: 采用SIFT特征点匹配算法对图像进行特征点匹配,得到两幅图像中相互匹配的特征点对,以及每个特征点对应的特征点描述符,但这些特征点对中会有一部分是误匹配点,因此我们需要进行匹配点对的消除,一般我们使用RANSAC去除误匹配点对。
图像配准: 采用一定的匹配策略,找出待拼接图像中的模板或特征点在参考图像中对应的位置,进而确定两幅图像之间的变换关系。
图像融合: 将待拼接图像的重合区域进行融合得到拼接重构的平滑无缝全景图像。

1.2 基本流程

图像拼接的基本流程如下:
1、针对某个场景拍摄多张/序列图像
2、计算第二张图像与第一张图像之间的变换关系 (sift匹配)
3、将第二张图像叠加到第一张图像的坐标系中 (图像映射)
4、融合/合成变换后的图像

2、实验过程

2.1 场景一:固定点拍摄多张图片
2.1.1 实验结果展示

失败:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拼接结果:
在这里插入图片描述
成功:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
拼接结果:
在这里插入图片描述

2.1.2 小结

失败分析:
由上图失败例子可看出,拼接效果非常不好,楼层完全错乱,基本没有正确拼接的地方。从特征匹配图中也可看出有不少错误匹配的地方,可能是因为楼层相似度过高,且拍摄角度太小导致拼接发生扭曲,错乱。
成功分析:
由上图成功例子可看出,拼接效果还不错,虽然景深比较复杂,但拼接之后基本没有错乱重影的地方,图像大部分都有正确正确拼接。可能是因为图像本身虽然事物繁多复杂,但相似度不高,影响特征匹配的因素小,所以拼接效果比较理想。

2.1.3 代码
from pylab import *
from numpy import *
from PIL import Image

# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift

"""
This is the panorama example from section 3.3.
"""

# set paths to data folder

featname = ['C:/A/1/' + str(i + 1) + '.sift' for i in range(5)]
imname = ['C:/A/1/' + str(i + 1) + '.jpg' for i in range(5)]

# extract features and match
l = {
   
   }
d = {
   
   }
for i in range(5):
    sift.process_image(imname[i], featname[i])
    l[i], d[i] = sift.read_features_from_file(featname[i])

matches = {
   
   }
for i in range(4):
    matches[i] = sift.match(d[i + 1], d[i])

# visualize the matches (Figure 3-11 in the book)
# sift匹配可视化
for i in range(4):
    im1 = array(Image.open(imname[i]))
    im2 = array(Image.open(imname[i + 1]))
    figure()
    sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)


# function to convert the matches to hom. points
# 将匹配转换成齐次坐标点的函数
def convert_points(j):
    ndx = matches
压缩包中包含的具体内容: 对给定数据中的6个不同场景图像,进行全景拼接操作,具体要求如下: (1) 寻找关键点,获取关键点的位置尺度信息(DoG检测子已由KeypointDetect文件夹中的detect_features_DoG.m文件实现;请参照该算子,自行编写程序实现Harris-Laplacian检测子)。 (2) 在每一幅图像中,对每个关键点提取待拼接图像的SIFT描述子(编辑SIFTDescriptor.m文件实现该操作,运行EvaluateSIFTDescriptor.m文件检查实现结果)。 (3) 比较来自两幅不同图像的SIFT描述子,寻找匹配关键点(编辑SIFTSimpleMatcher.m文件计算两幅图像SIFT描述子间的Euclidean距离,实现该操作,运行EvaluateSIFTMatcher.m文件检查实现结果)。 (4) 基于图像中的匹配关键点,对两幅图像进行配准。请分别采用最小二乘方法(编辑ComputeAffineMatrix.m文件实现该操作,运行EvaluateAffineMatrix.m文件检查实现结果)RANSAC方法估计两幅图像间的变换矩阵(编辑RANSACFit.m 文件中的ComputeError()函数实现该操作,运行TransformationTester.m文件检查实现结果)。 (5) 基于变换矩阵,对其中一幅图像进行变换处理,将其与另一幅图像进行拼接。 (6) 对同一场景的多幅图像进行上述操作,实现场景的全景拼接(编辑MultipleStitch.m文件中的makeTransformToReferenceFrame函数实现该操作)。可以运行StitchTester.m查看拼接结果。 (7) 请比较DoG检测子Harris-Laplacian检测子的实验结果。图像拼接的效果对实验数据中的几个场景效果不同,请分析原因。 已经实现这些功能,并且编译运行均不报错!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值