文章目录
写在前面
Elastix
是一种常用的配准软件,而SimpleElastix
则综合了Elastix
工具和SimpleITK
库,它是一个功能强大的Python版配准工具包。然而,我们不能通过pip、conda等命令直接获取这个工具包,而是需要自己动手进行编译与安装。
本文将以Windows系统为例,对SimpleElastix
的安装流程进行总结,最后将给出该工具包的一个Demo。
Python | 生成工具 | 编译器 | 操作系统 |
---|---|---|---|
3.6.15 | CMake 3.x.x | Visual Studio 2015 | Win10 / Win11 |
注:此处中给出的只是笔者所用的环境配置,仅供参考
1. 编译安装
1.1. 准备各种环境
(1)准备较低版本的Python环境
- 建议用Anaconda专门为其创建一个新环境:
conda create -n py36 python=3.6.15
- 请不要提前安装
SimpleITK
pip uninstall SimpleITK
- 请记得更新
virtualenv
pip install --upgrade virtualenv
(4)准备好Visual Studio,建议使用VS2015:
- 从此处下载VS2015 U3安装包:
- 进入安装程序,勾选“Win10 SDK”以及“ATL/MFC SDK”并安装:
1.2. 使用CMake构建项目
(1)使用Git工具下载SimpleElastix项目
git clone https://github.com/kaspermarstal/SimpleElastix
注意:直接从Github网站下载Zip包进行编译可能会出错
(2)在第一个框内输入SimpleElastix/SuperBuild
所在路径,在第二个框内输入自定义的输出路径
(3)在搜索框内输入“python”,并勾选“Advanced”;在搜索结果中找到PYTHON_EXECUTABLE
、PYTHON_INCLUDE_DIR
、PYTHON_LIBRARY
,并根据环境安装位置修改常量的值:
(4)点击“Generate”生成项目文件,生成的文件可在第2步的输出路径中可找到:
1.3. 使用VS编译项目
(1)以管理员身份运行Visual Studio的“Native Tools Command Prompt”,并进入到生成文件所在路径
(2)运行下面的命令并等待执行完成,整个过程大约需要2h
msbuild ALL_BUILD.vcxproj /p:Configuration=Release
1.4. 安装SimpleElastix
(1)以管理员身份运行cmd,进入到生成的SimpleITK-build/Wrapping/Python
路径下(如果你有多个Python环境,请一定记得切换Python环境)
(2)运行下面的命令并等待执行完成,整个过程大约需要几分钟:
python Packaging\setup.py install
(3)检查安装是否成功(如果它没报错,就说明安装成功了):
import SimpleITK as sitk
filter = sitk.ElastixImageFilter()
1.5. 可能遇到的问题
(1)因访问Github超时而导致的编译错误
因为VS编译此项目需要从Github上下载文件,这个过程可能会出现访问超时现象。如果出现这类报错,可以多编译几次试试
(2)error C2169: “lrintf”: 内部函数,不能定义
当我们使用比VS2015更新的编译器进行编译时,编译器会提示这个错误,这是因为我们下载的ITK包中的“OpenJPEG”太旧了,我们可以自行从Github中下载相应文件并替换上去,然后重新编译
(3)TypeError: expected str, bytes or os.PathLike object, not int
请记得将
virtualenv
更新,并且不要提前安装SimpleITK
2. 使用案例
import SimpleITK as sitk # SimpleElastix
from typing import Union
def elastix_register(fixed_img: Union[sitk.Image, str],
moving_img: Union[sitk.Image, str],
param_map: Union[sitk.VectorOfParameterMap, str] = None):
if isinstance(fixed_img, str):
fixed_img = sitk.ReadImage(fixed_img)
if isinstance(moving_img, str):
moving_img = sitk.ReadImage(moving_img)
if isinstance(param_map, str):
param_map = sitk.ReadParameterFile(param_map)
elif param_map is None:
param_map = sitk.GetDefaultParameterMap("affline") # 默认仿射配准
resampler = sitk.ElastixImageFilter()
resampler.SetFixedImage(fixed_img) # 设置固定图像
resampler.SetMovingImage(moving_img) # 设置待配准图像
resampler.SetParameterMap(param_map) # 设置配准方法的参数
resampler.LogToConsoleOn() # 控制台打印配准日志
resampler.Execute()
reg_img: sitk.Image = resampler.GetResultImage() # 配准结果
return reg_img
写在最后
- 如果您发现项目存在问题,或者如果您有更好的建议,欢迎在下方评论区中留言讨论~
- 这是我的个人主页:个人主页 - AI Studio,来AI Studio互粉吧,等你哦~
- 【友链滴滴】欢迎大家随时访问我的个人博客~