文章目录
- 前言
- 一、常见的图像配准工具
- 1.0、ITK + VTK —— 科学界最大与最早的开源免费项目之一
- 1.1、ITK系列:ITK + SimpleITK + SimpleElastix
- 1.2、Elastix系列:Elastix + ITKElastix + PyElastix
- 二、图像配准
- 2.1、SimpleITK图像配准
- 2.2、SimpleElastix图像配准
- 2.2.1、一行代码(配准)
- 2.2.2、Rigid + affine + bspline(配准)
- 2.3、Elastix图像配准
- 2.4、ITKElastix图像配准
- 2.4.1、一行代码(配准)
- 2.4.2、rigid + affine + bspline(配准)
- 2.5、PyElastix图像配准
前言
工具配准的再开发
与可视化开发
的主要需求:
(1)转换编程语言
(2)简化配准流程简单的本质:调用默认的配准参数(即:对大多数图像都达到较好效果的参数)
(1)配准正常
:只适用于图像的复杂度不高,对比度明显、前背景的灰度强度明显等等;(2)配准异常
:需要针对每个变换模型的参数文件进行调参
(较复杂)—— 每个文件的参数最少有50+,且参数之间以及参数文件之间具有一定联系
总结:初学可以,科研不行。
一、常见的图像配准工具
图像配准(Image Registration) 用于将多幅图像或图像的不同部分进行对齐,以便在后续分析中进行比较、融合或提取信息。配准的目标是找到一个变换,将不同图像中的相应特征或区域对准,使它们在同一坐标系中重叠。广泛应用于在医学影像、遥感图像、计算机视觉等领域。
1.0、ITK + VTK —— 科学界最大与最早的开源免费项目之一
用途 | 支持语言 | 支持机构 | 应用领域 | |
---|---|---|---|---|
分析工具:ITK(Insight Segmentation and Registration Toolkit) | 用于多维图像处理、分割和配准 | C++、Python | 由美国国家卫生研究院(NIH)、美国国家计算科学研究所(NCSA) | 科学研究和医学领域(如:CT、MRI) |
可视化工具:VTK(Visualization Toolkit) | 用于3D图像处理、图像建模、体积渲染、可视化 和2D绘图。 | 主C++、部分Python封装 | 最早由美国洛斯阿拉莫斯国家实验室(LANL)发起,现在由Kitware公司维护。 | 医学、生物学、地球科学和工程学等 |
❤️ VTK资源
- 文档 Documentation:适合新老 VTK 用户的综合资源,其中包括教程、示例和最佳实践,可帮助您充分发挥 VTK 高级算法和渲染技术的全部功能。
- 教科书 Book:PDF可下载
- Python示例(代码 + 图解):在 Python 中使用 VTK
(同理示例:C#、C++、Java)
1.1、ITK系列:ITK + SimpleITK + SimpleElastix
工具 | 特点 | 平台 | 语言 | 特点 | 文档 | Github | 教程 |
---|---|---|---|---|---|---|---|
ITK | ITK是科学界最大、最早的开源项目之一 | 开源、免费、跨平台 | C++开发、支持Python接口、Java绑定访问、TCL简易接口 | 用于 N 维科学图像处理、分割和配准。 | ITK-Documentation | ITK源码 | ITK-快速入门 |
SimpleITK | 基于ITK的封装工具 | 开源、免费、跨平台 | C++、Python、Java、R、Ruby、C#、Lua和TCL | ITK的简化编程接口 | SimpleITK-Documentation | SimpleITK源码 | Jupyter示例 |
SimpleElastix | 基于SimpleITK的扩展工具(现已成为SimpleITK的一部分) | 开源、免费、跨平台 | C++、Python、Java、R、Ruby、C#、Lua 和 TCL | 只需几行代码即可完成配准任务 | SimpleElastix-Documentation | SimpleElastix源码 |
1.2、Elastix系列:Elastix + ITKElastix + PyElastix
工具 | 特点 | 平台 | 语言 | 特点 | 文档 | Github |
---|---|---|---|---|---|---|
Elastix | 基于ITK的命令行工具 | 开源、免费 | CMD命令行 | 用于刚性和非刚性图像配准 | Elastix-Documentation | Elastix源码 |
ITKElastix | 基于ITK+Elastix的封装工具 | 开源、免费 | 为Elastix提供ITK Python、JavaScript 和 WebAssembly 接口 | ITKElastix网页版应用 | ITKElastix源码 | |
PyElastix | Python封装的Elastix工具 | 开源、免费 | PyElastix源码 |
二、图像配准
2.1、SimpleITK图像配准
import SimpleITK as sitk
# (1)读取固定图像和移动图像
fixed = sitk.ReadImage(r"F:\other\fixedImage.tif", sitk.sitkFloat32)
moving = sitk.ReadImage(r"F:\other\movingImage.tif", sitk.sitkFloat32)
# (2)创建图像配准方法对象
R = sitk.ImageRegistrationMethod()
# (3)配置参数(默认参数)
####################################################################################
# 3.1、设置一个初始变换
# R.SetInitialTransform(sitk.TranslationTransform(fixed.GetDimension())) # 平移变换
# R.SetInitialTransform(sitk.AffineTransform(fixed.GetDimension())) # 仿射变换
# R.SetInitialTransform(sitk.BSplineTransform(fixed.GetDimension(), 3)) # 平移变换。BSpline阶数=3
# 3.2、创建一个复合变换(平移、仿射和插值)
composite_transform = sitk.CompositeTransform(fixed.GetDimension())
composite_transform.AddTransform(sitk.TranslationTransform(fixed.GetDimension()))
composite_transform.AddTransform(sitk.AffineTransform(fixed.GetDimension()))
composite_transform.AddTransform(sitk.BSplineTransform(fixed.GetDimension(), 3))
R.SetInitialTransform(composite_transform)
####################################################################################
# (4)开始配准
outTx_result = R.Execute(fixed, moving)
# (5)保存结果
sitk.WriteTransform(outTx_result, r'F:\other\displaceMeth1.hdf5')
sitk.WriteImage(sitk.Resample(moving, fixed, outTx_result), r'F:\other\displaceMeth1.tif')
2.2、SimpleElastix图像配准
SimpleElastix是基于SimpleITK的扩展工具(现已成为SimpleITK的一部分)
官网源码:SimpleElastix Documentation
2.2.1、一行代码(配准)
import SimpleITK as sitk
resultImage = sitk.Elastix(sitk.ReadImage("fixedImage.nii"), sitk.ReadImage("movingImage.nii"))
2.2.2、Rigid + affine + bspline(配准)
import SimpleITK as sitk
# (1)SimpleITK实例化
elastixImageFilter = sitk.ElastixImageFilter()
# (2)加载图像
elastixImageFilter.SetFixedImage(sitk.ReadImage("fixedImage.nii"))
elastixImageFilter.SetMovingImage(sitk.ReadImage("movingImage.nii"))
# (3)配置参数(默认参数)
elastixImageFilter.SetParameterMap(sitk.GetDefaultParameterMap("rigid"))
# elastixImageFilter.SetParameterMap(sitk.GetDefaultParameterMap("affine"))
# elastixImageFilter.SetParameterMap(sitk.GetDefaultParameterMap("bspline"))
# (4)开始配准
elastixImageFilter.Execute()
# (5)保存结果
sitk.WriteImage(elastixImageFilter.GetResultImage())
2.3、Elastix图像配准
(1)Elastix图像配准:原理 + 源码(详解)
(2)Elastix图像配准:参数文件(配准精度的关键)
(3)Elastix图像配准:2D图像
(4)Elastix图像配准:3D图像
(5)Elastix图像配准:点集配准(局部区域的精度微调)
(6)Elastix图像配准:可视化配准工具
2.4、ITKElastix图像配准
2.4.1、一行代码(配准)
import itk
registered_image, params = itk.elastix_registration_method(itk.imread('fixed_image.mha'), itk.imread('moving_image.mha'))
2.4.2、rigid + affine + bspline(配准)
ITKElastix:Elastix源码
################################
# run ITKElastix on MacOs
################################
from itk import itkElastixRegistrationMethodPython
import itk
from itkwidgets import compare, checkerboard
# (1)加载图像
fixed_image = itk.imread('data/CT_2D_head_fixed.mha', itk.F)
moving_image = itk.imread('data/CT_2D_head_moving.mha', itk.F)
# (2)配置参数(默认参数)
parameter_object = itk.ParameterObject.New()
default_parameter_map = parameter_object.GetDefaultParameterMap('rigid')
# default_parameter_map = parameter_object.GetDefaultParameterMap('affine')
# default_parameter_map = parameter_object.GetDefaultParameterMap('bspline')
parameter_object.AddParameterMap(default_parameter_map)
#####################################################################
# (3)开始配准
# 方法一、调用配准函数
result_image, result_transform_parameters = itk.elastix_registration_method(fixed_image, moving_image, parameter_object=parameter_object, log_to_console=False)
# 方法二、加载 Elastix 图像过滤器对象
elastix_object = itk.ElastixRegistrationMethod.New() # 创建 Elastix 配准方法对象
elastix_object.SetFixedImage(fixed_image) # 设置固定图像
elastix_object.SetMovingImage(moving_image) # 设置移动图像
elastix_object.SetParameterObject(parameter_object) # 设置参数对象(包含配准算法的参数)
elastix_object.SetLogToConsole(False) # 设置是否在控制台输出日志信息(可选)
elastix_object.UpdateLargestPossibleRegion() # 更新过滤器对象
result_image = elastix_object.GetOutput() # 获取配准后的图像结果
result_transform_parameters = elastix_object.GetTransformParameterObject() # 获取配准后的变换参数
#####################################################################
# (4)可视化结果
checkerboard(fixed_image, result_image, pattern=5) # 以棋盘形式比较固定图像和配准结果
compare(fixed_image, result_image, link_cmap=True) # 以对比方式显示固定图像和配准结果
2.5、PyElastix图像配准
import pyelastix
# 假设 im1 和 im2 是你的输入图像
# 获取默认参数
params = pyelastix.get_default_params()
# 设置配准的参数
params.MaximumNumberOfIterations = 200
params.FinalGridSpacingInVoxels = 10
# 进行图像配准
im1_deformed, field = pyelastix.register(im1, im2, params)
# im1_deformed 是配准后的图像
# field 是配准变换的场(transform field),可用于进一步分析或可视化