目录
图像拼接
一、图像拼接基本介绍
1.1 APAP算法原理
1.2 图像融合
1.3 基本流程
二、实验过程
2.1实验代码
2.2分组实验
三、实验总结
图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。图像拼接在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。图像拼接的输出是两个输入图像的并集。
图像配准(image alignment)和图像融合是图像拼接的两个关键技术。图像配准是图像融合的基础,而且图像配准算法的计算量一般非常大,因此图像拼接技术的发展很大程度上取决于图像配准技术的创新。早期的图像配准技术主要采用点匹配法,这类方法速度慢、精度低,而且常常需要人工选取初始匹配点,无法适应大数据量图像的融合。图像拼接的方法很多,不同的算法步骤会有一定差异,但大致的过程是相同的。
在图像拼接融合的过程中,受客观因素的影响,拼接融合后的图像可能会存在“鬼影现象”以及图像间过度不连续等问题。下图就是图像拼接的一种“鬼影现象”。解决鬼影现象可以采用APAP算法。
算法流程:
融合目的在于拼缝消除, Multi-Band能够达到比较好的融合效果,但是效率低,采用Laplacian(拉普拉斯)金字塔,通过对相邻两层的高斯金字塔进行差分,将原图分解成不同尺度的子图,对每一个之图进行加权平均,得到每一层的融合结果,最后进行金字塔的反向重建,得到最终融合效果过程。
由下图可知multi-band bleing的效果对于拼接之后的图像进行融合的效果是很好的。
(1)首先计算当前待拼接图像和已合成图像的重叠部分。
(2)两幅图像的融合:分别构建图像A、B的高斯金字塔和拉普拉斯金字塔,然后进行加权融合。
(3)对加权后的拉普拉斯金字塔进行重构。
图像拼接的基本流程如下:
# ch3_panorama_test.py
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 = ['img/' + str(i + 1) + '.sift' for i in range(3)]
imname = ['img/' + str(i + 1) + '.jpg' for i in range(3)]
# extract features and match
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])
print(matches)
# visualize the matches (Figure 3-11 in the book)
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)
# function to convert the matches to hom. points
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)
# switch x and y - TODO this should move elsewhere
fp = vstack([fp[1],fp[0],fp[2]])
tp = vstack([tp[1],tp[0],tp[2]])
return fp,tp
# estimate the homographies
model = homography.RansacModel()
fp,tp = convert_points(0)
H_01 = homography.H_from_ransac(fp,tp,model)[0] #im 0 to 1
tp,fp = convert_points(1) #NB: reverse order
H_21 = homography.H_from_ransac(fp,tp,model)[0] #im 2 to 1
# warp the images
delta = 2000 # for padding and translation
im1 = array(Image.open(imname[0]), "uint8")
im2 = array(Image.open(imname[1]), "uint8")
im_01 = warp.panorama(H_01,im1,im2,delta,delta)
im1 = array(Image.open(imname[2]), "f")
im_21 = warp.panorama(H_21,im1,im_01,delta,delta)
figure()
imshow(array(im_21, "uint8"))
axis('off')
savefig("example5.png",dpi=300)
show()
1)固定点位拍摄
实验数据:
实验结果:
分析: 1)这三张图片拍摄于同一视角下不同角度的变换图像,其光线、位置、远近基本一致
2)观察结果结果图片,可以发现左侧有很明显的错裂线,这是图像融合时特征点匹配出现误差,导致两幅图像叠加融合出现错位,这个不仅与SIFT特征匹配算法的出错有关,还和图像映射变换有关,因此产生鬼影现象
3)结果图中墙上的亮斑区域出现了一些无关的黑点,以及图像右侧也出现部分鬼影,推测其可能是因为三幅图像拼接映射时产生噪声点导致的,特征点和图片模糊是有关联的
2)景深丰富场景
实验数据:
实验结果:
分析:1)这三张图片拍摄于同一视角下不同角度的变换图像,其景深较为复杂,前景是一个花瓶,后景是复杂的建筑,对于植物而言拍摄方位差异较大
2)从两幅特征匹配图中可以看出,算法在三幅图像上找到了很多的特征匹配点,这些特征匹配点基本都是正确,因此最后的结果图像拼接的也比较好
3)观察图像左侧横杆会发现,图像出现了断层、鬼影的现象,这是因为在三幅图像映射时,注重叠加了前景中的花瓶,而导致旁边的栏杆产生了变形