百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

图像配准:从SIFT到深度学习(图像配准常用算法实现原理)

toyiye 2024-08-10 21:28 13 浏览 0 评论

目录

  • 图像配准:从SIFT到深度学习
  • 什么是图像配准
  • 传统的基于特征的方法
  • 关键点检测和特征描述
  • 特征匹配
  • 图像变换
  • 深度学习方法
  • 特征提取
  • Homography学习
  • 监督学习
  • 无监督学习
  • 其他方法
  • 强化学习
  • 复杂的转换

图像配准(Image Registration)是计算机视觉中的基本步骤。在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法。

什么是图像配准

图像配准就是找到一幅图像像素到另一幅图像像素间的空间映射关系。这些图像可以是不同时间(多时间配准),不同传感器在不同地方拍摄(多模式配准)。这些图像之间的空间关系可以是刚性(rigid)[1](平移和旋转),仿射(affine)[2](例如剪切),单应性[3](homographies)或复杂的大变形模型(complex large deformations models)。

图像配准具有广泛的应用,适用于同一个场景中有多张图像需要进行匹配或叠加。在医学图像领域以及卫星图像分析和光流(optical flow)方面非常普遍。

本文我们将介绍图像配准的几种不同方法。

传统的基于特征的方法

自21世纪初以来,图像配准主要使用基于特征的方法。这些方法有三个步骤:关键点检测和特征描述,特征匹配,图像变换。简单的说,我们选择两个图像中的感兴趣点,将参考图像(reference image)与感测图像(sensed image)中的等价感兴趣点进行关联,然后变换感测图像使两个图像对齐。

关键点检测和特征描述

关键点就是感兴趣点,它表示图像中重要或独特的内容(边角,边缘等)。每个关键点由描述符表示,关键点基本特征的特征向量。描述符应该对图像变换(定位,缩放,亮度等)具有鲁棒性。许多算法使用关键点检测和特征描述:

  • SIFT[4](Scale-invariant feature transform)是用于关键点检测的原始算法,但它不能免费用于商业用途。SIFT特征描述符对于均匀缩放,方向,亮度变化和对仿射失真不变的部分不会发生变化。
  • SURF[5](Speeded Up Robust Features)是一个受SIFT启发的探测器和描述符。它的优点是非常快。它同样是有专利的。
  • ORB[6](Oriented FAST and Rotated BRIEF)是一种快速的二进制描述符,它基于 FAST[7](Features from Accelerated Segment Test)关键点检测和 BRIEF[8](Binary robust independent elementary features)描述符的组合。它具有旋转不变性和对噪声的鲁棒性。它由OpenCV实验室开发,是SIFT有效的免费替代品。
  • AKAZE[9](Accelerated-KAZE)是KAZE[10]快速版本。它为非线性尺度空间[11]提供了快速的多尺度特征检测和描述方法,具有缩放和旋转不变性。

这些算法都可以在OpenCV中轻松使用。在下面的例子中,我们使用了AKAZE的OpenCV实现。其他算法的代码大致相同,只需要修改算法的名称。

import numpy as np
import cv2 as cv

img = cv.imread('image.jpg')
gray= cv.cvtColor(img, cv.COLOR_BGR2GRAY)

akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

img=cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', img)

更过关于特征提取和描述的文档(https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html)

特征匹配

一旦在一对图像中识别出关键点,我们就需要将两个图像中对应的关键点进行关联或“匹配”。其中一种方法是BFMatcher.knnMatch()。这个方法计算每对关键点之间的描述符的距离,并返回每个关键点的k个最佳匹配中的最小距离。

然后我们设定比率来保持正确率。实际上,为了使匹配更可靠,匹配的关键点需要比最近的错误匹配更靠近。

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

img1 = cv.imread('image1.jpg', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('image2.jpg', cv.IMREAD_GRAYSCALE)

# 初始化 AKAZE 探测器
akaze = cv.AKAZE_create()
# 使用 SIFT 查找关键点和描述
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# BFMatcher 默认参数
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)

# 旋转测试
good_matches = []
for m,n in matches:
 if m.distance < 0.75*n.distance:
 good_matches.append([m])
 
