图像对齐:从SIFT到深度学习


概述

由于关于图像对齐的日语文章很少(截至2020年1月22日),我翻译了文章《图像配准:从SIFT到深度学习》,我认为这很容易理解。有些部分已被省略或添加,因此,如果您想参考原始内容,请阅读原始文章。

源代码

什么是图像配准?

image.png

图像对齐是纠正两个图像未对齐的过程。比较同一场景中的多个图像时,使用图像对齐。例如,它经常出现在卫星图像分析,光流和医学成像领域。
让我们看一个具体的例子。上图是我在新大久保店吃的马斯喀特糖果的对齐图像。它非常好吃,但我不会推荐给任何不喜欢吃甜食的人。
在此示例中,您可以看到从左边数第二个马斯喀特糖果的位置与最左边的马斯喀特糖果的位置对齐,同时保持了亮度等。在下文中,未转换和参考的图像(例如左边缘)被称为参考图像,而转换后的图像(例如从左数第二个图像)被称为浮动图像。
本文介绍了一些在浮动图像和参考图像之间对齐的技术。请注意,基于迭代/信号强度的方法不是很常见,因此本文中将不予提及。

基于特征的方法

自2000年代初以来,一直使用基于特征的图像对齐方法。该方法包括三个步骤:关键点检测和特征描述,特征匹配以及图像变换。简而言之,选择两个图像中的兴趣点,将参考图像中的每个兴趣点与浮动图像中的对应点相关联,并对浮动图像进行变换,以使两个图像对齐。

关键点检测和功能描述

关键点定义图像中的重要特征对象(拐角,边缘等)。每个关键点由一个描述符表示。描述符是特征向量,包含关键点的基本特征。描述符必须对图像转换(定位,比例,亮度等)具有鲁棒性。有很多算法可以检测关键点并描述特征。

  • SIFT(尺度不变特征变换)是用于检测关键点的原始算法,但是要付费使用。 SIFT特征描述符对于统一缩放,方向和亮度转换是不变的,对于仿射失真则是部分不变的。

  • SURF(快速鲁棒功能)是受SIFT影响的检测器和描述符。它比SIFT快几倍。我们也有专利。

  • ORB FAST Brief(定向的FAST和旋转的Brief)是基于FAST关键点检测器和Brief描述符的组合的快速二进制描述符。它对旋转不变,对噪声也很强。由OpenCV Labs开发,它是SIFT的高效免费替代品。

  • AKAZE(Accelerated-KAZE)是KAZE的加速版本。它为非线性尺度空间提供了一种快速的多尺度特征检测和描述方法。它对于缩放和旋转都是不变的,并且是免费的。

这些算法易于与OpenCV一起使用。在下面的示例中,我们使用了AKAZE的OpenCV实现。您只需重命名算法即可使用其他算法。

1
2
3
4
5
6
7
8
9
10
11
12
import cv2 as cv

# キーポイントなどを見やすくするためにグレースケールで画像読み込み
img = cv.imread('img/float.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# キーポイントの検出と特徴の記述
akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)

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

キーポイントの検出と特徴の記述

有关特征检测和描述符的更多信息,请参见OpenCV教程。

功能匹配

在两个图像中找到关键点之后,您需要关联或"匹配"相应的关键点。其中一种方法是BFMatcher.knnMatch()。它测量每对关键点描述符之间的距离,并与距离每个关键点最近的k个关键点进行匹配。
然后应用比率过滤器以仅保留正确的匹配项。为了进行可靠的匹配,匹配的关键点必须比最接近的错误匹配更接近。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import cv2 as cv

float_img = cv.imread('img/float.jpg', cv.IMREAD_GRAYSCALE)
ref_img = cv.imread('img/ref.jpg', cv.IMREAD_GRAYSCALE)

akaze = cv.AKAZE_create()
float_kp, float_des = akaze.detectAndCompute(float_img, None)
ref_kp, ref_des = akaze.detectAndCompute(ref_img, None)

# 特徴のマッチング
bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)

# 正しいマッチングのみ保持
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

matches_img = cv.drawMatchesKnn(
    float_img,
    float_kp,
    ref_img,
    ref_kp,
    good_matches,
    None,
    flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', matches_img)

特徴のマッチング

有关在OpenCV中实现的其他功能匹配方法的信息,请参阅文档。

图像转换

匹配至少4组关键点后,将一个图像相对于另一个图像进行转换。这称为图像变形。空间中同一平面上的两个图像通过单应性关联。单应性是具有八个自由参数的几何变换,并由3x3矩阵表示。它们表示应用于整个图像的失真(与局部变换相反)。因此,要获得变换后的浮动图像,请计算单应矩阵并将其应用于浮动图像。
为了确保最佳变换,使用RANSAC算法来检测离群值并将其移除以确定最终的单应性。它直接内置在OpenCV findHomography方法中。作为RANSAC的替代方法,还有可靠的估计方法,例如LMEDS:最小中值方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
import cv2 as cv

float_img = cv.imread('img/float.jpg', cv.IMREAD_GRAYSCALE)
ref_img = cv.imread('img/ref.jpg', cv.IMREAD_GRAYSCALE)

akaze = cv.AKAZE_create()
float_kp, float_des = akaze.detectAndCompute(float_img, None)
ref_kp, ref_des = akaze.detectAndCompute(ref_img, None)

bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)

