使用 pydicom 和 sitk 加载 dicoms 会产生不同的输出

loading dicoms with pydicom and sitk results different outputs

我的问题有点复杂。我正在研究包含 dicom 图像的 Prostate MRI 数据集。当我使用 Simple ITK 加载 dicom 文件时,输出 numpy 数组的数据类型将为 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),而SimpleITK做一些预处理(很可能应用LUT) 和 returns 处理后的数据作为浮点数组。

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 图像中也不是很常见。