【发布时间】:2020-12-29 17:30:31
【问题描述】:
我正在尝试使用 SimpleItk 库从 DICOM 格式的 CTA 中提取所有三个视图(轴向、矢状和冠状)。
我可以从给定目录中正确读取该系列:
...
import SimpleITK as sitk
...
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(input_dir)
reader.SetFileNames(dicom_names)
# Execute the reader
image = reader.Execute()
...
然后,使用 this questions 中所述的 numpy 数组,我可以提取并保存 3 个视图。
...
image_array = sitk.GetArrayFromImage(image)
...
for i in range(image_array.shape[0]):
output_file_name = axial_out_dir + 'axial_' + str(i) + '.png'
logging.debug('Saving image to ' + output_file_name)
imageio.imwrite(output_file_name, convert_img(image_array[i, :, :], axial_min, axial_max), format='png')
...
另外两个是通过保存image_array[:, i, :]和image_array[:, :, i]制作的,而convert_img(..)是一个只转换数据类型的函数,所以不会改变任何形状。
但是,冠状和矢状视图被拉伸、旋转并带有宽黑色带(在某些切片中它们非常宽)。
这是 Slicer3d 的屏幕截图:
虽然这是我的代码的输出:
轴向
矢状面
冠状动脉
图像形状为 512x512x1723,这导致轴向 png 为 512x512 像素,冠状和矢状为 512x1723,因此这似乎是正确的。
我应该尝试使用 PermuteAxes 过滤器吗?问题是我找不到任何关于它在 python 中使用的文档(由于文档页面中的 404 而不是其他语言)
还有办法提高对比度吗?我使用了 simpleitk 的 AdaptiveHistogramEqualization 过滤器,但它比 Slicer3D 可视化效果差得多,而且速度很慢。
感谢您的帮助,谢谢!
【问题讨论】:
-
问题是你没有考虑体素大小,它在 x/y 和 z 方向上是不同的。您可以从
Pixel Spacing获得 x/y 的大小,从Spacing Between Slices获得 z 大小(如果可用),否则从相邻切片之间的Image Position Patient差异获得。 -
感谢您的回答。我会尝试根据你的提示做一些事情。你能给我一些参考吗?我是处理 dicom 图像的新手,看起来相当复杂!
-
嗯,参考是DICOM standard,但它很大,需要一些习惯。您可以先查看this related question 关于体素大小的信息。
-
再次感谢,我会从那里开始。我还将尝试其他库,因为 SimpleItk 文档非常混乱......
标签: python numpy imaging simpleitk medical-imaging