编译 | 小韩
来源 | sicara.com
目录:
什么是图像配准
传统的基于特征的方法
关键点检测和特征描述
特征匹配
图像变换
深度学习方法
特征提取
Homography 学习
监督学习
无监督学习
其他方法
强化学习
复杂的转换
图像配准 (Image Registration) 是计算机视觉中的基本步骤. 在本文中, 我们首先介绍基于 OpenCV 的方法, 然后介绍深度学习的方法.
什么是图像配准
图像配准就是找到一幅图像像素到另一幅图像像素间的空间映射关系. 这些图像可以是不同时间 (多时间配准), 不同传感器在不同地方拍摄(多模式配准). 这些图像之间的空间关系可以是刚性(rigid)^1(平移和旋转), 仿射(affine)^2(例如剪切), 单应性 ^3(homographies) 或复杂的大变形模型(complex large deformations models).
图像配准具有广泛的应用, 适用于同一个场景中有多张图像需要进行匹配或叠加. 在医学图像领域以及卫星图像分析和光流 (optical flow) 方面非常普遍.
CT 扫描和 MRI 配准
在本文中, 我们将介绍图像配准的几种不同方法.
传统的基于特征的方法
自 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)
图像关键点
更过关于特征提取和描述的文档
特征匹配
一旦在一对图像中识别出关键点, 我们就需要将两个图像中对应的关键点进行关联或 "匹配". 其中一种方法是 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 中有更多关于特征匹配的实现方法
图像变换
在匹配至少四对关键点之后, 我们就可以将一个图像转换为另一个图像, 称为图像变换 ^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 对这三个步骤进行了综合叙述
深度学习方法
目前大多数关于图像配准的研究涉及深度学习. 在过去的几年中, 深度学习使计算机视觉任务具有先进的性能, 如图像分类, 物体检测和分割.
特征提取
深度学习用于图像配准的第一种方式是用于特征提取. 卷积神经网络设法获得越来越复杂的图像特征并进行学习. 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 使用深度编码 - 解码器网络直接在预测图像上进行变形.
来源: http://www.tuicool.com/articles/uQfQZfy