good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append([m])

# 適切なキーポイントを選択
ref_matched_kpts = np.float32(
    [float_kp[m[0].queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
sensed_matched_kpts = np.float32(
    [ref_kp[m[0].trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

# ホモグラフィを計算
H, status = cv.findHomography(
    ref_matched_kpts, sensed_matched_kpts, cv.RANSAC, 5.0)

# 画像を変換
warped_image = cv.warpPerspective(
    float_img, H, (float_img.shape[1], float_img.shape[0]))

cv.imwrite('warped.jpg', warped_image)

画像の変換

如果您对这三个步骤的细节感兴趣,则OpenCV整理了一系列有用的教程。

深度学习方法

最新的图像对齐研究涉及深度学习的使用。在过去的几年中,深度学习已使计算机视觉任务(例如分类,检测和分段)中的尖端性能得以实现。图像对齐也不例外。

特征提取

深度学习首先用于图像对齐以进行特征提取。卷积神经网络(CNN)的连续层捕获越来越复杂的图像特征并学习特定于任务的特征。自2014年以来,研究人员将这些网络应用于特征提取步骤,而不是SIFT或类似算法。

  • 在2014年,Dosovitskiy等人建议仅使用无监督数据来学习CNN。这些功能的多功能性使其对转换具有鲁棒性。这些功能或描述符优于SIFT描述符。
  • 在2018年,Yang等基于相同的思想开发了一种非刚性的车身对准方法。他们使用了一层预先学习的VGG网络来生成既包含卷积信息又包含本地化特征的特征描述符。这些描述符似乎优于SIFT等检测器,尤其是在SIFT包含许多异常值或无法匹配足够数量的特征点的情况下。
    后一论文的代码可以在这里找到。您可以在15分钟内在图像上尝试这种对齐方式,但比上半年实现的类似SIFT的方式慢70倍。

同形异象学习

研究人员试图通过使用神经网络直接学习几何变换来实现对齐,而不是限制使用深度学习来进行特征提取。

监督学习

2016年,DeTone等人发布了深层图像单应性估计值,解释了回归单应性网络,这是一种VGG样式的模型,用于学习与两个图像相关的单应性。该算法的优点是可以同时端到端学习单应性和CNN模型参数。无需特征提取和匹配过程。

image.png

网络产生八个实数作为输出。有监督的学习是通过输出和地面实测单应性之间的损失来完成的。

image.png

像其他监督学习方法一样,这种单应性估计方法需要一对监督数据。但是,要获得具有真实数据的宏大事实单应性并不容易。

无监督学习

Nguyen等人提出了一种用于深度图像单应性估计的无监督学习方法。他们使用了相同的CNN,但必须使用适合无监督方法的损失函数。因此,我们选择了光度损失,它不需要盛大的真相标签。计算参考图像和转换后的浮动图像之间的相似度。

$$
\\ mathbf {L} _ {PW} = \\ frac {1} {| \\ mathbf {x} _i |}
\\ sum _ {\\ mathbf {x} _i} | I ^ A(\\ mathscr {H}(\\ mathbf {x} _i))-I ^ B(\\ mathbf {x} _i)|
$$

他们的方法引入了两个新的网络结构,即Tensor直接线性变换和空间变换层。

image.png

作者认为,与传统的基于特征的方法相比,这种无监督方法具有更快的推理速度,可比或更高的准确性以及对照明波动的鲁棒性。此外,它比受监督的方法更具适应性和性能。

其他方法

强化学习

深度强化学习作为调整医疗应用的一种方法正引起人们的注意。与预定义的优化算法相比,此方法使用受过训练的代理执行对齐。

image.png

  • 2016年,Liao等人首先使用强化学习进行图像对齐。他们的方法基于用于端到端学习的贪婪监督算法。目的是通过找到最佳的动作顺序来对齐图像。此方法优于某些最新方法,但仅用于刚性转换。
  • 强化学习还用于更复杂的转换。 Krebs等人通过基于主体的动作学习进行了稳健的非刚性身体对准。应用人工代理优化转换模型的参数。该方法在前列腺MRI上对受试者与受试者的对准进行了评估,并在2D和3D中显示出可喜的结果。

复杂转换

当前在图像对齐方面的大量研究与医学成像领域相关。在许多情况下,由于对象的局部变换(例如呼吸和解剖变化),不能简单地用单应矩阵描述两个医学图像之间的变换。我们需要更复杂的转换模型,例如可以由位移矢量场表示的亚纯性。

image.png

研究人员已尝试使用神经网络来估计具有许多参数的大型转换模型。

  • 第一个例子是上述Krebs等人的强化学习方法。
  • 2017年,De Vos及其同事提出了DIRNet。这是一个使用CNN预测控制点网格的网络,该网络用于生成位移矢量场并根据参考图像扭曲浮动图像。

image.png

  • Quicksilver对齐解决了类似的问题。 Quicksilver使用深层编码和解码网络来直接预测图像外观中的逐块转换。

摘要

我介绍了一些图像对齐技术。发现使用特征点的方法正在改变为通过深度学习直接转换图像的方法。