多张图像拼接成全景图
实验原理
基于sift检测的图像拼接,python实现。要实现两张图片的简单拼接,其实只需找出两张图片中相似的点 , 计算一张图片可以变换到另一张图片的变换矩阵,用这个矩阵把那张图片变换后放到另一张图片相应的位置 ,就是相当于把两张图片中相似的点重合在一起。就可以实现简单的全景拼接。
原图:
实现代码
# -*- coding: utf-8 -*-
from pylab import *
from numpy import *
from PIL import Image
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift
featname = ['D:\\Users\\16004\\PycharmProjects\\pythonPrpjectj1\\' + str(i + 1) + '.sift' for i in range(3)]
imname = ['D:\\Users\\16004\\PycharmProjects\\pythonPrpjectj1\\' + str(i + 1) + '.jpg' for i in range(3)]
l = {}
d = {}
for i in range(3):
sift.process_image(imname[i], featname[i])
l[i], d[i] = sift.read_features_from_file(featname[i])
matches = {}
for i in range(2):
matches[i] = sift.match(d[i + 1], d[i])
for i in range(2):
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)
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
delta = 1000 # for padding and translation
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)
figure()
imshow(array(im_02, "uint8"))
axis('off')
show()
运行结果
实验结论
这次实验,只采用了三张图像,因为有的图没拍好,用了运行不出来。在运行时,出现找不到.sift文件的情况,可能是因为图片过大,没拍到符合试验要求的图片,通过询问同学,网上查找资料,根据别人博客的指导,一步步解决问题。图片拼接后有点扭曲,实现的不太理想,拍照的时候忘记人要平移拍,而不是旋转拍,这样图形扭曲的太严重了。这次实验,收获良多。