写在前面

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专门为其创建一个新环境:
1
conda create -n py36 python=3.6.15
  • 请不要提前安装SimpleITK
1
pip uninstall SimpleITK
  • 请记得更新virtualenv
1
pip install --upgrade virtualenv

(2)安装CMakeGit,各版本均可

(3)准备好Visual Studio,建议使用VS2015:

  • 此处下载VS2015 U3安装包:
  • 进入安装程序,勾选“Win10 SDK”以及“ATL/MFC SDK”并安装:

1.2. 使用CMake构建项目

(1)使用Git工具下载SimpleElastix项目

1
git clone https://github.com/kaspermarstal/SimpleElastix

注意:直接从Github网站下载Zip包进行编译可能会出错

(2)在第一个框内输入SimpleElastix/SuperBuild所在路径,在第二个框内输入自定义的输出路径

(3)在搜索框内输入“python”,并勾选“Advanced”;在搜索结果中找到PYTHON_EXECUTABLEPYTHON_INCLUDE_DIRPYTHON_LIBRARY,并根据环境安装位置修改常量的值:

(4)点击“Generate”生成项目文件,生成的文件可在第2步的输出路径中可找到:

1.3. 使用VS编译项目

(1)以管理员身份运行Visual Studio的“Native Tools Command Prompt”,并进入到生成文件所在路径

(2)运行下面的命令并等待执行完成,整个过程大约需要2h

1
msbuild ALL_BUILD.vcxproj /p:Configuration=Release

1.4. 安装SimpleElastix

(1)以管理员身份运行cmd,进入到生成的SimpleITK-build/Wrapping/Python路径下(如果你有多个Python环境,请一定记得切换Python环境)

(2)运行下面的命令并等待执行完成,整个过程大约需要几分钟:

1
python Packaging\setup.py install

(3)检查安装是否成功(如果它没报错,就说明安装成功了):

1
2
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. 使用案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

写在最后

  • 如果您发现项目存在问题,或者如果您有更好的建议,欢迎在下方评论区中留言讨论~