Python下使用SimpleITK处理DICOM文件

背景

随着最近几大肺部图像处理相关的竞赛的推出,如LUNA16、Kaggle Data Science Bowl,AI领域的科研人员对肺部CT图像变得越来越熟悉,尤其是DICOM序列,以及这些竞赛官方所提供的mhd数据格式。

ITK是一个功能很强大的医学图像处理公开库,搭配VTK用以显示图像,可以实现几乎所有医学图像处理的功能需要。ITK通常以C++包进行提供,当然也可以自己编译为Python包,不过编译过程比较繁琐耗时,而且很容易踩坑。但ITK官方进行的Python封装SimpleITK,则直接可以拿来使用;虽然有部分ITK的功能没有包含,但已基本够用了。我们在处理医学图像时,使用的基本都是SimpleITK。

本文在此做一个简单的总结:

读取文件

读取DICOM文件

医学图像中一个CT序列包含很多张图片,即一个case包含许多slice,使用SimpleITK可以直接读取一个序列,并方便地得到各种参数,将图像数据转换成numpy Array:

import SimpleITK as sitk
import numpy as np
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(case_path)
reader.SetFileNames(dicom_names)
image = reader.Execute()
image_array = sitk.GetArrayFromImage(image) # z, y, x
origin = image.GetOrigin() # x, y, z
spacing = image.GetSpacing() # x, y, z

需要注意的是,SimpleITK读取的图像数据的坐标顺序为zyx,即从多少张切片到单张切片的宽和高;而据SimpleITK Image获取的origin和spacing的坐标顺序则是xyz。这些需要特别注意。

读取DICOM单张图片

根据实际情况,可以将一个DICOM序列作为一个整体一次读入,也可以一张一张地读入每张切片,:

import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(slice_path)
image_array = sitk.GetArrayFromImage(image) # z, y, x

这里需要注意的除了坐标顺序是zyx之外,还需注意,即使读取单张切片,所得到的结果也是3维的,只不过第一维是1。

读取mhd文件

涉及DICOM序列时,为了传输方便(从上百个dcm文件到一个mhd文件),很多情况下以mhd文件格式进行呈现,不过mhd文件只是一个很小的包含数据信息的文件,同时搭配的通常还有一个二进制的数据文件(格式为raw或zraw等)。使用SimpleITK读取这种文件也比较方便。

import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(mhd_path)
image_array = sitk.GetArrayFromImage(image) # z, y, x
origin = image.GetOrigin() # x, y, z

处理文件

处理DICOM文件主要有插值等操作,可以直接使用SimpleITK(或者说是ITK)的相关函数,并通过pipeline结构进行处理。

插值

import SimpleITK as sitk
reader = sitk.ImageSeriesReader()
dicom_names = reader.GetGDCMSeriesFileNames(case_path) reader.SetFileNames(dicom_names)
image = reader.Execute()
resample = sitk.ResampleImageFilter()
resample.SetOutputDirection(image.GetDirection())
resample.SetOutputOrigin(image.GetOrigin())
newspacing = [1, 1, 1]
resample.SetOutputSpacing(newspacing)
newimage = resample.Execute(image)

其他


参考文章:
Python下使用SimpleITK处理DICOM文件备忘

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用SimpleITK库导入DICOM文件并生成STL文件,您可以按照以下步骤操作: ```python import SimpleITK as sitk import vtk def dicom_to_stl(dicom_dir, output_stl): # 读取DICOM序列 reader = sitk.ImageSeriesReader() dicom_names = reader.GetGDCMSeriesFileNames(dicom_dir) reader.SetFileNames(dicom_names) image = reader.Execute() # 使用Marching Cubes算法提取表面 surface_extractor = sitk.MarchingCubes() surface_extractor.SetInput(image) surface_extractor.SetValue(0, 1000) # 根据实际需求设置阈值 # 将表面转换为vtk数据类型 surface = surface_extractor.GetOutput() surface_array = sitk.GetArrayFromImage(surface) vtk_data = vtk.vtkImageData() vtk_data.SetDimensions(surface_array.shape[::-1]) vtk_data.AllocateScalars(vtk.VTK_UNSIGNED_CHAR, 1) vtk_data.GetPointData().SetScalars(vtk.util.numpy_support.numpy_to_vtk(surface_array.ravel(), deep=True)) # 使用vtkSTLWriter将表面写入STL文件 stl_writer = vtk.vtkSTLWriter() stl_writer.SetFileName(output_stl) stl_writer.SetInputData(vtk_data) stl_writer.Write() dicom_dir = "path/to/dicom/files" output_stl = "path/to/output.stl" dicom_to_stl(dicom_dir, output_stl) ``` 请确保您已经安装了SimpleITK和vtk库。在代码中,您需要将`dicom_dir`替换为包含DICOM文件的目录的路径,并将`output_stl`替换为要生成的STL文件的路径。 与之前的代码示例相比,这里使用SimpleITK库而不是pydicom库来读取DICOM文件。然后,我们使用SimpleITK的Marching Cubes算法提取表面,并将表面数据转换为vtk数据类型,最后使用vtkSTLWriter将表面写入STL文件。 请注意,阈值的设置可能需要根据您的DICOM文件的实际情况进行调整。 希望对您有帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值