计算机视觉——第三章 图像拼接

计算机视觉——第三章 图像拼接

  • 1.图像全景拼接的原理和过程的简要介绍
    • 1.1 特征点提取和匹配
    • 1.2图像配准
    • 1.3图像拼接
  • 2.实现多图像拼接
    • 2.1 图片集说明
    • 2.2 实验代码
    • 2.3实验结果及其分析
  • 3.两张不同角度的图像拼接
    • 3.1图片集说明
    • 3.2 实验代码
    • 3.3 实验结果及其分析
  • 总结

1.图像全景拼接的原理和过程的简要介绍

在同一位置拍摄的两幅或者多幅图片是单应性相关的,我们经常使用该约束将很多图像缝补起来,拼成一个全景图。
图像的全景拼接包括三大部分:特征点提取与匹配、图像配准、图像融合。图像全景拼接的整体流程如下:
1.根据给定的图像集,实现图像之间的特征匹配;
2.通过匹配特征,计算图像之间的变换结构;
3.利用图像的变换结构,实现图像间的映射;
4.针对叠加后的图像,采用相应算法,对齐特征点;
5.通过图割的方法,自动选取拼接缝;
6.图像进行融合。

1.1 特征点提取和匹配

在此次实验中,我我使用的是sift特征匹配,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。
其步骤如下:
1.生成高斯差分金字塔(DOG金字塔),尺度空间构建
2.空间极值点检测(关键点的初步查探)
3.稳定关键点的精确定位
4.稳定关键点方向信息分配
5.关键点描述
6.特征点匹配

1.2图像配准

在进行图像拼接时,我们首先要解决的是找到图像之间的匹配的对应点。通常我们采用SIFT算法来实现特征点的自动匹配,SIFT是具有很强稳健性的描述子,比起图像块相关的Harris角点,它能产生更少的错误的匹配,但仍然还是存在错误的对应点。所以需要用RANSAC算法,对SIFT算法产生的128维特征描述符进行剔除误匹配点。
由直线的知识点可知,两点可以确定一条直线,所以可以随机的在数据点集中选择两点,从而确定一条直线。然后通过设置给定的阈值,计算在直线两旁的符合阈值范围的点,统计点的个数inliers。inliers最多的点集所在的直线,就是我们要选取的最佳直线。
RANSAC算法就是在一原理的基础上,进行的改进,从而根据阈值,剔除错误的匹配点。首先,从已求得的匹配点对中抽取几对匹配点,计算变换矩阵。然后对所有匹配点,计算映射误差。接着根据误差阈值,确定inliers。最后针对最大inliers集合,重新计算单应矩阵 H。

1.3图像拼接

在估计出图像的单应性矩阵后,我们需要将所有的图像扭曲到一个公共的图像平面上。通常我们以中心图像平面作为公共平面,然后将中心图像左边或者右边的区域填充为0,以便为扭曲的图像腾出空间。

2.实现多图像拼接

2.1 图片集说明

此次实验的图片拍摄于集美大学嘉庚图书馆的背面。本组五张图片拍摄于同一地点:通过机位移动,拍摄到从左至右有部分重叠的五张图片,用于此次多图片拼接。
在这里插入图片描述

2.2 实验代码

from numpy import *
from matplotlib.pyplot import *
from PIL import Image
import warp
import homography
from PCV.localdescriptors import sift


featname = ['D:/pycharmProject/大三下课程(Anaconda)/计算机视觉/实验(图像拼接)/img1/' + str(i + 1) + '.sift' for i in range(5)]
imname = ['D:/pycharmProject/大三下课程(Anaconda)/计算机视觉/实验(图像拼接)/img1/' + str(i + 1) + '.jpg' for i in range(5)]
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])

# visualize the matches (Figure 3-11 in the book)
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)

# 将匹配转换成齐次坐标点的函数
def convert_points(j):
    ndx = matches[j].nonzero(

你可能感兴趣的:(python,计算机视觉,人工智能)