这里介绍通过simpleITK,实现两组图像的配准。这里具体应用场景是CT图像和MRI图像的配准。
目录
simpleITK实现的流程PipeLine
simpleITK有提供了一个配准框架,实现迭代优化。其中,本人总结了simpleITK刚性配准的实现模板,此处与大家分享。
对应代码的具体实现
配准参数的解释和设置
• 相似性度量,互信息(Mattes MI):
• 直方图分类数,50。
• 抽样百分比,1%。
• 插值器,sitkLinear。
• 优化器,梯度下降:
• 学习率,参数空间中沿遍历方向的步长,1.0。
• 迭代次数,最大迭代次数,100。
• 收敛最小值,用于结合在给定窗口大小 1e-6 中估计的相似性度量的能量分布进行收敛检查的值。
• 收敛窗口大小,用于估计相似性度量能量分布的相似性度量值的数量,10。
代码实现
下面是实现功能的python 代码
#2.【图像配准对象】
registration_method = sitk.ImageRegistrationMethod()
# 2.1Similarity metric settings.【互信息方法】
registration_method.SetMetricAsMattesMutualInformation(numberOfHistogramBins=50)
#【取样条件】
registration_method.SetMetricSamplingStrategy(registration_method.RANDOM)
registration_method.SetMetricSamplingPercentage(0.01)
#2.3【设定 插值方法 线性/临近替换/样条线】
registration_method.SetInterpolator(sitk.sitkLinear)
# 2.2 Optimizer settings.【优化器参数配置: 步长学习率,迭代次数,收敛验证的窗宽】
registration_method.SetOptimizerAsGradientDescent(learningRate=1.0, numberOfIterations=200, convergenceMinimumValue=1e-6, convergenceWindowSize=10)
#2.4 SetOptimizerScalesFromPhysicalShift【优化 平移mm 和 旋转degree 的变化尺度,】
registration_method.SetOptimizerScalesFromPhysicalShift()
# Setup for the multi-resolution framework.
#2.5【多分辨率,金字塔逼近算法】
#registration_method.SetShrinkFactorsPerLevel(shrinkFactors = [4,2,1])
#registration_method.SetSmoothingSigmasPerLevel(smoothingSigmas=[2,1,0])
#registration_method.SmoothingSigmasAreSpecifiedInPhysicalUnitsOn()
# Don't optimize in-place, we would possibly like to run this cell multiple times.
#3.1设定一个初始值【变换矩阵初始值设定】,这里简单的拿图像中心几何对齐,为初始点
registration_method.SetInitialTransform(initial_transform, inPlace=False)
# Connect all of the observers so that we can perform plotting during registration.
#4.1【添加,事件响应的 方式】这里在不同事件,触发绘图等方法
registration_method.AddCommand(sitk.sitkStartEvent, rgui.start_plot)
registration_method.AddCommand(sitk.sitkEndEvent, rgui.end_plot)
registration_method.AddCommand(sitk.sitkMultiResolutionIterationEvent, rgui.update_multires_iterations)
registration_method.AddCommand(sitk.sitkIterationEvent, lambda: rgui.plot_values(registration_method))
#5.1【执行,sitk配准对象的 内嵌Run Exe】
final_transform = registration_method.Execute(fixed_image, moving_image)
# Always check the reason optimization terminated.
print('Final metric value: {0}'.format(registration_method.GetMetricValue()))
print('Optimizer\'s stopping condition, {0}'.format(registration_method.GetOptimizerStopConditionDescription()))
配准结果显示
小结
图像配准前期的数据处理同样,simpleITK也提供了,很多做数据准备的工具。
在传统刚性基础上,也可实现非刚体配准,如Bspline 或者变形场。simpleITK也可实现。