计算机视觉 图像拼接

本文探讨了RANCAC算法和RANSAC算法在图像拼接中的作用,详细介绍了RANSAC的定义、步骤,并展示了全景拼接的过程,包括特征匹配、变换矩阵计算和图像融合。实验结果显示,虽然在某些情况下拼接效果不佳,如光照差异导致的边界问题和近景物体的鬼影,但整体阐述了图像拼接的基本原理和技术挑战。
摘要由CSDN通过智能技术生成

文章目录

一.RANCAC算法
1.1 定义
1.2 算法步骤

二.全景拼接

1.针对固定点位拍摄多张图片,以中间图片为中心,实现图像的拼接融合

1.1 实现代码
1.2 实验结果
1.3 分析

  1. 针对同一场景(需选取视差变化大的场景,也就是有近景目标),更换拍摄位置,分析拼接结果

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.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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值