图像全景拼接-图像全景拼接(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

相关文章

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

Golang中拼接字符串的6种方式性能对比

《Golang中拼接字符串的6种方式性能对比》golang的string类型是不可修改的,对于拼接字符串来说,本质上还是创建一个新的对象将数据放进去,主要有6种拼接方式,下面小编就来为大家详细讲讲吧... 目录拼接方式介绍性能对比测试代码测试结果源码分析golang的string类型是不可修改的,对于拼接字

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

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

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 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.