learn2reg-配准介绍

https://learn2reg.github.io/

https://github.com/learn2reg/tutorials2019

Introduction to Medical Image Registration

什么是医学图像配准?

建立图像之间的空间关系,也称之为空间归一化spatial normalisation

图像配准关注与寻找到图像空间之间的空间变换或映射spatial transformation or mapping

为什么需要配准?

  • 病患的移动(不同时刻的对齐)
  • 病患的变化(治疗前后的对比)
  • 病患的对照(基于atlas的分析)
  • 信息融合(补充方式或时间,计划转移)
  • 运动补偿改进重建
  • 视场放大(拼接)
  • 本地化和视觉伺服

关键的组成

  • 空间变换模型spatial transformation model

刚体变换Rigid、仿射变换affine、基于局部基函数、位移场displacement field.等

  • 图像匹配驱动Image matching driver

稀疏配对特征Spare paired features。图像强度比较image intensity comparisons

  • 正则化regularisation

空间变化平滑先验spatial transformation smoothness

数据驱动先验data driven pripors

  • 优化策略optimisation strategy

梯度下降gradient descent,无导数连续优化器 derivative-free continuous optimiser,离散图论优化器discret graph-based optimiser

统计学Stistical, 机器学习maching-learing based

配准最主要的两种方法

  • 基于特征匹配Feature-based matching

识别成对的对应点、线或其他几何图元

根据对应特征,拟合一个空间变换模型

  • 基于强度的配准Intensity-based registration

定义一个用于比较图像间相似度的代价函数

使用空间变换来warp图像

通过优化warped image间的代价函数,找到空间变换

经典基于强度的配准:最优化问题

符号:

  • F:fixed image 。作用域\Omega_F
  • M:Moving image。作用域\Omega_M
  • s^*:空间变换。\Omega_F\rightarrow \Omega_Mx\in \Omega_F
  • G:变换模型;空间变换的空间s
  • Sim(\cdot ,\cdot ):图像相似度的度量
  • Reg(\cdot ,\cdot ):可选的正则项

空间转换的示例空间和相关的复杂性

  • 空间变换不一定需要生成向量空间
  • 加法:没有几何意义

s1,s2\inG \Rightarrow s = s1+s2\notin G

  • 自然操作:合成

s1,s2\inG \Rightarrow s = s1\circ s2\in G, s: p\in\Omega ,s(p)=s1(s2(p))

  • 李群结构:需要找到一个好的空间内在参数化或使用约束优化

https://zh.wikipedia.org/wiki/%E6%9D%8E%E7%BE%A4

杨梦铎, 李凡长, 张莉. 李群机器学习十年研究进展[J]. 计算机学报, 2015(07):33-52.

李群是连续的群,也即其元素可由几个实参数描述。李群为连续对称性的概念提供了一个自然的模型,例如三维旋转对称性。

经典基于强度的配准:优化问题

  • 要解决的优化问题(省略权重因素)s^* = arg min_sSim(F,M \circ s)+Reg(s)\\ \begin{matrix} & & \end{matrix}= arg min_sE(s)
  • 迭代求解

从经典到基于学习的方法

  • 经典方法

一对图像或者F和M:s^* = arg min_sSim(F,M \circ s)+Reg(s)

  • 基于学习方法的扩展(省略权重因素)

利用多对图像对:F_iM_i

在训练的时候使用额外的信息E(注释,真实模拟):定义一个监督损失SuppLoss

使用\theta参数逼近函数(例如CNN)f_\theta(\cdot )编码ss = f_\theta(F,M)

在所有的训练集上优化

\theta^*=argmin_\theta E_{p(F,M)}[Sim(F,M\circ f_\theta(F,M))+Reg(f_\theta(F,M))+SupLoss(E,F,M,f\theta(F,M))]

许多其他基于学习的选项(如学习相似或学习更新步骤)

基于强度配准:隐藏的困难

许多选择:

  • Sim,Reg,G,optimiser, parameters, weighting, etc.
  • 大多数选择针对指定问题
  • 从数据中很难了解其中的许多:可用的基本事实
  • 没有最好的方法

经典的方法提出了困难的优化问题:

  • 高维度
  • 强非线性问题
  • 强非凸能量函数,局部极小:具有许多深度学习的特征

从离散样本到连续问题

  • 数字图像通常是一个规则的体素网格上的样本集合
  • 空间变换不能用精确的(离散的)体素匹配来精确地表示:需要连续的表示
  • 图像相似性度量通常依赖于连续积分
  • 插值和重采样用来“绕过”这个难题
  • 对于基于深度学习的方法,重要的是确保步骤是可区分的

插值和重采样

  • 体素位置x\in \Omega_F,s(x)一般不落在\Omega_M体素位置。
  • M\circ s(x) = M(s(x)):

