【问题标题】:loading dicoms with pydicom and sitk results different outputs用 pydicom 和 itk 加载 dicom 会产生不同的输出
【发布时间】:2021-12-23 07:36:47
【问题描述】:

我的问题有点牵强。我正在处理包含 dicom 图像的 Prostate MRI 数据集。当我使用 Simple ITK 加载 dicom 文件时,输出 numpy 数组的 dtype 将为 float64 。但是当我使用 pydicom 加载相同的 dicom 文件时,输出 numpy 数组的 dtype 将是 uint16 问题不只是这个。使用不同的模块时,像素强度会有所不同。所以我的问题是为什么它们看起来不同,哪一个是正确的,为什么这些模块以不同的方式加载数据? 这是我用来加载 dcm 文件的代码。

import pydicom
import SimpleITK as sitk

path = 'dicoms/1.dcm'


def read_using_sitk():
    reader = sitk.ImageFileReader()
    reader.SetFileName(path)
    image = reader.Execute()
    numpy_array = sitk.GetArrayFromImage(image)
    return numpy_array.dtype


def read_using_pydicom():
    dataset = pydicom.dcmread(path)
    numpy_array = dataset.pixel_array
    return numpy_array.dtype

【问题讨论】:

  • pydicom 加载保存在数据集中的原始数据(MR 为 uint16);为了显示,apply the Modaility and VOI LUT 也是有意义的。我不知道 SimpleITK 做了什么,但显然它做了某种转换(可能应用了 LUT),因为输出是一个浮点数组。
  • 非常感谢。应用模态之后,它们看起来一样!顺便说一句,您的链接在其字符串的末尾需要一个“L”! :)))
  • 请写下答案,以便我接受。

标签: python pydicom simpleitk mri


【解决方案1】:

不同之处在于pydicom加载保存在数据集中的原始数据(对于MR数据通常为uint16),而SimpleITK进行一些预处理(很可能应用LUT)并返回处理后的数据作为一个浮点数组。

pydicom中,要获取适合展示的数据,你必须自己申请一些lookup table,通常是图片自带的。

如果您有一个模态 LUT(对于 MR 数据不是很常见),您首先必须使用 apply_modality_lut 应用它,而对于 VOI LUT,您使用 apply_voi_lut。这将应用数据集中的模态和 VOI LUT:

ds = dcmread(fname)
arr = ds.pixel_array
out = apply_modality_lut(arr, ds)
display_data = apply_voi_lut(out, ds, index=0)

即使数据集中不存在模态或 VOI LUT,也可以节省使用 - 在这种情况下,仅返回输入数据。
请注意,DICOM 图像中可能有多个 VOI LUT,例如用于显示不同种类的组织 - 因此 index 参数,尽管这在 MR 图像中也不是很常见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2014-05-06
    • 2014-08-24
    相关资源
    最近更新 更多