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



我的问题有点复杂。我正在研究前列腺MRI数据集,其中包含dicom图像。当我使用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(,而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图像中也不常见。

最新更新