对于Nyquist-Shannon采样定理,利用sinc核可以准确地从一组离散样本中恢复带限连续函数

在实际应用中,由于sinc的计算复杂度和相关的伪影(如振铃),使用了最近邻、线性或三次插值

变换的方向

插值策略的影响

用小的旋转重采样多次:避免多次重采样!如果使用一次,线性插值是好的。

基本配准的策略

  • s(x) = S\cdot x:使用齐次坐标homogeneous coordinates,变换后的坐标
  • Sim(F,M\circ s)=\int \left | F(x)-M(S\cdot x)\right |^2dx相似性度量
  • Reg(s)=0正则化
  • 积分的作用域:x\in\Omega_F;s(x)\in \Omega_M
  • \Omega_s = \Omega_F\bigcap s^{-1}(\Omega_M):fixed图像和moving图像的逆变换图像交集
  • 如何计算积分:\int_{\Omega s}\left| F(x) - M(S\cdot x)\right|^2 \approx \sum_{x\in \Omega s}\left| F(x)-M(S\cdot x)\right|^2;Sim(F,M\circ s) \overset{\Delta }{=} \sum_{x\in \Omega s}\left| F(x)-M(S\cdot x)\right|^2
  • Sim(F,M\circ s) \overset{\Delta }{=} \sum_{x\in \Omega s}\left| F(x)-M(S\cdot x)\right|^2如何优化:需要计算Sim的梯度(或者一般),使用链式法则chain rule。
  • \bigtriangledown Sim(S) =- \sum_{x\in \Omega s}(F(x)-M(s\cdot x))\cdot(\bigtriangledown M)(S\cdot x)^T \cdot(x^T \bigotimes I d_N)
  • 通过梯度下降:S_{n+1} = S_n + \lambda\triangledown Sim(S_n);步长规则,线搜索?一阶收敛。
  • Newton-Raphson(使用Hessian)可能是一种选择:如何得到代价函数的Hessian的稳定评估?这个比例可以进行变形配准吗?

图像相似度的度量-示例

  • 用于相同强度 +高斯噪声的差平方和(SSD)Sum of squared differences
  • 仿射关系的标准化互相关(NCC) Normalised Cross-correlation:光照差异小,对比度变化小;局部化版本(LNCC)提供了良好的通用性
  • 联合熵,用于强度之间的非参数统计关系的联合图像直方图中的散度和(标准化)相互信息:多模态配准

联合直方图

空间多分辨率金字塔spatial multiresolution pyramids

  • 图像的多尺度表示:在小图像上有效地捕获大规模信息;传播到更细粒度的级别并细化
  • 简单的下采样/次采样会引入混叠误差
  • 先应用低通low-pass,然后向下采样:Gaussian平滑+下采样通过采样因素2是最经典的方法

用于图像配准的高斯金字塔

通常提高配准的速度、准确性和健壮性

需要真么复杂的处理么?

非常简单的形变配准算法:CURT

基于闭型解的非刚性配准算法来最大化秩相关约束Rank Correlation criterion。图像相似度和组织重叠度来的评价标准更好image similarity and tissue overlap scores。不需要仿射变换处理。

验证方法

FRE:Fiducial Registration Error配准误差基准 -配准后对应基准点之间的均方根距离

FLE:Fiducial Localisation Error定位误差基准 -定位基准点的误差

TRE:Target Registration Error配准误差目标-除了基准点以外,对应点之间的距离,这是最重要的

随着目标与基准形心的距离增加,TRE值也增加

FRE不是一个可靠的配准准确性指标(!!)

  • FRE独立于基准配置。
  • FRE与偏置误差无关(如MRI梯度、数字化仪相机失调、手持探头弯曲)。
  • TRE近似有N^{-1/2}的相关性\left \langle TRE^2(r) \right \rangle \approx \frac{\left \langle FLE^2 \right \rangle}{N}\left ( 1+\frac{1}{3} \sum_{k=1}^{3}\frac{d_k^2}{f_k^2} \right )

\left \langle FRE^2 \right \rangle:均方基准配准误差

N:基准数

d_k^2:目标点到基准配置原理轴k的距离(平方)

f_k^2:基准点与基准配置原则轴k之间的RMS(平方)。

