代码改变世界

python-基于RANSAC算法的图像拼接

2020-03-24 17:54  工班  阅读(3186)  评论(0编辑  收藏  举报

、基本原理

  1.1图像拼接

  1.2RANSAC算法

     1.2.1 步骤

二、整体流程

三、图像集

    3.1图像集BIG

     3.2图像集jia

     3.3图像集soft

     3.4图像集xiaoxue

四、代码

五、实验结果

六、实验总结

七、遇到的问题

一、基本原理

1.1图像拼接:

图像拼接就是把多张有重叠部分的图片拼接成一张无缝隙而且分辨率高的图像,(多张图像可以从不同的视觉、不同的时间、相同的视觉获得)

1.2RANSAC算法:

RANSAC的全称是“RANdom SAmple Consensus(随机抽样一致)”。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法,也就是说它有一定的概率得出一个合理的结果,所以为了提高概率必须提高迭代次数。

1.2.1 步骤:

1.根据给定图像/集,实现特征匹配
2. 通过匹配特征计算图像之间的变换结构
3..利用图像变换结构,实现图像映射
4..针对叠加后的图像,采用APAP之类的算法,对齐特征点
5. 通过图割方法,自动选取拼接缝
6. 根据multi-band bleing策略实现融合

二、基本流程

1.针对某个场景拍摄多张图像

2.计算第二张图像跟第一张图像之间的变换关系

3.将第二张图像叠加到第一张图像的坐标系中

4.变换后的融合、合成

5.在多图场景中,重复上述过程

 

三、图像集

 图像集BIG

 图像集jia

 

 图像集soft

 图像集xiaoxue

 

 

 

 

四、代码

 1 # -*- coding: utf-8 -*-
 2 from pylab import *
 3 from PIL import Image
 4 from PCV.geometry import homography, warp
 5 from PCV.localdescriptors import sift
 6 
 7 # set paths to data folder
 8 featname = ['D:/new/soft/' + str(i + 1) + '.sift' for i in range(3)]
 9 imname = ['D:/new/soft/' + str(i + 1) + '.jpg' for i in range(3)]
10 
11 # extract features and match
12 l = {}
13 d = {}
14 for i in range(3):
15     sift.process_image(imname[i], featname[i])
16     l[i], d[i] = sift.read_features_from_file(featname[i])
17 
18 matches = {}
19 for i in range(2):
20     matches[i] = sift.match(d[i + 1], d[i])
21 
22 # visualize the matches (Figure 3-11 in the book)
23 for i in range(2):
24     im1 = array(Image.open(imname[i]))
25     im2 = array(Image.open(imname[i + 1]))
26     figure()
27     sift.plot_matches(im2, im1, l[i + 1], l[i], matches[i], show_below=True)
28 
29 
30 # function to convert the matches to hom. points
31 def convert_points(j):
32     ndx = matches[j].nonzero()[0]
33     fp = homography.make_homog(l[j + 1][ndx, :2].T)
34     ndx2 = [int(matches[j][i]) for i in ndx]
35     tp = homography.make_homog(l[j][ndx2, :2].T)
36 
37     # switch x and y - TODO this should move elsewhere
38     fp = vstack([fp[1], fp[0], fp[2]])
39     tp = vstack([tp[1], tp[0], tp[2]])
40     return fp, tp
41 
42 
43 # estimate the homographies
44 model = homography.RansacModel()
45 
46 fp, tp = convert_points(1)
47 H_12 = homography.H_from_ransac(fp, tp, model)[0]  # im 1 to 2
48 
49 fp, tp = convert_points(0)
50 H_01 = homography.H_from_ransac(fp, tp, model)[0]  # im 0 to 1
51 
52 # warp the images
53 delta = 1000  # for padding and translation
54 
55 im1 = array(Image.open(imname[1]), "uint8")
56 im2 = array(Image.open(imname[2]), "uint8")
57 im_12 = warp.panorama(H_12, im1, im2, delta, delta)
58 
59 im1 = array(Image.open(imname[0]), "f")
60 im_02 = warp.panorama(dot(H_12, H_01), im1, im_12, delta, delta)
61 
62 figure()
63 imshow(array(im_02, "uint8"))
64 axis('off')
65 show()

五、实验结果

室内场景

近景

5.1sift特征匹配:

拼接结果:

 

远景:

sift特征匹配:

 

拼接结果:

 

 小结:这两组图像都是室内拍的,远景图像的特征点比较丰富,近景的比较单一,比较近景和远景的拼接结果图,远景的拼接图貌似更加的完整,并且拼接的缝隙也比较小,比较平滑。在相同的光照下,我只是改变了位置,条件都差不多,只有特征点的丰富程度,所以我认为图像的拼接效果跟特征点的丰富程度有关,特征点越丰富的,图像的凭借效果就越好。

 室外场景

远景

5.2sift特征匹配:

 

拼接结果:

 

近景

sift特征匹配:

 

 拼接结果:

小结:室外场景我共拍了两组,一组远的一组近的,实验室线提取图像的sift特征,然后链接相同特征点,然后在进行拼接,从拼接结果可以看出来远景拼接效果比近景好,远景的拼接和原场景一样,没有发生什么扭曲,拼接的缝隙很小,看起来很平滑,我认为可能是远景的特征点比较多,匹配的点也就更加的多,便于拼接出一幅平滑的图像。近景的效果看出从拼接结果图可以看出出现了明显的扭曲(窗户位置)和拼接缝隙,但是这幅图像存在近景和远景,出现瑕疵的地方是在远的地方,所以我认为可能跟拍摄的图像的光线亮度有问题,远处相对来说比较亮,近处比较暗。

 

六、实验总结 

1、图像的像素不能过大也不要过小,我的图像都改成了500*500,修改的原因是为了避免浪费时间和造成不必要的失败概率。

2、图像拍摄时从不同的角度的,我们存储图像的顺序要从右到左,因为这个实验的代码是从你命名的图像的第一张从右到左开始拼接的。

3、图像的拼接效果可能跟特征点的匹配程度和亮度有关,匹配程度越高的拼接效果就越好。如果要拼接的图像含有近景和远景的,远景中如果亮度过暗拼接效果就会降低。

七、遇到的问题

运行代码是出现报错

 

ValueError: did not meet fit acceptance criteria

 

 然后我百度看了别人的解决方法,重然后我就新拍了一组图像,把图像集的图像像素全部改成了500*500,每张图像都水平着拍,再次运行就成功了。