计算机视觉ch3 图像到图像映射——全景拼接
文章目录
- 何为全景拼接
- sift匹配
- 图像配准
- python实现
- 问题总结
何为全景拼接
将两幅或多幅具有重叠区域的图像,合并成一张大图
→基础流程:
- 针对某个场景拍摄多张/序列图像
- 计算第二张图像与第一张图像之间的变换关系 (sift匹配)
- 将第二张图像叠加到第一张图像的坐标系中 (图像映射)
- 变换后的融合/合成
- 在多图场景中,重复上述过
总结起来就是 特征点的提取与匹配、图像配准、图像融合。
sift匹配
利用Sift提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。
具体步骤可以参考之前的博文:
https://blog.csdn.net/weixin_44059188/article/details/90698704
图像配准
图片匹配就是找到图像之间所有重叠的部分,将其拼接后就能得到一幅全景图
它是一种确定待拼接图像间的重叠区域以及重叠位置的技术,是整个图像拼接的核心
本文采用的是基于特征点的图像配准方法,即通过匹配点对构建图像序列之间的变换矩阵,从而完成全景图像的拼接
RANSAC算法
首先随机地选择两个点,用两个点确定一条直线,称在这条直线一定范围内的点为这条直线的支撑。这样的随机选择重复数次,然后,具有最大支撑集的直线被确认为是样本点集的拟合。在拟合的误差距离范围内的点被认为是内点,它们构成一致集,反之则为外点。
根据算法描述,可以很快判断,如果只有少量外点,那么随机选取的包含外点的初始点集确定的直线不会获得很大的支撑,值得注意的是,过大比例的外点将导致RANSAC算法失败。
在直线拟合的例子中,由点集确定直线至少需要两个点;而对于透视变换,这样的最小集合需要有4个点。
Homography
在图片拼接的过程中,需要进行一些简单的单应性变换才可以进行比较平稳的拼接,具体的内容可以参考:
https://blog.csdn.net/weixin_44059188/article/details/90922045
python实现
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
from PCV.localdescriptors import sift# set paths to data folder
featname = [str(i+1)+'.txt' for i in range(2)]
imname = [str(i+1)+'.jpg' for i in range(2)]# extract features and match
l = {}
d = {}
for i in range(2):sift.process_image(imname[i],featname[i])l[i],d[i] = sift.read_features_from_file(featname[i])matches = {}
for i in range(1):matches[i] = sift.match(d[i+1],d[i])# visualize the matches (Figure 3-11 in the book)
for i in range(1):im1 = array(Image.open(imname[i]))im2 = array(Image.open(imname[i+1]))figure()sift.plot_matches(im1,im2,l[i+1],l[i],matches[i],show_below=True)# function to convert the matches to hom. points
def convert_points(j):ndx = matches[j].nonzero()[0]fp = homography.make_homog(l[j+1][ndx,:2].T) ndx2 = [int(matches[j][i]) for i in ndx]tp = homography.make_homog(l[j][ndx2,:2].T) # switch x and y - TODO this should move elsewherefp = vstack([fp[1],fp[0],fp[2]])tp = vstack([tp[1],tp[0],tp[2]])return fp,tp# estimate the homographies
model = homography.RansacModel() fp,tp = convert_points(0)
H_01 = homography.H_from_ransac(fp,tp,model)[0] #im 0 to 1 # warp the images
delta = 2000 # for padding and translationim1 = array(Image.open(imname[0]), "uint8")
im2 = array(Image.open(imname[1]), "uint8")
im_12 = warp.panorama(H_01,im1,im2,delta,delta)figure()
imshow(array(im_12, "uint8"))
axis('off')
show()
场景1:近景(有层次感)
素材:
sift匹配:
结果:
场景2:远景
素材:
结果:
虽然场景2的拼接效果也不理想但是可以明显的看出是远高于近景拍摄的素材拼接效果的。
场景3:室内
素材:
结果:
问题总结
全景拼接的一个关键点就是sift特征点的匹配,只有寻找到正确且数量较多的特征点,在后续的拼接中才能更好的完成,拼接的更自然。而原始图片的像素值很大程度上决定了特征点的寻找,像素值太低,将导致寻找到的特征点过少,不利于后续的拼接效果。而像素值过高会导致代码的运行时间过长,加重算法的负荷。建议的像素点是在800×800以内。
计算机视觉ch3 图像到图像映射——全景拼接相关推荐
- 计算机视觉:图像到图像的映射
目录 一.单应性变化 1.1 直接线性变换算法 1.2 放射变换 二.图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.3 图像配准 三.创建全景图 3.1 RANSAC 3.2 稳健的单应性 ...
- Python计算机视觉——图像到图像的映射
Python计算机视觉--图像到图像的映射 文章目录 Python计算机视觉--图像到图像的映射 写在前面 1 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2 图像扭曲 2.1 图像中的图 ...
- python计算机视觉学习第三章——图像到图像的映射
目录 引言 一. 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 二. 图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.2 图像配准 三.创建全景图 3.1 RANSAC(随机一致性 ...
- Python计算机视觉编程学习笔记 三 图像到图像的映射
图像到图像的映射 (一)单应性变换 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSAC 3.2 拼接图像 (一)单应性变换 单应性变换是将 ...
- Python计算机视觉编程第三章——图像到图像的映射
Python计算机视觉编程 图像到图像的映射 (一)单应性变换 1.1 直接线性变换算法 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSA ...
- 三、【python计算机视觉编程】图像到图像的映射
图像到图像的映射 (一)单应性变换 (1)直接线性变换算法(DLT) (2)仿射变换(affine) (二)图像扭曲 (1)图像中的图像 (2)分段仿射扭曲 (3)图像配准 (三)创建全景图 (1)R ...
- 计算机视觉编程——图像到图像的映射
文章目录 图像到图像的映射 1 单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2 图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.3 图像配准 3 创建全景图 3.1 RANSAC ...
- Python计算机视觉编程 第三章 图像到图像的映射
第三章 图像到图像的映射 3.1 单应性变换 3.1.1直接线性变换算法 3.1.2仿射变换 3.2图像扭曲 3.2.1图像中的图像 3.2.2图像配准 3.3创建全景图 3.3.1RANSAC 3. ...
- python计算机视觉编程——基本的图像操作和处理
python计算机视觉编程--第一章(基本的图像操作和处理) 第1章 基本的图像操作和处理 1.1 PIL:Python图像处理类库 1.1.1 转换图像格式--save()函数 1.1.2 创建缩略 ...
- 图像到图像的映射(实验三)
目录 1.单应性变换 1.1 直接线性变换算法 1.2 仿射变换 2.图像扭曲 2.1 图像中的图像 2.2 分段仿射扭曲 2.3 图像配准 3.创建全景图 3.1 RANSAC 3.2 稳健的单应性 ...
最新文章
- 微型计算机c560,2010广东省计算机等级考试试题 二级C试题最新考试试题库
- 实例7:python
- C语言之变量存储类型与链接属性
- python里textfield_Django:为什么我的CharField没有得到类vTextField?
- coreboot学习9:ramstage阶段之设备初始化流程
- vnc 树莓派 链接_树莓派 VNC Viewer 远程桌面配置教程
- Unix domain socket IPC
- 深入理解HTTPS工作原理
- hibernate注释映射_Hibernate一对一映射示例注释
- 八爪鱼网络爬虫工具——学习笔记整理
- 编程语言Python为什么这么火?
- 手把手教你如何通过OAuth2.0新浪开放平台认证新浪用户-java
- 教你看懂Code128条形码
- 拷机测试需要多久_【温馨提示】亚马逊卖家警惕!没有UL测试报告产品将会被下架...
- 宏转录组测序数据菌株层面的分析软件总结
- IPHONE苹果手机短信短消息备份导出,格式分析,数据库sqlite
- 有能力的人从不抱怨大环境!
- java毕业设计——基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(毕业论文+程序源码)——网络新闻分析系统
- 电脑录音软件哪个好用?试试Renee Audio Recorder Pro(都叫兽录音机软件)吧
- 把Firfox的缓冲设置到内存盘
热门文章
- 科技圈2020十大并购:罗永浩直播公司卖身翻车 TikTok生死成谜
- 【http方式操作es】springboot整合es,轻量级不需要引入任何依赖
- 看看哪些是你最近能用到的英语
- Shopify独立站+TikTok引流运营数据分析
- Navicat for SQL Server 安装的步骤是这样的
- 碰撞检测GJK算法论文解析一
- 山海经2服务器维护时间,37山海经传说1月18日部分区服维护更新公告
- 使用虚拟机中安装deepin系统
- MySQL 查询数据库和表在使用的引擎和编码并修改使用引擎和编码
- 简单空心花边边框_简单空心花边边框_美美哒,各种手帐边框、手账简笔画,拿走不谢!...