一、明确图像拼接整体流程
- 提供一组图像集,实现特征匹配(相邻图像之间要有重复区域)
- 通过匹配特征计算图像之间的变换结构
- 利用图像变换结构,实现图像映射
扩展: - 针对叠加后的图像,采用APAP之类的算法,对齐特征点
- 通过图割方法,自动选取拼接缝
1.1实现图像集之间的特征匹配
关于使用SIFT特征实现图像之间的特征匹配原理及例子请阅读这篇博文(https://mp.csdn.net/mdeditor/88585677#),这里便不再详细解释了。
在本实验中,如下代码能够实现特征匹配
import sift
featname = ['D:输入图片/Univ'+str(i+1)+'.sift' for i in range(5)]
imname = ['D:输入图片/Univ'+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])
实现结果如下所示:
1.2使用RANSAC求解单应性矩阵
RANSAC(Random Sample Consensus)即随机采样一致性,对SIFT算法产生的128维特征描述符进行剔除错误匹配点。
它的基本思想是:数据中包含正确的点和噪声点,给定一个合理的模型,这个模型应该能够在描述正确数据点的同时摒弃噪声点。
在本实验中,在上一步特征匹配获得的匹配点对中抽取几对匹配点,计算变换矩阵,并将这几对点记录为”inliers”。继续寻找配准点对中的"outliers",若这些配准点对符合矩阵,则将其添加到"inliers"。当"inliers"中的点对数大于设定阈值时,则判定此矩阵为精确的变换矩阵。依照以上方法,随机采样 N 次,选取"inliers"数最大集合,剔除"outliers"等误配点对。
实现此功能的代码如下:
class RansacModel(object):
def __init__(self,debug=False):
self.debug = debug
def fit(self, data):
#计算选取的4个对应点对,拟合一个单应性矩阵。
#将这些矩阵转置,来调用H_from_points()计算单应性矩阵
data = data.T
#映射的起始点
fp = data[:3,:4]
#映射的目标点
tp = data[3:,:4]
#计算单应性矩阵,然后返回
return H_from_points(fp,tp)
def get_error( self, data, H):
#对所有的对应点计算单应性矩阵,然后对每个变换后的点,返回相应的误差
data = data.