文章目录
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