Python 图像拼接
图像拼接
1.1 基本介绍
图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。图像拼接在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。
图像配准(image alignment)和图像融合是图像拼接的两个关键技术。图像配准是图像融合的基础,而且图像配准算法的计算量一般非常大,因此图像拼接技术的发展很大程度上取决于图像配准技术的创新。早期的图像配准技术主要采用点匹配法,这类方法速度慢、精度低,而且常常需要人工选取初始匹配点,无法适应大数据量图像的融合。图像拼接的方法很多,不同的算法步骤会有一定差异,但大致的过程是相同的。
1.2 基本原理
在图像拼接中首先利用SIFT算法提取图像特征进而进行特征匹配,继而使用RANSAC算法对特征匹配的结果进行优化,接着利用图像变换结构进行图像映射,最终进行图像融合。
1.2.1 解决“鬼影”:APAP算法
算法流程:
- 提取两张图片的sift特征点
- 对两张图片的特征点进行匹配
- 匹配后,使用RANSAC算法进行特征点对的筛选,排除错误点。筛选后的特征点基本能够一一对应
- 使用DLT算法,将剩下的特征点对进行透视变换矩阵的估计
- 由于得到的透视变换矩阵是基于全局特征点对进行的,即一个刚性的单应性矩阵完成配准。为提高配准的精度,Apap将图像切割成无数多个小方块,对每个小方块进行单应性矩阵变换,非常依赖于特征点对。若图像高频信息较少,特征点对过少,配准将完全失效,并且对大尺度的图像进行配准,其效果也不是很好,一切都决定于特征点对的数量。
1.2.2 寻找最佳拼接缝
为什么寻找最佳拼接缝?
因为图像的重叠导致了重影,解决方式就是不让图片重叠。具体的方式是在图像重叠的区域中找到一条切割线,使得在切割线的左边用图片A,在切割线的右边用图片B,则就解决了图像拼接后因为重叠而导致的重影问题。
寻找原则:
要找到一条好的切割线,就要在线的左右两边图像的像素差异比较小,这样切割出来的效果,就没有强烈的违和感。
1.2.3 图像融合
采用Laplacian(拉普拉斯)金字塔,通过对相邻两层的高斯金字塔进行差分,将原图分解成不同尺度的子图,对每一个之图进行加权平均,得到每一层的融合结果,最后进行金字塔的反向重建,得到最终融合效果过程。
-
首先计算当前待拼接图像和已合成图像的重叠部分。
-
两幅图像的融合:分别构建图像A、B的高斯金字塔和拉普拉斯金字塔,然后进行加权融合。
-
对加权后的拉普拉斯金字塔进行重构。
1.3 实验过程
1.3.1 实验代码
from numpy import *
from matplotlib.pyplot import *
from PIL import Image
from numpy import array, vstack, dot
import warp
import homography
from PCV.localdescriptors import sift
featname = ['img/' + str(i + 1) + '.sift' for i in range(5)]
imname = ['img/' + str(i + 1) + '.jpg'