当前位置: 首页 > article >正文

【图像配准】方法总结

 图像配准(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倍以上是好的匹配BetterChoose1
    if 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方法得到解H
    H, 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) + 1
    min_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


http://www.kler.cn/a/443713.html

相关文章:

  • 大模型(LLM)提示工程(Prompt Engineering)初识
  • 抢单人机交互「新红利」!哪些细分赛道“多金”?
  • linux firewalld 命令详解
  • GitCode 光引计划投稿|JavaVision:引领全能视觉智能识别新纪元
  • 车载网关性能 --- GW ECU报文(message)处理机制的技术解析
  • FPGA(一)verilog语句基础
  • HarmonyOS NEXT 应用开发实战:音乐播放器的完整实现
  • Vue|scoped样式
  • mapboxGL中室内地图的实现
  • PowerMILL 客制化宏 - 命令关键字
  • 应用如何借用manifestxml追加gid权限
  • PostgreSql-学习06-libpq之同步命令处理
  • go 自己写序列化函数不转义
  • UE5 角色换新枪械的偷懒办法
  • UE5 Lyra项目源码分析-角色配置说明
  • WebRTC服务质量(04)- 重传机制(01) RTX NACK概述
  • 简易记事本开发-(SSM+Vue)
  • Navicat 17 功能简介 | SQL 美化
  • 力扣题目解析--K个一组翻转链表
  • 042_Unscented Kalman Filter in Matlab无迹卡尔曼滤波
  • 对象的克隆 单例模式
  • sql递归查出某个值下的所有子集数据
  • 在微服务架构中,处理消息的中间件是实现服务间异步通信的关键组件。以下是几种常见的消息中间件及其特点、优点和缺点
  • 重庆大学《2024年844自动控制原理真题》 (完整版)
  • Arrays.sort和Collections.sort排序基本用法
  • Elasticsearch 实战应用:提升数据洞察与交互体验