文章目录
图像拼接
如何拼接
- 在图像集合中实现图像的特征匹配
- 尽可能的排除图像噪声点干扰
- 通过图像的匹配特征判断图像变换的结构
- 对于匹配后的图像要对齐特征点
- 对于拼接缝要有较好的处理
扩:对于特征匹配较好但图像背景亮度有差距的图像的匹配问题
使用SIFT算法进行特征匹配
代码如下,保证sift.exe被成功配置为系统变量
from numpy import *
# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift
from PIL import Image
from pylab import *
# 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])
效果如下
Ransac算法
原理
sift匹配的缺点
匹配出的点,不全是能够准确反映图像信息的特征点,还包含许多噪声点。
需要尽可能的分离特征点和噪声点
定义
随机抽样一致算法(Random Sample Consensus,RANSAC)。它采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。 RANSAC是一个非确定性算法,在某种意义上说,它会产生一个在一定概率下合理的结果,而更多次的迭代会使这一概率增加。
- 内群数据可以通过几组模型的参数来叙述其分布,而离群数据则是不适合模型化的数据。
- 数据会受噪声影响,噪声指的是离群,例如从极端的噪声或错误解释有关数据的测量或不正确的假设。
- RANSAC假定,给定一组(通常很小)的内群,存在一个程序,这个程序可以估算最佳解释或最适用于这一数据模型的参数。
在这个例子中,需要找到一条拟合最多点的线,离该线越远的点,即被视为噪声点
算法实现
使用RANSAC算法求解单应性矩阵
class RansacModel(object):
""" 单应性矩阵由http://www.scipy.org/Cookbook/RANSAC的 ransac.py计算"""
def __init__(self,debug=False):
self.debug = debug
def fit(self, data):
""" Fit homography to four selected correspondences. """
# transpose to fit H_from_points()
data = data.T
# 映射起始点
fp = data[:3,:4]
# 映射的目标点
tp = data[3:,:4]
# 计算单应性矩阵
return H_from_points(fp,tp)
def get_error