《计算机视觉》——图像拼接
图像拼接
- 图像拼接是将多幅有重叠区域的图像合并成一幅全景或更大视角图像的技术,以下为你详细介绍:
- 原理:图像拼接的核心原理是基于图像之间的特征匹配。首先,从每幅图像中提取独特的特征点,如角点、边缘点等,这些特征点具有在不同图像中能被准确识别的特点。然后,通过计算特征点之间的相似度,找到不同图像中相匹配的特征点对。一旦确定了匹配点,就可以根据这些点来计算图像之间的变换关系,如平移、旋转、缩放等,从而将图像对齐到同一坐标系中。最后,将对齐后的图像进行融合,消除拼接缝隙,生成一幅无缝的拼接图像。
主要步骤
- 特征提取:常用的特征提取算法有 SIFT(尺度不变特征变换)、SURF(加速稳健特征)和 ORB(加速的具有旋转不变性的 FAST 特征点和 BRIEF 描述子)等。这些算法可以在不同光照、尺度和旋转条件下,稳定地提取图像中的特征点。
- 特征匹配:通过计算特征点的描述子之间的距离(如欧氏距离),找到不同图像中相似的特征点对。为了提高匹配的准确性,通常会使用一些匹配策略,如最近邻匹配、比率测试等。
- 图像变换:根据匹配点计算出图像之间的变换矩阵,然后将其中一幅图像进行变换,使其与另一幅图像对齐。常见的变换模型有仿射变换、透视变换等。
- 图像融合:将对齐后的图像进行融合,以消除拼接缝隙。常用的融合方法有加权平均融合、多分辨率融合等。
应用领域
- 全景摄影:通过拍摄多张不同角度的照片,然后拼接成一幅全景图像,为用户提供更广阔的视野。
- 医学图像:在医学领域,将多幅显微镜图像或 X 光图像拼接成一幅完整的图像,以便医生更全面地观察病变区域。
- 计算机视觉:在机器人导航、自动驾驶等领域,图像拼接技术可以帮助系统获取更广阔的环境信息,提高系统的感知能力。
- 文物保护与修复:对破损的文物图像进行拼接和修复,恢复文物的原貌。
实例
对两张图片进行拼接:图片1
图片2

代码
- 导入模块
# 导入OpenCV库,用于计算机视觉任务,如图像读取、处理和显示等
import cv2
# 导入NumPy库,用于处理多维数组和矩阵运算
import numpy as np
# 导入sys模块,用于与Python解释器进行交互,这里主要用于退出程序
import sys
- 定义显示图像
# 定义一个函数用于显示图像
def cv_show(name, img):# 在名为name的窗口中显示图像imgcv2.imshow(name, img)# 等待用户按键,按任意键后关闭窗口cv2.waitKey(0)
- 定义检测关键点
# 定义一个函数用于检测图像中的关键点并提取特征描述符
def detectAndDescribe(image):# 将输入的彩色图像转换为灰度图像,因为SIFT算法通常在灰度图像上进行处理gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 创建一个SIFT(尺度不变特征变换)特征检测器和描述符对象descriptor = cv2.SIFT_create()# 使用SIFT对象检测图像中的关键点并计算其特征描述符# kps是关键点对象列表,des是对应的特征描述符矩阵(kps, des) = descriptor.detectAndCompute(gray, None)# 将关键点的坐标从关键点对象中提取出来,并转换为NumPy的浮点型数组kps_float = np.float32([kp.pt for kp in kps])# 返回关键点对象列表、关键点坐标数组和特征描述符矩阵return (kps, kps_float, des)
- 读取图像显示图像
# 读取第一张图像,图像文件名为'1.jpg'
imageA = cv2.imread('1.jpg')
# 读取第二张图像,图像文件名为'2.jpg'
imageB = cv2.imread('2.jpg')
# 显示第一张图像,窗口名为'imageA'
cv_show('imageA', imageA)
# 显示第二张图像,窗口名为'imageB'
cv_show('imageB', imageB)