# 画匹配点
img3 = cv.drawMatchesKnn(img1,kp1,img2,kp2,good_matches,None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', img3)

OpenCV中有更多关于特征匹配的实现方法(https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html)

图像变换

在匹配至少四对关键点之后,我们就可以将一个图像转换为另一个图像,称为图像变换[12](image warping)。空间中相同平面的两个图像通过单应性变换[13](Homographies)进行关联。Homographies是具有8个自由参数的几何变换,由3x3矩阵表示图像的整体变换(与局部变换相反)。因此,为了获得变换后的感测图像,需要计算Homographies矩阵。

为了得到最佳的变换,我们需要使用RANSAC算法检测异常值并去除。它内置在OpenCV的findHomography方法中。同时也存在RANSAC算法的替代方案,例如LMEDS: Least-Median鲁棒方法。

# 选择匹配关键点
ref_matched_kpts = np.float32([kp1[m[0].queryIdx].pt for m in good_matches]).reshape(-1,1,2)
sensed_matched_kpts = np.float32([kp2[m[0].trainIdx].pt for m in good_matches]).reshape(-1,1,2)

# 计算 homography
H, status = cv.findHomography(ref_matched_kpts, sensed_matched_kpts, cv.RANSAC,5.0)

# 变换
warped_image = cv.warpPerspective(img1, H, (img1.shape[1]+img2.shape[1], img1.shape[0]))
 
cv.imwrite('warped.jpg', warped_image)

OpenCV中对这三个步骤进行了综合叙述(https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html)

深度学习方法

目前大多数关于图像配准的研究涉及深度学习。在过去的几年中,深度学习使计算机视觉任务具有先进的性能,如图像分类,物体检测和分割。

特征提取

深度学习用于图像配准的第一种方式是用于特征提取。卷积神经网络设法获得越来越复杂的图像特征并进行学习。2014年以来,研究人员将这些网络应用于特征提取的步骤,而不是使用SIFT或类似算法。

  • 2014年,Dosovitskiy等人提出了一种通用的特征提取方法,使用未标记的数据训练卷积神经网络。这些特征的通用性使转换具有鲁棒性。这些特征或描述符的性能优于SIFT描述符以匹配任务。
  • 2018年,Yang等人开发了一种基于相同思想的非刚性配准方法。他们使用预训练的VGG网络层来生成一个特征描述符,同时保留卷积信息和局部特征。这些描述符的性能也优于类似SIFT的探测器,特别是在SIFT包含许多异常值或无法匹配足够数量特征点的情况下。

Homography学习

研究人员利用神经网络直接学习几何变换对齐两幅图像,而不仅仅局限于特征提取。

监督学习

在2016年,DeTone等人发表了 Deep Image Homography Estimation,提出了HomographyNe回归网络,这是一种VGG风格模型,可以学习两幅相关图像的单应性。该算法具有以端到端的方式同时学习单应性和CNN模型参数的优势,不需要前两个阶段的过程!

网络产生八个数值作为输出。以监督的方式进行训练,并计算输出和真实单应性之间的欧几里德损失。

与其他有监督方法一样,该单应性估计方法需要有标记数据。虽然很容易获得真实图像的单应性,但在实际数据上要昂贵得多。

无监督学习

基于这个想法,Nguyen等人提出了一种无监督的深度图像单应性估计方法。他们保留了相同结构的CNN,但是使用适合无监督方法的损失函数:不需要人工标签的光度损失(photometric loss)函数。相反,它计算参考图像和感测变换图像之间的相似性。

他们的方法引入了两种新的网络结构:张量直接线性变换和空间变换层。我们可以简单地使用CNN模型输出的单应性参数获得变换后的感测图像,然后我们使用它们来计算光度损失。

作者声称,与传统的基于特征的方法相比,这种无监督方法具有相当或更高的准确率和鲁棒性,并且具有更快的执行速度。此外,与有监督方法相比,它具有更好的适应性和性能。

其他方法

强化学习

强化学习方法作为医学应用的常用方法正在得到越来越多的关注。与预定义的优化算法相反,在这种方法中,我们使用训练好的代理进行配准。

  • 2016年,Liao 等人首先使用强化学习进行图像配准。他们的方法基于有监督算法进行端到端的训练。它的目标是通过寻找最佳的运动动作序列来对齐图像。这种方法优于最先进的方法,但它只能用于刚性转换。
  • 强化学习也可以用于更复杂的转换。在Robust non-rigid registration through agent-based action learning论文中,Krebs等人使用人工代理优化变形模型参数。该方法对前列腺MRI图像的患者间的配准进行实验,在2-D和3-D中表现出了较好的结果。

复杂的转换

在当前图像配准研究中占较大比例的是医学影像。通常,由于患者的局部变形(因呼吸,解剖学变化等),两个医学图像之间的变换不能简单地通过单应矩阵描述,这需要更复杂的变换模型,例如由位移矢量场表示微分同胚(diffeomorphisms)。

研究人员开始尝试使用神经网络来估计这些具有许多参数的大变形模型。

  • 一个例子是上面提到的Krebs等人的强化学习方法。
  • 2017年De Vos等人提出了DIRNet。它使用CNN来预测控制点网格,该控制点用于生成位移矢量场,然后根据参考图像变换感测图像。
  • Quicksilver配准解决了类似的问题。Quicksilver使用深度编码-解码器网络直接在预测图像上进行变形。

[1]: https://en.wikipedia.org/wiki/Rigid_transformation

[2]: https://en.wikipedia.org/wiki/Affine_transformation

[3]: https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html

[4]: https://www.cs.ubc.ca/~lowe/papers/ijcv04.pdf

[5]: https://www.vision.ee.ethz.ch/~surf/eccv06.pdf

[6]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.370.4395&rep=rep1&type=pdf

[7]: https://www.edwardrosten.com/work/rosten_2006_machine.pdf

[8]: https://www.cs.ubc.ca/~lowe/525/papers/calonder_eccv10.pdf

[9]: http://www.bmva.org/bmvc/2013/Papers/paper0013/paper0013.pdf

[10]: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.304.4980&rep=rep1&type=pdf

[11]: https://en.wikipedia.org/wiki/Scale_space

[12]: https://docs.opencv.org/3.0-beta/modules/cudawarping/doc/warping.html

[13]: https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码