• simpleitk打开dicom文件


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

    本文就简单总结一下我们在处理这些图像时的经验,以便备忘,并为后来者参考。

    1.读取文件

    读取DICOM序列

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

    1. import SimpleITK as sitk
    2. import numpy as np
    3. reader = sitk.ImageSeriesReader()
    4. dicom_names = reader.GetGDCMSeriesFileNames(case_path)
    5. reader.SetFileNames(dicom_names)
    6. image = reader.Execute()
    7. image_array = sitk.GetArrayFromImage(image) # z, y, x
    8. origin = image.GetOrigin() # x, y, z
    9. spacing = image.GetSpacing() # x, y, z

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

    读取DICOM单张图片

    可以将一个DICOM序列作为一个整体一次读入,也可以一张一张地读入每张切片:

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

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

    读取mhd文件

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

    1. import SimpleITK as sitk
    2. import numpy as np
    3. image = sitk.ReadImage(mhd_path)
    4. image_array = sitk.GetArrayFromImage(image) # z, y, x
    5. origin = image.GetOrigin() # x, y, z
    6. ...

    有时候不想整个读取数据(因为比较大,读取处理比较慢),想要读取的只是一些基本信息,比如origin、spacing等等。这时可以只读取mhd文件,据此获取信息,读取方法比较简单,不再赘述。

    2.处理文件

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

    插值

      1. import SimpleITK as sitk
      2. reader = sitk.ImageSeriesReader()
      3. dicom_names = reader.GetGDCMSeriesFileNames(case_path) reader.SetFileNames(dicom_names)
      4. image = reader.Execute()
      5. resample = sitk.ResampleImageFilter()
      6. resample.SetOutputDirection(image.GetDirection())
      7. resample.SetOutputOrigin(image.GetOrigin())
      8. newspacing = [1, 1, 1]
      9. resample.SetOutputSpacing(newspacing)
      10. newimage = resample.Execute(image)
  • 相关阅读:
    2017年9月22日 关于JS数组
    2017年9月20日
    2017年9月19日 JavaScript语法操作
    2017年9月18日
    2017年9月17日 JavaScript简介
    2017年9月16日
    2017年9月15日
    2017年9月14日
    2017年9月12日
    贪吃蛇全文
  • 原文地址:https://www.cnblogs.com/yanghelin/p/8708553.html
Copyright © 2020-2023  润新知