计算机视觉——图像拼接

目录

 图像拼接

一、图像拼接基本介绍

1.1 APAP算法原理

1.2 图像融合

1.3 基本流程

 二、实验过程

2.1实验代码

2.2分组实验

三、实验总结


 图像拼接

一、图像拼接基本介绍

图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。图像拼接在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。图像拼接的输出是两个输入图像的并集。
图像配准(image alignment)和图像融合是图像拼接的两个关键技术。图像配准是图像融合的基础,而且图像配准算法的计算量一般非常大,因此图像拼接技术的发展很大程度上取决于图像配准技术的创新。早期的图像配准技术主要采用点匹配法,这类方法速度慢、精度低,而且常常需要人工选取初始匹配点,无法适应大数据量图像的融合。图像拼接的方法很多,不同的算法步骤会有一定差异,但大致的过程是相同的。

1.1 APAP算法原理

在图像拼接融合的过程中,受客观因素的影响,拼接融合后的图像可能会存在“鬼影现象”以及图像间过度不连续等问题。下图就是图像拼接的一种“鬼影现象”。解决鬼影现象可以采用APAP算法。
算法流程:

  1. 提取两张图片的sift特征点
  2. 对两张图片的特征点进行匹配
  3. 匹配后,使用RANSAC算法进行特征点对的筛选,排除错误点。筛选后的特征点基本能够一一对应
  4. 使用DLT算法,将剩下的特征点对进行透视变换矩阵的估计
  5. 由于得到的透视变换矩阵是基于全局特征点对进行的,即一个刚性的单应性矩阵完成配准。为提高配准的精度,Apap将图像切割成无数多个小方块,对每个小方块进行单应性矩阵变换,非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。
     

1.2 图像融合

融合目的在于拼缝消除, Multi-Band能够达到比较好的融合效果,但是效率低,采用Laplacian(拉普拉斯)金字塔,通过对相邻两层的高斯金字塔进行差分,将原图分解成不同尺度的子图,对每一个之图进行加权平均,得到每一层的融合结果,最后进行金字塔的反向重建,得到最终融合效果过程。
由下图可知multi-band bleing的效果对于拼接之后的图像进行融合的效果是很好的。
 

计算机视觉——图像拼接_第1张图片

(1)首先计算当前待拼接图像和已合成图像的重叠部分。
计算机视觉——图像拼接_第2张图片
(2)两幅图像的融合:分别构建图像A、B的高斯金字塔和拉普拉斯金字塔,然后进行加权融合。
计算机视觉——图像拼接_第3张图片
(3)对加权后的拉普拉斯金字塔进行重构。
计算机视觉——图像拼接_第4张图片

1.3 基本流程

图像拼接的基本流程如下:

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

 二、实验过程

2.1实验代码

# 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()

2.2分组实验

1)固定点位拍摄

实验数据:

计算机视觉——图像拼接_第5张图片

实验结果:

计算机视觉——图像拼接_第6张图片

分析: 1)这三张图片拍摄于同一视角下不同角度的变换图像,其光线、位置、远近基本一致

            2)观察结果结果图片,可以发现左侧有很明显的错裂线,这是图像融合时特征点匹配出现误差,导致两幅图像叠加融合出现错位,这个不仅与SIFT特征匹配算法的出错有关,还和图像映射变换有关,因此产生鬼影现象

            3)结果图中墙上的亮斑区域出现了一些无关的黑点,以及图像右侧也出现部分鬼影,推测其可能是因为三幅图像拼接映射时产生噪声点导致的,特征点和图片模糊是有关联的

 2)景深丰富场景

 实验数据:

 计算机视觉——图像拼接_第7张图片

实验结果:

计算机视觉——图像拼接_第8张图片计算机视觉——图像拼接_第9张图片

计算机视觉——图像拼接_第10张图片

分析:1)这三张图片拍摄于同一视角下不同角度的变换图像,其景深较为复杂,前景是一个花瓶,后景是复杂的建筑,对于植物而言拍摄方位差异较大

           2)从两幅特征匹配图中可以看出,算法在三幅图像上找到了很多的特征匹配点,这些特征匹配点基本都是正确,因此最后的结果图像拼接的也比较好

           3)观察图像左侧横杆会发现,图像出现了断层、鬼影的现象,这是因为在三幅图像映射时,注重叠加了前景中的花瓶,而导致旁边的栏杆产生了变形

三、实验总结

  1. 对于视角变化过大的拼接情况,拼接图像很容易产生断层、鬼影现象,而拍摄角度平滑则更能够让图像融合
  2. 图像拼接需要至少包含15%的特征匹配点,否则图像融合难以确定
  3. 特征点和图片模糊是有关联的,不能一味的将图像缩小加快算法时间
  4. 特征匹配点错误,以及特征匹配点缺少都会导致图像拼接时产生错位或者断层。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(计算机视觉——图像拼接)