图像配准(Image Registration)是计算机视觉中的基本步骤。在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法。
什么是图像配准
图像配准就是找到一幅图像像素到另一幅图像像素间的空间映射关系。这些图像可以是不同时间(多时间配准),不同传感器在不同地方拍摄(多模式配准)。这些图像之间的空间关系可以是刚性(rigid)(平移和旋转),仿射(affine)(例如剪切),单应性(homographies 单应性是一种几何变换,简单来说,它描述了在两个平面之间的映射关系。比如在图像拼接中,当你想把两张有重叠部分的平面图像合成为一张的时候,单应性可以帮助你确定从一个图像平面到另一个图像平面上的像素点是如何对应的。从数学角度讲,单应性矩阵可以用一个 3×3 的矩阵来表示,它将一个平面上的点(用齐次坐标表示)通过矩阵乘法映射到另一个平面上的点。) 或复杂的大变形模型(complex large deformations models) 复杂的大变形模型通常用于描述物体经历较大的形状变化的情况。例如在医学图像处理中,人体的器官在生长、病变或者手术等过程中会发生复杂的变形,这种模型就可以用于模拟和分析这些变形过程。它涉及到复杂的数学和物理原理,像非线性弹性力学等相关知识,来精确地刻画物体的大变形。
图像配准具有广泛的应用,适用于同一个场景中有多张图像需要进行匹配或叠加。在医学图像领域以及卫星图像分析和光流(optical flow)方面非常普遍。
CT扫描和MRI配准
在本文中,我们将介绍图像配准的几种不同方法。
传统的基于特征的方法
自21世纪初以来,图像配准主要使用基于特征的方法。这些方法有三个步骤:关键点检测和特征描述,特征匹配,图像变换。简单的说,我们选择两个图像中的感兴趣点,将参考图像(reference image)与感测图像(sensed image)中的等价感兴趣点进行关联,然后变换感测图像使两个图像对齐。
基于特征的方法
关键点检测和特征描述
关键点就是感兴趣点,它表示图像中重要或独特的内容(边角,边缘等)。每个关键点由描述符表示,关键点基本特征的特征向量。描述符应该对图像变换(定位,缩放,亮度等)具有鲁棒性。许多算法使用关键点检测和特征描述:
- SIFT(Scale-invariant feature transform)是用于关键点检测的原始算法,但它不能免费用于商业用途。SIFT特征描述符对于均匀缩放,方向,亮度变化和对仿射失真不变的部分不会发生变化。
- SURF(Speeded Up Robust Features)是一个受SIFT启发的探测器和描述符。它的优点是非常快。它同样是有专利的。
- ORB(Oriented FAST and Rotated BRIEF)是一种快速的二进制描述符,它基于 FAST(Features from Accelerated Segment Test)关键点检测和 BRIEF(Binary robust independent elementary features)描述符的组合。它具有旋转不变性和对噪声的鲁棒性。它由OpenCV实验室开发,是SIFT有效的免费替代品。
- AKAZE(Accelerated-KAZE)是KAZE快速版本。它为非线性尺度空间提供了快速的多尺度特征检测和描述方法,具有缩放和旋转不变性。
这些算法都可以在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)
图像关键点
特征匹配
一旦在一对图像中识别出关键点,我们就需要将两个图像中对应的关键点进行关联或“匹配”。其中一种方法是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中有更多关于特征匹配的实现方法
图像变换
在匹配至少四对关键点之后,我们就可以将一个图像转换为另一个图像,称为图像变换(image warping)。空间中相同平面的两个图像通过单应性变换(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对这三个步骤进行了综合叙述
深度学习方法
目前大多数关于图像配准的研究涉及深度学习。在过去的几年中,深度学习使计算机视觉任务具有先进的性能,如图像分类,物体检测和分割。
特征提取
深度学习用于图像配准的第一种方式是用于特征提取。卷积神经网络设法获得越来越复杂的图像特征并进行学习。2014年以来,研究人员将这些网络应用于特征提取的步骤,而不是使用SIFT或类似算法。
- 2014年,Dosovitskiy等人提出了一种通用的特征提取方法,使用未标记的数据训练卷积神经网络。这些特征的通用性使转换具有鲁棒性。这些特征或描述符的性能优于SIFT描述符以匹配任务。
- 2018年,Yang等人开发了一种基于相同思想的非刚性配准方法。他们使用预训练的VGG网络层来生成一个特征描述符,同时保留卷积信息和局部特征。这些描述符的性能也优于类似SIFT的探测器,特别是在SIFT包含许多异常值或无法匹配足够数量特征点的情况下。
SIFT和基于深度学习的非刚性配准方法描述符的结果
Homography学习
研究人员利用神经网络直接学习几何变换对齐两幅图像,而不仅仅局限于特征提取。
监督学习
在2016年,DeTone等人发表了 Deep Image Homography Estimation,提出了HomographyNe回归网络,这是一种VGG风格模型,可以学习两幅相关图像的单应性。该算法具有以端到端的方式同时学习单应性和CNN模型参数的优势,不需要前两个阶段的过程!
HomographyNet回归网络
网络产生八个数值作为输出。以监督的方式进行训练,并计算输出和真实单应性之间的欧几里德损失。
Supervised Deep Homography Estimation
与其他有监督方法一样,该单应性估计方法需要有标记数据。虽然很容易获得真实图像的单应性,但在实际数据上要昂贵得多。
无监督学习
基于这个想法,Nguyen等人提出了一种无监督的深度图像单应性估计方法。他们保留了相同结构的CNN,但是使用适合无监督方法的损失函数:不需要人工标签的光度损失(photometric loss)函数。相反,它计算参考图像和感测变换图像之间的相似性。
L1光度损失函数
他们的方法引入了两种新的网络结构:张量直接线性变换和空间变换层。我们可以简单地使用CNN模型输出的单应性参数获得变换后的感测图像,然后我们使用它们来计算光度损失。
Unsupervised Deep Homography Estimation
作者声称,与传统的基于特征的方法相比,这种无监督方法具有相当或更高的准确率和鲁棒性,并且具有更快的执行速度。此外,与有监督方法相比,它具有更好的适应性和性能。
其他方法
强化学习
强化学习方法作为医学应用的常用方法正在得到越来越多的关注。与预定义的优化算法相反,在这种方法中,我们使用训练好的代理进行配准。
强化学习方法的配准可视化
- 2016年,Liao 等人首先使用强化学习进行图像配准。他们的方法基于有监督算法进行端到端的训练。它的目标是通过寻找最佳的运动动作序列来对齐图像。这种方法优于最先进的方法,但它只能用于刚性转换。
- 强化学习也可以用于更复杂的转换。在Robust non-rigid registration through agent-based action learning论文中,Krebs等人使用人工代理优化变形模型参数。该方法对前列腺MRI图像的患者间的配准进行实验,在2-D和3-D中表现出了较好的结果。
复杂的转换
在当前图像配准研究中占较大比例的是医学影像。通常,由于患者的局部变形(因呼吸,解剖学变化等),两个医学图像之间的变换不能简单地通过单应矩阵描述,这需要更复杂的变换模型,例如由位移矢量场表示微分同胚(diffeomorphisms)。
心脏MRI图像上的变形网格和位移矢量场示例
研究人员开始尝试使用神经网络来估计这些具有许多参数的大变形模型。
- 一个例子是上面提到的Krebs等人的强化学习方法。
- 2017年De Vos等人提出了DIRNet。它使用CNN来预测控制点网格,该控制点用于生成位移矢量场,然后根据参考图像变换感测图像。
来自MNIST两个输入图像的DIRNet示意图
- Quicksilver配准解决了类似的问题。Quicksilver使用深度编码-解码器网络直接在预测图像上进行变形。
如何使用深度学习创建可变形图像配准?
What is Image Registration?
解释了如何使用深度神经网络进行可变形图像配准。
图像配准是将不同数据集转换为相同坐标系的处理过程。这些图像之间的空间关系可以是刚性的(平移和旋转)、仿射的(例如,剪切)、仿射的或复杂的变形型。
对于刚性图像配准,我建议您阅读」.Joslove和E.Kamoun撰写的文章。接下来,让我们专注于可变形图像配准,这是最通用的用例。
源图像与目标图像的可变形配准是找到一个像素方向的位移场,以便在将其应用于源图像时与目标图像匹配。
驴变成猫的可变形配准的插图
如何进行变形图像注册?
有几种方法可以进行可变形图像配准:最优传输、马尔可夫随机场和其他基于优化的技术。在这篇文章中,我想描述最近的技术,当然,也是最简单实现的技术:基于深度学习的技术。
下面是基于深度学习的可变形图像配准管道的训练过程的模式表示:
Schema representing the training process of a deep registration pipeline
- 步骤1:输出位移场
将(源,目标)对图像交给配准网络--配准网络由CNN(卷积神经网络)组成,通常是一个UNet。
这个CNN将这两张图像作为输入,并输出一个位移场。位移场只是一个张量,它将源图像中的每个像素(x,y)映射到位移向量(Ax,Ay)
- 步骤2:计算扭曲图像
一旦有了位移字段,就可以将它应用到源图像。为此,对于源图像中的每个像素,您计算目标像素(x',y')=(x+Ax,y+Ay)。然后,您使用目标坐标采样源图像以创建变形图像。此步骤在变形层中完成。
- 步骤3:计算相似曲面目标
现在,我们必须衡量我们的配准有多好,以便给网络一个优化目标(损失函数)。
有2个主要函数可以测量图像之间的相似性:
平均平方误差损失: MSE(均方误差)是像素级比较两个图像相似性的度量。如果两个图像完全相同则两个图像之间的MSE将等于0。两个图像 I 和 J 之间的MSE定义为:
NCC(归一化交叉相关)损失: NCC是衡量两个序列相似度的函数,取决于一个序列相对于另一个序列的位移。它在本质上类似于两个函数的卷积。如果W是大小为K的常数核,则两个图像 I 和 J 之间的NCC由以下公式定义:
步骤4:更新权重
一旦计算出相似性,就可以使用反向传播来更新CNN的权重。
最后,对数据集进行循环,训练可变形图像配准网络。
Going Further
本小节介绍了可变形配准的关键原理。图像配准是一个广泛的领域,导致了多篇研究论文的写作。
如果你想进一步了解和掌握可变形图像配准,这些链接可能很有用: