《计算机视觉》——图像拼接
图像拼接
- 图像拼接是将多幅有重叠区域的图像合并成一幅全景或更大视角图像的技术,以下为你详细介绍:
- 原理:图像拼接的核心原理是基于图像之间的特征匹配。首先,从每幅图像中提取独特的特征点,如角点、边缘点等,这些特征点具有在不同图像中能被准确识别的特点。然后,通过计算特征点之间的相似度,找到不同图像中相匹配的特征点对。一旦确定了匹配点,就可以根据这些点来计算图像之间的变换关系,如平移、旋转、缩放等,从而将图像对齐到同一坐标系中。最后,将对齐后的图像进行融合,消除拼接缝隙,生成一幅无缝的拼接图像。
主要步骤
- 特征提取:常用的特征提取算法有 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…...
zookeeper从入门到精通
一、入门基础 1.1 什么是 ZooKeeper ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,后成为 Apache 的顶级项目。它为分布式应用提供了高效、可靠的协调服务,例如统一命名服务、配置管理、分布式锁、集群管理等。ZooKeeper 的数据模型类…...
2.2 添加注释
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 注释是为了方便理解代码含义而添加的简短的解释性说明。在编译时,编辑器不会将注释加入最终生成的文件中,不…...
具有快慢思考的语言调节机器人操作
24年1月来自华东师范大学、美的集团和上海大学的论文“Language-Conditioned Robotic Manipulation with Fast and Slow Thinking”。 语言调节机器人操作,旨在将自然语言指令转化为可执行动作,从简单的“拾取和放置”到需要意图识别和视觉推理的任务。…...
美颜相机1.0
项目开发步骤 1 界面开发 美颜相机界面构成: 标题 尺寸 关闭方式 位置 可视化 2 创建主函数调用界面方法 3 添加两个面板 一个是按钮面板一个是图片面板 用JPanel 4 添加按钮到按钮面吧【注意:此时要用初始化按钮面板的方法initBtnPanel 并且将按钮添…...
Css3重点知识讲解
选择器 优先级: id 选择器 > 类选择器 > 标签选择器 类选择器: .myClass {color: blue; }id 选择器(全局唯一): #myId {color: green; }标签选择器: p {color: red; }层次选择器: /…...
[Web 安全] Web 安全攻防 - 学习手册
关联专栏:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Web 安全攻防 —— 信息收集篇 Web 信息收集 — 手动收集域名信息 Web 信息收集 — 手动收集 IP 信息 Web 信息收集 — 端口服务信息收集 Web 信息收集 — 自动化信息收集 — ShuiZe 水泽 We…...
nextjs的记录一些小东西
1. 格式化时间:使用date-fns库 npm install date-fns 在组建中创建date.js import { parseISO, format } from date-fnsexport default function Date({ dateString }) {const date parseISO(dateString)return <time dateTime{dateString}>{format(date,…...
故障诊断 | PID搜索算法优化CatBoost故障诊断(MatlabPython)
目录 效果一览文章概述故障诊断 | PID搜索算法优化CatBoost故障诊断(Matlab&Python)PID搜索算法优化CatBoost故障诊断PID搜索算法优化CatBoost故障诊断一、引言1.1、研究背景与意义1.2、研究现状1.3、研究目的与内容二、CatBoost算法概述2.1、CatBoost算法原理2.2、CatBo…...
探索关键领域的AI工具:机器学习、深度学习、计算机视觉与自然语言处理
引言 在人工智能(AI)迅猛发展的今天,机器学习(ML)、深度学习(DL)、计算机视觉(CV)和自然语言处理(NLP)已经成为解决复杂问题的关键技术。无论是自动驾驶车辆的视觉识别,还是智能助手的对话理解,这些技术都在改变着世界。本文将介绍在各个领域…...
使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流
在现代工作与学习中,可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本,结合 Typora 快速生成流程图和甘特图,并通过 Markdown 格式生成思维导图,最终…...
11、集合框架
一、简介 Java集合框架位于java.util包中 Collection是Set和List的父类,Collections是工具类,提供了对集合进行排序、遍历等多种算法的实现。 ArrayList: 有序(放进去顺序和拿出来顺序一致),可重复 HashSet: 无序(放进去顺序和拿出来顺序不…...
从入门到精通Rust:资源库整理
今天给大家分享一些优质的Rust语言学习资源,适合不同水平的学习者。前三个官方资源是我Rust语言的启蒙老师,非常平易近人。 官方资源 The Rust Programming Language (The Book) 链接: https://doc.rust-lang.org/book/ 简介: 官方权威指南,…...
Spring Boot 项目启动命令大全:参数详解与高阶用法
Spring Boot 项目启动命令大全:参数详解与高阶用法 一、基础启动命令 默认启动命令 java -jar xxx.jar适用场景:开发环境快速启动,使用默认配置(端口 8080,内存由 JVM 自动分配)。 指定 JVM 内存参数 java…...
c++day4
作业 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std; class S{ private:int a;int b; public:S(i…...
应对LLM应用中的AI幻觉,如何通过Token对数概率预测LLM的可靠性
应对LLM应用中的AI幻觉 如何通过Token对数概率预测LLM的可靠性 内容: 1. 相关机器学习(ML)概念回顾(精准度/召回率,LLM直觉) 2. 使用序列对数概率度量作为LLM信心 3. 通过案例研究结果过滤低质量LLM输出…...
Openwrt路由器操作系统
一、什么是 OpenWrt? OpenWrt 是一个基于 Linux 的开源操作系统,主要设计用于嵌入式设备,尤其是路由器。与其说是传统的路由器固件,不如说它是一个路由器操作系统。 传统的路由器固件通常由路由器厂商开发,功能相对固…...
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“流浪动物救助系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统…...
Ansible 学习笔记
这里写自定义目录标题 基本架构文件结构安装查看版本 Ansible 配置相关文件主机清单写法 基本架构 Ansible 是基于Python实现的,默认使用22端口, 文件结构 安装 查看用什么语言写的用一下命令 查看版本 Ansible 配置相关文件 主机清单写法...
(六)趣学设计模式 之 代理模式!
目录 一、啥是代理模式?二、为什么要用代理模式?三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 🌟我的其他文章也讲解的比较有趣😁&a…...
【CSS】HTML元素布局基础总结
HTML默认布局和元素显示 CSS 元素显示 { HTML 默认布局: 流式布局 { 从左到右,从上到下 随页面宽度变化动态排列元素 文档流:整个 H T M L 文档的流式布局 HTML 元素分为 { 块级元素 :默认占满一行 行内元素 :在行内最…...
【JavaScript】什么是JavaScript?以及常见的概念
作为 JavaScript 初学者,想要更好地理解这门语言,需要从核心概念、实践练习和项目实战三个方面入手。下面是详细的学习路线和方法,帮助你系统性地掌握 JavaScript。 一、理解 JavaScript 的核心概念 JavaScript 是一门动态、弱类型的编程语言…...
为什么要将PDF转换为CSV?CSV是Excel吗?
在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…...
P1038 [NOIP 2003 提高组] 神经网络
题目描述 在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经元,而且两个神经元之间至多有一条边相连,下图是一个神经元的例子: 神经元(编号为 i) 图中,X1∼X3 是信息…...
TypeScript 类型断言的适用场景及代码示例
类型断言的适用场景及代码示例 适用场景 类型断言就像是你很确定某个东西是什么,然后直接告诉 TypeScript 编译器“相信我,它就是这个类型”。以下是几种常见的适用场景: 从 any 类型恢复具体类型:当你使用 any 类型时…...
Docker 容器
Docker 是一种开源的容器化平台,可以让开发人员将应用程序及其依赖项打包到一个可移植的容器中,然后部署到任何支持 Docker 的环境中。Docker 的基本概念包括以下几点: 1. **容器(Container)**:容器是一个独立、轻量级的运行环境…...
Spark(3)vi的基本使用
一.打开与创建文件 二.三种模式 三. 光标操作 四.复制粘贴 一.打开与创建文件 它是linux的内置命令,所以还是以命令的方式来运行。 命令的格式是:Vi /路径/文件名。要注意如下两种情况: 1.如果这个文件不存在,此时就是新建文…...
element-ui的组件使用
1. 安装 Element UI(在文件夹最上面输入cmd进入dos窗口,然后输入安装指令 npm install element-ui --save) 2.在main.js文件全局引入(main.js文件负责 全局注册 ),在该文件注册的所有组件在其他文件都能直接调用,一般…...
Starlink卫星动力学系统仿真建模第九讲-滑模(SMC)控制算法原理简介及卫星控制应用
滑模控制(Sliding Mode Control)算法详解 一、基本原理 滑模控制(Sliding Mode Control, SMC)是一种变结构控制方法,通过设计一个滑模面(Sliding Surface),迫使系统状态在有限时间内…...
《深度剖析Linux 系统 Shell 核心用法与原理_666》
1. 管道符的用法 查找当前目录下所有txt文件并统计行数 # 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l 在/etc目录下查找包含"network"的文件并统计数量 # 使用find命令查找文件,并通过grep查找包含特定字符串的文件…...
51单片机学习之旅——定时器
打开软件 1与其它等于其它,0与其它等于0 1或其它等于1,0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作,高四位保持,低四位清零,高四位定时器1,低四位定时器0 TMODTMOD|0x01;//0x010000 0…...
超详细介绍map(multimap)的使用
map类的介绍 map的声明如下,Key是map底层关键字的类型,T是map底层value的类型。set默认要求Key支持小于比较,如果不支持或者需要的情况下我们可以自行传入仿函数,map底层存储数据的内存是从空间申请来的。一般情况下,我…...
原生稀疏注意力NSA 替换transformer 注意力进行文本生成训练
DeepSeek-R1这篇文章,聚焦范围更加小,R1的重点在于提出了一个文本生成的训练策略和蒸馏策略,这篇文章则是提出了一个注意力机制NSA,主要解决的是长序列做注意力时带来的效率问题。通篇文章看下来,它的实际意义可能比较…...
读书笔记:《百年孤独》
《百年孤独》加西亚.马尔克斯 著 范晔 译 读出了阅读障碍。 记不得书中的人,记不得书中的事,更不知何为孤独,只记得马孔多,这个陌生的地方,还有那个猪尾巴婴儿。 百年:故事跨越了百年 孤独&#…...
TVS管学习记录
文章目录 前言一、TVS是什么?二、TVS关键参数1.反向截至电压**实际意义** 2.钳位电压**定义与作用****选择依据** **4. 实际应用示例****场景:通信端口的ESD保护** 3.反向截至电压和钳位电压的关联和区别**. 小结** 三、实际应用电路举例总结 前言 TVS管…...
网络安全系统概述 网络安全系统分为几级
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 5级 网络信息系统安全等级保护分为五级,一级防护水平最低,最高等保为五级。分别是用户自主保护级、系统审计保护级、安全标记保护级、结构…...
基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知
写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 😃,生活加油 我站在人潮中央,思考这日日重复的生活。我突然想,…...
Apache Flink架构深度解析:任务调度、算子数据同步与TaskSlot资源管理机制
Apache Flink是一个分布式流处理框架,其核心架构设计围绕有界与无界数据流的统一处理能力展开。以下从任务分配、算子数据同步、TaskManager与JobManager的TaskSlot机制三个维度展开详细分析: 一、任务分配机制 Flink的任务分配基于并行度(P…...
Linux 常见命令全解析
一、文件操作命令 1. ls ls是列出目录内容的命令。简单输入ls,会展示当前目录下的文件和目录列表。想要获取更详细的信息,比如文件权限、所有者、大小、修改时间等,使用ls -l。若要显示所有文件,包括以点(.ÿ…...
k8s集群部署
集群结构 角色IPmaster192.168.35.135node1192.168.35.136node2192.168.35.137 部署 #需在三台主机上操作 //关闭防火墙 [rootmaster ~]# systemctl disable --now firewalld//关闭selinux [rootmaster ~]# sed -i s/enforcing/disabled/ /etc/selinux/config//关闭swap分区…...
springboot005学生心理咨询评估系统(源码+数据库+文档)
源码地址:学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表(含论文)后台运行截图 1.项目简介 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现…...
LeetCode37
LeetCode37 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结...
2025年02月24日Github流行趋势
项目名称:mastra 项目地址url:https://github.com/mastra-ai/mastra 项目语言:TypeScript 历史star数:5735 今日star数:1140 项目维护者:adeleke5140, abhiaiyer91, TheIsrael1, adeniyii, Joshuafolorunsh…...
Spring Boot 中的日志管理
一、日志框架选择 1. 主流框架对比 框架特点Spring Boot 默认支持Logback- 性能优异,Spring Boot 默认集成- 支持自动热更新配置文件✅ (默认)Log4j2- 异步日志性能更强- 支持插件扩展- 防范漏洞能力更好❌ (需手动配置)JUL (JDK自带)- 无需额外依赖- 功能简单&am…...
后端之JPA(EntityGraph+JsonView)
不同表之间的级联操作或者说关联查询是很多业务场景都会用到的。 对于这种需求最朴素的方法自然是手动写关联表,然后对被关联的表也是手动插入数据。但是手写容易最后写成一堆shit代码,而且修改起来也是非常麻烦的。 学会使用现成的工具还是非常有利的…...
点击修改按钮图片显示有问题
问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …...
Linux第一个小程序-进度条 (linux第七课)
目录 知识补充: 随机数的使用,先用srand(time(NULL))种时间种子 函数指针 模拟进度条代码 知识补充: \r只是回车 \r\n是回车加换行,其中\n带有强制换行的功能 如果只使用\r ,还需要刷新缓冲区(fflush(stdout)) %2d是左对齐 %-2d是右对齐 %.1lf是小数点后保留一位 随机数的使…...
iOS指纹归因详解
iOS 指纹归因(Fingerprint Attribution)详解 1. 指纹归因的概念 指纹归因(Fingerprint Attribution)是一种无 ID 归因(ID-less Attribution)技术,主要用于广告跟踪、用户识别或流量分析。它基…...
【Erdas实验教程】009:非监督分类及分类后评价
文章目录 一、分类过程二、分类评价ERDAS 的 ISODATA 算法是基于最小光谱距离来进行的非监督分类,聚类过程始于任意聚类平均值或一个已有分类模板的平均值;聚类每重复一次,聚类的平均值就更新一次,新聚类的均值再用于下次聚类循环。这个过程不断重复,直到最大的循环次数已…...
DeepSeek+Kimi生成高质量PPT
DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…...