文章目录
一.RANCAC算法
1.1 定义
1.2 算法步骤
二.全景拼接
1.针对固定点位拍摄多张图片,以中间图片为中心,实现图像的拼接融合
1.1 实现代码
1.2 实验结果
1.3 分析
- 针对同一场景(需选取视差变化大的场景,也就是有近景目标),更换拍摄位置,分析拼接结果
2.1 实现代码
2.2 实验结果
2.3 分析
RANSAC算法
1.1定义:
随机抽样一致算法(random sample consensus,RANSAC),采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。
RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
1.2 RANSAC算法步骤:
随机从数据集中随机抽出4个样本数据 (此4个样本之间不能共线),计算出变换矩阵H,记为模型M;
计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集 I ;
如果当前内点集 I 元素个数大于最优内点集 I_best , 则更新 I_best = I,同时更新迭代次数k ;
如果迭代次数大于k,则退出 ; 否则迭代次数加1,并重复上述步骤;
注:迭代次数k在不大于最大迭代次数的情况下,是在不断更新而不是固定的,见上方k的更新;
其中,p为置信度,一般取0.995;w为”内点”的比例 ; m为计算模型所需要的最少样本数=4;
求得单应矩阵后就好办了,把内点留下,内点就是筛选后的好用的点,外点舍弃,外点就有可能是误匹配的点。
二.全景拼接
步骤:
1、针对某个场景拍摄多张/序列图像
2、通过匹配特征(sift匹配)计算下一张图像与上一张图像之间的变换结构。
3、图像映射,将下一张图像叠加到上一张图像的坐标系中
4、变换后的融合/合成
重复上述过程
- 针对固定点位拍摄多张图片,以中间图片为中心,实现图像的拼接融合
1.1代码实现
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
import sift
from PCV.tools.imtools import get_imlist
"""
This is the panorama example from section 3.3.
"""
#set paths to data folder
#featname = ['C://Users//Garfield//Desktop//towelmatch//' + str(i + 1) + 'out_sift_1.txt' for i in range(5)]
#imname = ['C://Users//Garfield//Desktop//towelmatch//' + str(i + 1) + '.jpg' for i in range(5)]
imname = ['C://Users//Desktop//towelmatch//pinjie//' + str(i + 1) + '.jpg' for i in range(5)]
download_path = "C://Users//Desktop//towelmatch//pinjie//" # set this to the path where you downloaded the panoramio images
imlist = get_imlist(download_path)
l = {
}
d = {
}
featname = ['out_sift_1.txt' for imna in imlist]
for i, imna in enumerate(imlist):
sift.process_image(imna, featname[i])
l[i], d[i] = sift.read_features_from_file(featname[i])
#extract features and match
#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)
#sift匹配可视化
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