【图像配准】方法总结
图像配准(Image registration)就是将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已经被广泛地应用于遥感数据分析、计算机视觉、图像处理等领域。
图像之间的空间关系可以表示为刚性(rigid,如平移和旋转),仿射(affine,如剪切),单应性(homographies)或复杂的大变形模型(complex large deformations models)。
一.基于特征的方法
基于特征的图像配准的步骤如下:
1. 特征检测
检测参考图像和感知图像中独特的对象(封闭边界区域、边缘、轮廓、线交叉点、角等)。每个关键点由描述符表示,关键点基本特征的特征向量。描述符应该对图像变换(定位,缩放,亮度等)具有鲁棒性。常用的检测算法如下:
•SIFT:Scale-invariant feature transform不能免费用于商业用途。SIFT特征描述符对于均匀缩放,方向,亮度变化和对仿射失真不变的部分不会发生变化。
•SURF:Speeded Up Robust Features,受SIFT启发的探测器和描述符。非常快。同样是有专利的。
•ORB:Oriented FAST and Rotated BRIEF)是1种快速的二进制描述符,基于 FAST(Features from Accelerated Segment Test)关键点检测和 BRIEF(Binary robust independent elementary features)描述符的组合。它具有旋转不变性和对噪声的鲁棒性。
2. 特征匹配
建立参考图像和感知图像中的特征之间的相关性。匹配方法是基于图片的内容或控制点集的符号描述。
3. 估计变换模型
计算映射函数的参数和种类,将检测到的图片与参考图像对齐。映射函数如单应性变换(Homographies)。
4. 图像变换
使用映射函数(如Homographies矩阵)改变检测到的图像。
5.算法代码实例(Python)
import random
import math
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from PIL import Image
import numpy as np# 设置1个至少20个匹配的条件
MinMatchNum = 20
# 读取照片
L = cv2.imread('1537-2024-08-05_15-26-37.png') # queryImage
R = cv2.imread('1537-2024-08-05_15-26-37.png') # trainImage
# 高斯滤波
L = cv2.GaussianBlur(L, (3, 3), 0)
R = cv2.GaussianBlur(R, (3, 3), 0)
# 创建sift检测器
sift = cv2.SIFT_create()
# 计算所有特征点的特征值kp和特征向量des
left_kp, left_des = sift.detectAndCompute(R, None)
righ_kp, righ_des = sift.detectAndCompute(L, None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(left_des, righ_des, k=2)
# 进行特征点匹配筛选
BetterChoose1 = []
for m, n in matches:# 认为第1近的点小于第2近的点1倍以上是好的匹配BetterChoose1if m.distance < 0.5 * n.distance:BetterChoose1.append(m)
BetterChoose2 = np.expand_dims(BetterChoose1, 1)
match = cv2.drawMatchesKnn(L, left_kp, R, righ_kp, BetterChoose2[:30], None, flags=2)
print(len(BetterChoose1),MinMatchNum)
if len(BetterChoose1) > MinMatchNum:# 获取关键点的坐标src_pts = np.float32([left_kp[m.queryIdx].pt for m in BetterChoose1]).reshape(-1, 1, 2)dst_pts = np.float32([righ_kp[m.trainIdx].pt for m in BetterChoose1]).reshape(-1, 1, 2)print('src_pts:',src_pts,src_pts.shape)print('dst_pts:',dst_pts,dst_pts.shape)# 调用RANSAC方法得到解HH, modle = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)wrap = cv2.warpPerspective(R, H, (R.shape[1] + R.shape[1], R.shape[0] + R.shape[0]))wrap[0:R.shape[0], 0:R.shape[1]] = L# 得到新的位置rows, cols = np.where(wrap[:, :, 0] != 0)min_row, max_row = min(rows), max(rows) + 1min_col, max_col = min(cols), max(cols) + 1# 去除黑色无用部分LeftAndRight = wrap[min_row:max_row, min_col:max_col, :]
# 将图片结果进行显示
scal = 0.7
cv2.imshow('connect', cv2.resize(match, (0, 0), fx=scal, fy=scal, interpolation=cv2.INTER_NEAREST))
cv2.imshow('LeftAndRight', cv2.resize(LeftAndRight, (0, 0), fx=scal, fy=scal, interpolation=cv2.INTER_NEAREST))
cv2.waitKey(0)
cv2.destroyAllWindows()
二.深度学习方法
深度学习在图像配准方面的应用表现为特征提取和Homography学习2个方面。
1.特征提取
将深度网络应用于特征提取的步骤,而不是使用SIFT或类似算法。
使用预训练的VGG网络层来生成1个特征描述符,同时保留卷积信息和局部特征。描述符的性能优于类似SIFT的探测器,特别是在SIFT包含许多异常值或无法匹配足够数量特征点的情况下。
论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8404075
代码链接:https://github.com/yzhq97/cnn-registration
2.Homography学习
利用神经网络直接学习几何变换对齐2幅图像,而不仅仅局限于特征提取。
2016 年的CVPR上,Daniel DeTone等人提出了1种叫作HomographyNet的基于深度学习的无监督单应性变换网络。
网络产生8个数值作为输出。以监督的方式进行训练,并计算输出和真实单应性之间的欧几里德损失。
论文链接:https://arxiv.org/pdf/1606.03798
代码链接:https://github.com/breadcake/Deep-homography-estimation-pytorch
相关文章:

【图像配准】方法总结
图像配准(Image registration)就是将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,就是找到1幅图像像素到另1幅图像像素间的空间映射关系它已…...

LabVIEW汽车综合参数测量
系统基于LabVIEW虚拟仪器技术,专为汽车带轮生产中的质量控制而设计,自动化测量和检测带轮的关键参数。系统采用PCIe-6320数据采集卡与精密传感器结合,能够对带轮的直径、厚度等多个参数进行高精度测量,并通过比较测量法判定产品合…...
三相异步电动机没有气压怎么办?
三相异步电动机作为工业和商业应用中最常见的电动机类型之一,广泛应用于各类机械设备及自动化系统中。其运行依赖于电能的转换,然而在某些情况下,可能会出现电动机驱动设备无法获得气压的情况。 一、三相异步电动机工作原理 三相异步电动机…...

软件工程书籍推荐
软件工程推荐这几本书: 1、软件设计的哲学(第2版) 本书深入探讨了软件设计中的核心问题:如何将复杂的软件系统分 解为可以相对独立实现的模块(例如类和方法),从而降低其复杂性并 提高开发效率。…...
验证集和测试集的区别
验证集(Validation Set)和测试集(Test Set)在机器学习模型训练过程中扮演着不同的角色,以下是它们之间的主要区别: 目的: 验证集:用于在模型训练过程中调整模型的超参数和做出训练…...

OpenIPC开源FPV之Adaptive-Link天空端代码解析
OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中…...
Next.js流量教程:核心 Web Vitals的改善
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 引言 1. 什么是 Core Web Vitals? 1.1 Largest Contentful Paint (LCP) 1.2 First Input Delay (FID) 1.3 Cumulative Layout Shift (CLS) 2. 如何优化 …...

百度智能云千帆AppBuilder升级,百度AI搜索组件上线,RAG支持无限容量向量存储!
百度智能云千帆 AppBuilder 发版升级! 进一步降低开发门槛,落地大模型到应用的最后一公里。在千帆 AppBuilder 最新升级的 V1.1版本中,企业级 RAG 和 Agent 能力再度提升,同时组件生态与应用集成分发更加优化。 • 企业级 RAG&am…...

构建树莓派温湿度监测系统:从硬件到软件的完整指南
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

12.11数据结构-图
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。 有向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。 含有n个顶点的无向完全图有…...

BERT模型入门(2)BERT的工作原理
文章目录 如名称所示,BERT(来自Transformer的双向编码器表示)是基于Transformer模型。我们可以将BERT视为只有编码器部分的Transformer。 在上一个主题《Transformer入门》中,我们了解到将句子作为输入喂给Transformer的编码器&a…...
python3 中的成员运算符
一. 简介 在Python 3中,成员运算符用于测试序列(如字符串、列表、元组、集合或字典)中是否包含某个值。身份运算符用于比较两个对象的身份,即它们是否引用内存中的同一个对象。 本文简单学习一下 python3 中的成员运算符与身份运…...
【测试面试篇1】测试开发与开发|selenium实现自动化测试|设计测试用例|常见的测试方法|开发不认可提测试的bug该怎么办
目录 1.选择走测试为什么还要学这么多的开发知识? 2.为什么选择软件测试开发岗位而不是软件开发岗位? 3.个人的职业规划是什么? 4.测试中遇到的问题如何进行解决? 5.对自己的项目做过哪些测试工作? 6.描述selenium…...

人大金仓数据linux安装注意事项
人大金仓数据linux安装注意事项 本次是个人搭建虚拟机安装centos7的环境下进行安装。 1、安装流程参照https://help.kingbase.com.cn/v9/install-updata/install-linux/preface.html。 2、mount安装文件报错 操作手册提供mount的命令如下: mount KingbaseES_V009R0…...

【Maven】多模块项目的构建
项目构建 什么是构建? 项目构建指的是将源代码和资源文件转换为可执行或可分发的软件制品(如 JAR、WAR 文件)的过程。这个过程不仅包括编译代码,还包括运行测试、打包、部署等步骤。Maven 提供了一套标准化的方法来处理这些任务…...

大模型学习笔记------SAM模型详解与思考
大模型学习笔记------SAM模型详解与思考 1、SAM框架概述2、Segment Anything Task3、Segment Anything Model SAM模型是Meta 提出的分割一切模型(Segment Anything Model,SAM)突破了分割界限,极大地促进了计算机视觉基础模型的发展…...
crictl和ctr与docker的命令的对比
crictl是遵循CRI接口规范的一个命令行工具,通常用它来检查和管理kubelet节点上的容器运行时和镜像 ctr是containerd的一个客户端工具, 接下来就是crictl的的常见命令,其中能完全替代docker命令的参照下列表格 操作crictldocker查看运行容器…...
SQLite建表语句示例(含所有数据类型、索引、自增主键、唯一索引)
下面是一个示例,展示如何创建一个用户信息表。 包含 SQLite 支持的所有数据类型,同时设置主键为自增、一个字段为唯一索引,以及另一个字段为普通索引: -- 创建用户信息表 CREATE TABLE user_info (id INTEGER PRIMARY KEY AUTOI…...

探秘Redis哨兵模式:原理、运行与风险全解析
一、引言 Redis 概述 在当今的数据存储领域,Redis 占据着十分重要的地位。它是一个内存中的数据存储,凭借其出色的性能和丰富的功能,被数百万开发人员广泛应用于诸多场景之中,已然成为构建高性能、可扩展应用程序的得力工具。 从…...

.NET平台使用C#设置Excel单元格数值格式
设置Excel单元格的数字格式是创建、修改和格式化Excel文档的关键步骤之一,它不仅确保了数据的正确表示,还能够增强数据的可读性和专业性。正确的数字格式可以帮助用户更直观地理解数值的意义,减少误解,并且对于自动化报告生成、财…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...