图像全景拼接-图像全景拼接(RANSCA)

2024-08-27 17:32
文章标签 图像 拼接 全景 ransca

本文主要是介绍图像全景拼接-图像全景拼接(RANSCA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. sift.detectAndComputer(gray, None)  # 计算出图像的关键点和sift特征向量

参数说明:gray表示输入的图片

2.cv2.findHomography(kpA, kpB, cv2.RANSAC, reproThresh) # 计算出单应性矩阵

参数说明:kpA表示图像A关键点的坐标, kpB图像B关键点的坐标, 使用随机抽样一致性算法来进行迭代,reproThresh表示每次抽取样本的个数

3.cv2.warpPespective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))  # 获得根据单应性矩阵变化后的图像

参数说明:image表示输入图像,H表示单应性的矩阵,(imageA.shape[1] + imageB.shape[1], imageA.shape[0])表示矩阵变化后的维度

4. cv2.line(imageA, kpsA, imageB, kpsB, (0,0,255), 2)   进行画出直线的操作
参数说明:imageA和imageB表示输入图片, kpsA和kpsB表示关键点的坐标(x, y) ,(0, 0, 255)表示颜色, 2表示直线的宽度 

 

RANSAC算法(随机抽样一致性算法), 对于左边的图,可以看到使用最小二乘法尽可能多的满足点可以分布在拟合曲线周围,减小均分根误差,因此拟合的曲线在一定程度上容易发生偏离,而RANSAC却不会出现这种情况

RANSCA原理, 因为拟合一条直线只需要两个点,因此我们每次随机选取两个点,做出直线,划定一个距离,判断落在直线周围距离范围点的个数,不断的迭代,直到找出拟合的直线,使得点落在上面最多的拟合曲线

图像拼接的关键是在于对图像进行变化,变化后的点与需要拼接的图片中的sift点,越接近,即欧式距离越短,对图像拼接的过程中,至少需要有4对特征点,求取变化矩阵Hi

我们使用RANSAC不断去取随机从两个图像中取4对的sift特征点,计算出H,定义损失值,即x’,与x的距离,即y‘与y的距离之和是否是最小值,不断迭代,找出最佳的H

 

上述就是计算出来了H值,也就是变化矩阵

代码思路:

第一步:对图像进行灰度化,使用sift.detectAndCompute(image, None) 进行ksp关键点,dpSIFT特征向量,将kps进行向量化操作,即kps.pt 

第二步:构建BMFmatch匹配器,获得符合条件的匹配值,matches获得的是ksp关键点的匹配值得索引,使用索引获得符合条件的kspA和kspB

第三步:使用cv2.findHomography(kpA, kpB, cv2.RANSAC,reproThresh) 随机抽取4个点,求得最合适的H变化矩阵

第四步:使用获得的变化矩阵H, cv.warpPerspective 对imageA求取变化后的图像

第五步:将imageB加入到变化后的图像获得最终图像

第六步:如果需要进行展示,构造新的图像,尺寸为imageA.shape[0], imageB.shape[1] +imageA.shape[1], 使用matches的索引,使用cv2.line将符合条件的点进行连接

第七步:返回最终的结果,进行画图展示

import cv2
import numpy as np
import matplotlib.pyplot as pltclass Stitcher:def stitch(self, imgs, ratio=0.75, reproThresh=4, showMathes = False):(imageB, imageA) = imgs# 第一步:计算kpsA和dpsA(kpsA, dpsA) = self.detectandcompute(imageA)(kpsB, dpsB) = self.detectandcompute(imageB)# 获得变化的矩阵HM = self.matchKeypoint(kpsA, dpsA, kpsB, dpsB, ratio, reproThresh)if M is None:return None(matches, H, status) = M# 第四步:使用cv2.warpPerspective获得经过H变化后的图像result = cv2.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageB.shape[0]))# 第五步:将图像B填充到进过H变化后的图像,获得最终的图像result[0:imageB.shape[0], 0:imageB.shape[1]] = imageBif showMathes:# 第六步:对图像的关键点进行连接via = self.showMatches(imageA, imageB, kpsA, kpsB, matches, status)return (via, result)return result# 进行画图操作def showMatches(self, imageA, imageB, kpsA, kpsB, matches, status):# 将两个图像进行拼接# 根据图像的大小,构造全零矩阵via = np.zeros((max(imageB.shape[0], imageA.shape[0]), imageA.shape[1] + imageB.shape[1], 3), np.uint8)# 将图像A和图像B放到全部都是零的图像中via[0:imageA.shape[0], 0:imageA.shape[1]] = imageAvia[0:imageB.shape[0], imageA.shape[1]:] = imageB# 根据matches中的索引,构造出点的位置信息for (trainIdx, queryIdx), s in zip(matches, status):if s==1:ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1]))ptB = (int(kpsB[trainIdx][0] + imageA.shape[1]), int(kpsB[trainIdx][1]))# 使用cv2.line进行画图操作cv2.line(via, ptA, ptB, (0, 255, 0), 1)return viadef matchKeypoint(self, kpsA, dpsA, kpsB, dpsB, ratio, reproThresh):# 第二步:实例化BFM匹配, 找出符合添加的关键点的索引bf = cv2.BFMatcher()matcher = bf.knnMatch(dpsA, dpsB, 2)matches = []for match in matcher:if len(match) == 2 and match[0].distance < match[1].distance * ratio:# 加入match[0]的索引matches.append((match[0].trainIdx, match[0].queryIdx))#第三步:使用cv2.findHomography找出符合添加的H矩阵if len(matches) > 4:# 根据索引找出符合条件的位置kpsA = np.float32([kpsA[i] for (_, i) in matches])kpsB = np.float32([kpsB[i] for (i, _) in matches])(H, status) = cv2.findHomography(kpsA, kpsB, cv2.RANSAC, reproThresh)return (matches, H, status)return Nonedef cv_show(self, img, name):cv2.imshow(name, img)def detectandcompute(self, image):# 进行灰度值转化gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#实例化sift函数sift = cv2.xfeatures2d.SIFT_create()# 获得kps关键点和dps特征向量siftkps, dps = sift.detectAndCompute(gray, None)# 获得特征点的位置信息, 并转换数据类型kps = np.float32([kp.pt for kp in kps])return (kps, dps)

这篇关于图像全景拼接-图像全景拼接(RANSCA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112310

相关文章

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

架构全景视图

文章目录 一、战略规划二、业务架构Business Architecture2.1业务架构定义2.2 业务架构组成2.3 TOGAF2.3.1 Archimate建模(重要) 三、数据架构Data Architecture3.1 数据架构定义3.2 数据架构组成 四、应用架构Application Architecture4.1 应用架构定义4.2 应用架构组成 五、技术架构Technol

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

js操作Dom节点拼接表单及ajax提交表单

有时候我们不希望html(jsp、vm)中有创建太多的标签(dom节点),所以这些任务都由js来做,下面提供套完整的表单提交流程,只需要在html中添加两个div其余的都由js来做吧。下面原生代码只需略微修改就能达到你想要的效果。 1、需要创建表单的点击事件 <a href="javascript:void(0);"onclick="changeSettleMoney('$!doctor.do

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait,能根据用户提供的文本描述,快速生成既忠实于原图又能灵活调整的个性化人像,用户甚至可以通过简单的句子来描述多个不同的人物,而不需要一一指定每个人的位置。这种设计大大简化了用户的操作,提升了个性化生成的效率和效果。 UniPortrait以统一的方式定制单 ID 和多 ID 图像,提供高保真身份保存、广泛的面部可编辑性、自由格式的文本描述,并且无需预先确定的布局。