- 进行关键点检测和特征描述符提取
# 对第一张图像进行关键点检测和特征描述符提取
(kpsA, kps_floatA, desA) = detectAndDescribe(imageA)
# 对第二张图像进行关键点检测和特征描述符提取
(kpsB, kps_floatB, desB) = detectAndDescribe(imageB)
- 创建暴力匹配器对象
# 创建一个暴力匹配器对象,用于匹配特征描述符
matcher = cv2.BFMatcher()
- 特征匹配
# 使用K近邻匹配算法对第二张图像和第一张图像的特征描述符进行匹配
# 这里的2表示每个查询描述符返回两个最近邻的匹配结果
rawMatches = matcher.knnMatch(desB, desA, 2)
# 初始化一个空列表,用于存储满足条件的匹配对
good = []
# 初始化一个空列表,用于存储匹配点的索引对
matches = []
# 遍历所有的匹配结果
for m in rawMatches:# 检查每个匹配结果是否包含两个最近邻,并且第一个匹配的距离小于第二个匹配距离的0.65倍if len(m) == 2 and m[0].distance < 0.65 * m[1].distance:# 如果满足条件,将该匹配对添加到good列表中good.append(m)# 将匹配点的索引对添加到matches列表中matches.append((m[0].queryIdx, m[0].trainIdx))
- 绘制匹配关键点
# 在两张图像上绘制满足条件的匹配关键点
# flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示绘制带有关键点信息的匹配线
vis = cv2.drawMatchesKnn(imageB, kpsB, imageA, kpsA, good, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 显示绘制了匹配关键点的图像,窗口名为'Keypoint Matches'
cv_show('Keypoint Matches', vis)

- 透视变换
# 检查匹配点的数量是否大于4
if len(matches) > 4:# 提取第二张图像中匹配点的坐标ptsB = np.float32([kps_floatB[i] for (i, _) in matches])# 提取第一张图像中匹配点的坐标ptsA = np.float32([kps_floatA[i] for (_, i) in matches])# 使用RANSAC算法计算从第二张图像到第一张图像的单应性矩阵H# 10是RANSAC算法的阈值(H, mask) = cv2.findHomography(ptsB, ptsA, cv2.RANSAC, 10)
else:# 如果匹配点数量小于等于4,打印提示信息print('图片未找到四个以上的匹配点')# 退出程序sys.exit()# 使用计算得到的单应性矩阵H对第二张图像进行透视变换
# 变换后的图像宽度为两张图像宽度之和,高度为第二张图像的高度
result = cv2.warpPerspective(imageB, H, (imageB.shape[1] + imageA.shape[1], imageB.shape[0]))
# 显示透视变换后的第二张图像,窗口名为'resultB'
cv_show('resultB', result)

- 进行拼接
# 将第一张图像复制到透视变换后的图像的左上角
result[0:imageA.shape[0], 0:imageA.shape[1]] = imageA
# 显示拼接后的最终图像,窗口名为'result'
cv_show('result', result)

相关文章:
《计算机视觉》——图像拼接
图像拼接 图像拼接是将多幅有重叠区域的图像合并成一幅全景或更大视角图像的技术,以下为你详细介绍: 原理:图像拼接的核心原理是基于图像之间的特征匹配。首先,从每幅图像中提取独特的特征点,如角点、边缘点等&#x…...
Go入门之接口
type Usber interface {start()stop() } type Phone struct {Name string }func (p Phone) start() {fmt.Println(p.Name, "启动") } func (p Phone) stop() {fmt.Println(p.Name, "关机") } func main() {p : Phone{Name: "华为手机",}var p1 U…...
element实现需同时满足多行合并和展开的表格
element实现需同时满足多行合并和展开的表格 需求描述: 以下面这张图为例,此表格的“一级表格”这一行可能存在多行数据,这种情况下需要将“一级指标”,“一级指标扣分xxx”,“一级指标关联xxx”这三列数据的行展示根据后面数据(…...
气象干旱触发水文(农业)干旱的概率及其触发阈值的动态变化-贝叶斯copula模型
前言 在干旱研究中,一个关键的科学问题是:在某一地区发生不同等级的气象干旱时,气象干旱会以何种概率引发不同等级的水文干旱、农业干旱和地下水干旱?换句话说,气象干旱的不同程度会分别引发其他类型干旱的哪种等级&a…...
系统学习算法:专题十二 记忆化搜索
什么是记忆化搜索,我们先用一道经典例题来引入,斐波那契数 题目一: 相信一开始学编程语言的时候,就一定碰到过这道题,在学循环的时候,我们就用for循环来解决,然后学到了递归,我们又…...
c++入门-------命名空间、缺省参数、函数重载
C系列 文章目录 C系列前言一、命名空间二、缺省参数2.1、缺省参数概念2.2、 缺省参数分类2.2.1、全缺省参数2.2.2、半缺省参数 2.3、缺省参数的特点 三、函数重载3.1、函数重载概念3.2、构成函数重载的条件3.2.1、参数类型不同3.2.2、参数个数不同3.2.3、参数类型顺序不同 前言…...
豆包、扣子等产品如何与CSDN合作?
要实现CSDN开发者社区与豆包、扣子等产品的深度合作,构建创作者Agent生态体系,可通过以下结构化方案实现技术、生态与商业价值的闭环(含具体实施路径与数据指标): 一、战略合作框架搭建 开放平台互通 建立三方API网关&…...
51单片机测试题AI作答测试(DeepSeek Kimi)
单片机测试题 DeepSeek Kimi 单项选择题 (10道) 6题8题判断有误 6题判断有误 智谱清言6题靠谱,但仔细斟酌,题目出的貌似有问题,详见 下方。 填空题 (9道) 脉宽调制(Pulse …...
Java实际上只有值传递
在 Java 中,实际上只有值传递,这可以从基本数据类型和引用数据类型两个方面来看。 基本概念 值传递:指在方法调用时,将实际参数的值复制一份传递给形式参数,在方法内部对形式参数的修改不会影响到实际参数。引用传递…...
解析HTML时需要注意什么?
在使用PHP爬虫解析HTML内容时,需要注意以下几个关键点,以确保数据提取的准确性和程序的稳定性。以下是一些重要的注意事项和最佳实践: 1. 选择合适的解析工具 PHP提供了多种工具来解析HTML,但选择合适的工具可以简化开发过程并提…...
去耦电容的作用详解
在霍尔元件的实际应用过程中,经常会用到去耦电容。去耦电容是电路中装设在元件的电源端的电容,其作用详解如下: 一、基本概念 去耦电容,也称退耦电容,是把输出信号的干扰作为滤除对象。它通常安装在集成电路…...
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二)
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…...
深入剖析:基于红黑树实现自定义 map 和 set 容器
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 在 C 标准模板库(STL)的大家庭里,map和set可是超级重要的关联容器成员呢😎&#x…...
20-R 绘图 - 饼图
R 绘图 - 饼图 R 语言提供来大量的库来实现绘图功能。 饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表,用于描述量、频率或百分比之间的相对关系。 R 语言使用 pie() 函数来实现饼图,语法格式如下: pie(x, l…...
第438场周赛:判断操作后字符串中的数字是否相等、提取至多 K 个元素的最大总和、判断操作后字符串中的数字是否相等 Ⅱ、正方形上的点之间的最大距离
Q1、判断操作后字符串中的数字是否相等 1、题目描述 给你一个由数字组成的字符串 s 。重复执行以下操作,直到字符串恰好包含 两个 数字: 从第一个数字开始,对于 s 中的每一对连续数字,计算这两个数字的和 模 10。用计算得到的新…...
STM32F4 adc扫描模式采集实验
做adc采集的时候用扫描模式发现读数据时只能读到一个通道的数据,想显示其他几个通道的数据只能进行多次单个扫描,违背了扫描模式的本意,故用ai做了一个将扫描数据用dma储存在内存的adc三通道采集实验,若有巨佬发现有错望告知。 代…...
软考教材重点内容 信息安全工程师 第17章 网络安全应急响应技术原理与应用
17.1 网络安全应急响应概述 网络安全应急响应是针对潜在发生的网络安全事件而采取的网络安全措施。 17.1.1 网络安全应急响应概念 网络安全应急响应是指为应对网络安全事件,相关人员或组织机构对网络安全事件进行监测、预警、分析、响应和恢复等工作。 17.2.3 网络安…...
点击修改按钮图片显示有问题
问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …...
Node.js技术原理分析系列——Node.js的perf_hooks模块作用和用法
Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8 引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应用程序、网络应用、命令行工具等。…...
大模型在术后认知功能障碍预测及临床方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 研究创新点 二、术后认知功能障碍概述 2.1 定义与表现 2.2 危害与影响 2.3 发病机制与相关因素 三、大模型技术原理与应用现状 3.1 大模型技术原理 3.2 大模型在医疗领域的应用 四、基于大模型的术后认知…...
用DeepSeek来帮助学习three.js加载3D太极模形
画一个平面的太极图是很容易,要实现3D的应该会很难 一、参考3D模形效果 看某网页看到一个效果,像一个3D太极球,觉得挺有趣,挺解压的,想进一步去了解下这是如何实现 效果: 链接地址: http://www.…...
【JavaEE进阶】Spring Boot配置文件
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗 如有错误,欢迎指出~ 目录 SpringBoot配置⽂件 举例: 通过配置文件修改端口号 配置⽂件的格式 properties基本语法 读取配置⽂件 properties配置文件的缺点 yml配置⽂件 yml基本语法 yml和proper…...
学习通用多层次市场非理性因素以提升股票收益预测
“Learning Universal Multi-level Market Irrationality Factors to Improve Stock Return Forecasting” 论文地址:https://arxiv.org/pdf/2502.04737 Github地址:https://github.com/lIcIIl/UMI 摘要 深度学习技术与量化交易相结合,在股…...
【Godot4.3】基于绘图函数的矢量蒙版效果与UV换算
概述 在设计圆角容器时突发奇想: 将圆角矩形的每个顶点坐标除以对应圆角矩形所在Rect2的size,就得到了顶点对应的UV坐标。然后使用draw_colored_polygon,便可以做到用图片填充圆角矩形的效果。而且这种计算的效果就是图片随着其填充的图像缩…...
记一些工具(持续更新)
wireshark——网络抓包工具 mitmproxy ——利用中间人攻击进行https抓包的工具(需配合安装由此代理自己签发的根证书到客户机系统) Cloudflare—— 一个网站中间层,通过基于反向代理的内容分发网络(CDN),Cloudflare提供包括CDN、优化工具、安全、分析以…...
DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…...
PCL 点云添加高斯噪声
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在点云模型中将所有的点沿其法向量方向随机偏移一定距离,以此来得到点云实体的噪声点,偏移的幅度与点云尺度有关,偏移距离服从高斯分布,以此来获得高斯分布的噪声数据。 二、实现代码 // 标准文件 #include &l…...
通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形
论文标题 英文标题:Improving TSN Traffic Shaping with Constant Bandwidth Server Scheduling 中文标题:通过恒定带宽服务器调度改进时间敏感网络(TSN)流量整形 作者信息 作者:Benjamin van Seggelen 指导教师&am…...
软件测试高频面试题
以下是一些软件测试高频面试题: 基础概念类 HTTP和HTTPS的区别:HTTPS使用SSL/TLS协议对传输数据加密,HTTP没有加密;HTTPS可确保数据完整性,防止传输中被篡改,HTTP不保证;HTTP默认用80端口&…...
英语学习DAY5
内心旁白 关于我为什么从2月5号开的这个篇章现在才第五天这件事? 咳咳咳,容许我狡辩一下,我是有事去忙了,我真的很想每日学习英语(信我兄弟们)! 虽然英语学习对我来说真的很难,你…...