对于基于学习的图像注册,注意事项仍然有效

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 2D-3D图像配准是将二维图像与三维模型进行匹配,实现二者之间的空间对齐。下面是一个示例的2D-3D图像配准算法代码: ``` import cv2 import numpy as np def find_homography(image1, image2): # 提取图片1和图片2的特征点 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(image1, None) kp2, des2 = sift.detectAndCompute(image2, None) # 特征点匹配 bf = cv2.BFMatcher(cv2.NORM_L2) 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) # 计算匹配点对应的坐标 src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) # 计算单应性矩阵 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) return M def render_3d_model(image, model, homography): # 根据单应性矩阵将图像中的特征点映射到模型空间中 warped_image = cv2.warpPerspective(image, homography, (model.shape[1], model.shape[0])) # 在模型空间中以特定颜色渲染图像 rendered_model = np.zeros_like(model, dtype=np.uint8) rendered_model[np.where((model == [0, 0, 0]).all(axis=2))] = warped_image[np.where((model == [0, 0, 0]).all(axis=2))] return rendered_model # 读取二维图像和三维模型 image = cv2.imread('image.jpg') model = cv2.imread('model.obj') # 进行2D-3D图像配准并渲染 homography = find_homography(image, model) rendered_model = render_3d_model(image, model, homography) # 显示配准结果 cv2.imshow('Rendered Model', rendered_model) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码通过提取图像的特征点并进行匹配,计算出单应性矩阵,将图像中的特征点映射到模型空间中,最后在模型空间中渲染图像,实现2D-3D图像配准并可视化配准结果。 ### 回答2: 2D-3D图像配准算法是将一个二维图像与一个三维模型进行对齐的过程,通常用于医学影像中的图像配准,如CT图像和MRI图像。 其中,最常用的2D-3D图像配准算法是基于体素的配准方法。其主要步骤如下: 1. 定义一个粗略的初值,通常是通过特征匹配得到的。 2. 将三维模型转换为二维图像,即生成一个虚拟的CT或MRI图像。 3. 将虚拟图像与真实二维图像进行相似度度量,比如使用互相关系数或互信息等。 4. 通过最小化相似度度量函数,调整虚拟图像在真实图像中的位置。 5. 迭代执行步骤4,直到达到收敛的准确度或最大迭代次数。 这个算法的代码实现可以使用编程语言如Python或C++等。以下是一个简单的示例代码: ```python import numpy as np import cv2 def voxel_based_registration(virtual_image, real_image, initial_pose, max_iterations=100, tolerance=1e-6): pose = initial_pose last_loss = np.inf for iteration in range(max_iterations): transformed_image = transform_image(virtual_image, pose) loss = calculate_similarity(real_image, transformed_image) if np.abs(loss - last_loss) < tolerance: break gradient = calculate_gradient(virtual_image, real_image, transformed_image) pose -= gradient last_loss = loss return pose def transform_image(image, pose): # TODO: 实现图像变换 def calculate_similarity(image1, image2): # TODO: 计算相似度度量 def calculate_gradient(image1, image2, transformed_image): # TODO: 计算梯度 # 虚拟图像,即待配准的三维模型转换成的二维图像 virtual_image = cv2.imread('virtual_image.png', 0) # 真实图像,即待配准的二维图像 real_image = cv2.imread('real_image.png', 0) # 初始化位姿 initial_pose = np.zeros((6, 1)) # 进行配准 final_pose = voxel_based_registration(virtual_image, real_image, initial_pose) ``` 需要注意的是,上述代码只是一个简单的示例,真正的2D-3D图像配准算法会根据具体需求进行优化和改进。 ### 回答3: 2D-3D图像配准算法是将一个二维图像与一个三维模型进行匹配,以实现二维图像在三维场景中的准确定位和重建。下面是一个简单的2D-3D图像配准算法的代码示例: ```python import numpy as np # 第一步:读取二维图像和三维模型数据 image = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 二维图像数据 model = np.array([[[1, 1, 1], [2, 2, 2], [3, 3, 3]], [[4, 4, 4], [5, 5, 5], [6, 6, 6]], [[7, 7, 7], [8, 8, 8], [9, 9, 9]]]) # 三维模型数据 # 第二步:图像配准的核心算法 def image_registration(image, model): # 将二维图像转换为一维数组 image_vector = image.flatten() # 计算二维图像和三维模型之间的差异度 differences = [] for i in range(len(model)): model_vector = model[i].flatten() difference = np.sum(np.abs(image_vector - model_vector)) differences.append(difference) # 找到差异度最小的序号作为匹配结果 min_index = np.argmin(differences) # 返回匹配结果 return min_index # 第三步:调用图像配准算法并输出结果 matching_result = image_registration(image, model) print("匹配结果: ", matching_result) ``` 以上代码中,假设我们有一个3x3的二维图像和一个3x3x3的三维模型。图像配准的核心算法是将二维图像转换为一维数组,并计算二维图像和三维模型之间的差异度。最后,找到差异度最小的序号作为匹配结果。 这只是一个简单的示例,实际的2D-3D图像配准算法可能更加复杂和精确,涉及更多的数学和计算机视觉技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值