偶然遇到如下问题:使用pydicom读取CT值和SimpleITK读取数据结果不一致, 读取方式如下
import pydicom
df = pydicom.dcmread(data_path, force=True)
df.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian
data_array = df.pixel_array
import SimpleITK as sitk
# 读取同一目录下多个dicom, 再组合成三维数据
dicomsPath = 'work/data/dicom/PATIENT_DICOM' #这是dicom文件所在的目录路径
sitkImage = sitk.ReadImage(dicomsPath)
npImage = sitk.GetArrayFromImage(sitkImage)
用两种方式读取数据后, pydicom读取的array, 取值都大于0, 用SimpleITK读取的array, 结果有正有负, 使用ITK- SNAP软件打开dicom文件, 查看取值和SimpleITK一致, 故怀疑是使用pydicom读取后的值发生了转换, 经排查是dicom文件中的RescaleIntercept和RescaleSlope属性会影响到最终的HU值
HU = pixel_val * slope + intercept
在使用pydicom读取dicom文件时, 如果Slope为1,Intercept为0,HU值则不需要转化, 否则需要使用如上公式转换
故使用pydicom读取数据时, 正确代码如下:
import pydicom
df = pydicom.dcmread(data_path, force=True)
df.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian
data_array = df.pixel_array
# HU = pixel_val * slope + intercept
RescaleIntercept = df.data_element('RescaleIntercept').value # 窗宽
RescaleSlope = df.data_element('RescaleSlope').value # 窗宽
data_array = data_array * RescaleSlope + RescaleIntercept