0

我的问题有点连线。我正在研究包含 dicom 图像的前列腺 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
4

1 回答 1

2

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

pydicom中,要获得适合显示的数据,您必须自己应用一些查找表,通常是图像附带的那个。

如果您有一个模态 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 图像中也不是很常见。

于 2021-12-23T08:18:56.760 回答