目录
一.图像拼接基本流程
二.RANSAC(随机一致性采样)
2.1 RANSAC基本思想:数据中包含正确的点和噪声点,合理的模型应该能够在描述正确数据点的同时摒弃噪声点
2.2 RANSAC基本流程:
2.3 单应性矩阵
2.4 拼接图象
三.全景图像
3.1 提取图像的特征和关键点,匹配图像间的关键点
3.2 估计单应性矩阵
3.3 扭曲图像
四.实验结果
4.2 全景图像拼接
4.3 图像数据集
一.图像拼接基本流程
- 检测并提取图像的特征和关键点
- 匹配两个图像之间的描述符
- 使用RANSAC算法使用我们匹配的特征向量估计单应矩阵
- 拼接图像
前两个步骤是运用SIFT局部特征算子检测图像中的特征和关键点。步骤三:利用图像的重叠部分连接所有图片之后就可以形成一个基本的全景图了。匹配图片最常用的方式是采用RANSAC方法
二.RANSAC(随机一致性采样)
2.1 RANSAC基本思想:数据中包含正确的点和噪声点,合理的模型应该能够在描述正确数据点的同时摒弃噪声点
2.2 RANSAC基本流程:
- 随机选择4对匹配特征(条件:至少3个点不能再同一条直线上)
- 根据DLT(直线线性变换)算法计算单应性矩阵H
- 对所有匹配点计算映射误差
- 确定误差阈值,确定inliers
- 针对最大inliers集合,重新计算单应性矩阵H
2.3 单应性矩阵
单应性矩阵可以有两幅图像或平面中对应点对计算出来。每个对应点对可以写出两个方程,分别对应于x和y坐标。因此,计算单应性矩阵H需要4个对应点对
其中A是一个具有对应点对二倍数量行数的矩阵。将这些对应点对方程的系数堆叠到一个矩阵中,我们可以用SVD(奇异值分解)算法找到H的最小二乘解
2.4 拼接图象
估计出图像间的单应性矩阵(使用RANSAC算法),现在我们需要将所有的图像扭曲到一个公共的图像平面上。通常,这里的公共平面为中心图像平面(否则需要进行大量扭曲)。一种方法是创建一个很大的图像,比如图像中全部填充0,使其和中心图像平行,然后将所有的图像扭曲到上面。由于我们所有的图像是由照相机水平旋转拍摄的,因此我们可以使用一个较简单的步骤:将中心图像左边或右边的区域填充0,以便为扭曲的图像腾出空间
三.全景图像
3.1 提取图像的特征和关键点,匹配图像间的关键点
# 使用SIFT特征自动找到匹配对应
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])
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)
3.2 估计单应性矩阵
# 将匹配转换成齐次坐标点的函数
def convert_points(j):
ndx = matches[j].nonzero()[0]
fp = homography.make_homog(l[j + 1][ndx, :2].T)
ndx2 = [int(matches[j][i]) for i in ndx]
tp = homography.make_homog(l[j][ndx2, :2].T)
fp = vstack([fp[1], fp[0], fp[2]])
tp = vstack([tp[1], tp[0], tp[2]])
return fp, tp
# 估计单应性矩阵
model = homography.RansacModel()
fp, tp = convert_points(1)
H_12 = homography.H_from_ransac(fp, tp, model)[0] # im 1 to 2的单应性矩阵
fp, tp = convert_points(0)
H_01 = homography.H_from_ransac(fp, tp, model)[0] # im 0 to 1
tp, fp = convert_points(2) # 注意点是反序的
H_32 = homography.H_from_ransac(fp, tp, model)[0] # im 3 to 2
tp, fp = convert_points(3) # 注意点是反序的
H_43 = homography.H_from_ransac(fp, tp, model)[0] # im 4 to 3
3.3 扭曲图像
# 扭曲图像
delta = 2000 # 用于填充和平移
im1 = array(Image.open(imname[1]), "uint8")
im2 = array(Image.open(imname[2]), "uint8")
im_12 = warp.panorama(H_12, im1, im2, delta, delta)
im1 = array(Image.open(imname[0]), "f")
im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)
im1 = array(Image.open(imname[3]), "f")
im_32 = warp.panorama(H_32, im1, im_02, delta, delta)
im1 = array(Image.open(imname[4]), "f")
im_42 = warp.panorama(dot(H_32, H_43), im1, im_32, delta, 2 * delta)
四.实验结果
4.1 关键点匹配图
4.2 全景图像拼接
4.3 图像数据集
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)