【问题标题】:Image segmentation and registration using SimpleITK使用 SimpleITK 进行图像分割和配准
【发布时间】:2017-03-22 05:14:58
【问题描述】:
我对 3D 图像配准和分割有一些疑问:
加载 dicom 图像:在 DCE-MRI 中有 4000 个切片,总共 100 个堆栈,因此每个堆栈有 40 个。如何使用 GDCM simpleITK 函数将它们加载到 4D 数组
注册:注册非常简单,我们必须将所有 100 个堆栈注册到第一个堆栈。
配准精度:SimpleITK 重叠率测量或 hausdroff 距离需要分割和标记。现在,对于所有类型的图像,使用区域增长或阈值分割并不容易。假设我只想以交互方式手动选择一个区域。有可能实现吗?然后我只想使用选择的掩码进行注册准确度评估。
可视化和编写:需要使用 matplotlib 或 VTK 进行 3D 可视化。所有绘图功能都适用于 2d 切片,不需要再次在 2D 中可视化。
使用 simpleITK write Image 函数写入 dicom 图像时,对于 dicom 图像,仅写入图像对象是行不通的。我们需要将 type 更改为 UInt32 ,但是图像会变得有损。它成功写入 .mha 格式,但 imageJ 无法显示。
如果可能,请分享您的想法。
【问题讨论】:
标签:
python
image-segmentation
itk
image-registration
simpleitk
【解决方案1】:
我不确定 SimpleITK 在其默认配置中是否支持 4D 图像。如果没有,您必须在将其配置为支持维度 4(而不仅仅是 2 和 3)之后自己编译它。即使这样,我也不确定它是否会立即起作用 - DICOM 臭名昭著,让简单的事情变得不那么容易,而让复杂的事情变得超级困难。
ITK-SNAP是一个手动和人工辅助分割的工具。
可视化更像是一个 VTK 问题。这是一个使用 3D 可视化的example。
【解决方案2】:
1) GetImageFromArray,python 中的 simpleITK> 将 4d numpy 数组转换为 SimpleITK 图像。
import numpy as np
import SimpleITK as sitk
np_array = np.zeros( (a,b,c,d) )
tdim = np_array.shape[3]
slices = []
for i in range(tdim):
slices.append( sitk.GetImageFromArray( np_array[i], False ) )
im = sitk.JoinSeries(slices)
sitk.WriteImage(im, "imageresult.mha")
2) 您可以先使用 ITKsnap 或在您的 python 代码中选择您的 VOI,而不是对整个图像数据执行所有实验,您只能包含该 ROI。
3) 使用> from myshow import myshow
myshow(sitk.LabelToRGB(img), title='img')