读取X射线DICOM图像时需注意MONOCHROME1和PixelSpacing
MONOCHROME1:像素值越大显示越黑(需反转后显示为正常灰度)
MONOCHROME2:像素值越大显示越白(直接显示)
在用SimpleITK读取DICOM图像时,MONOCHROME1会自动转为MONOCHROME2;用pydicom读取时,MONOCHROME1不会自动转换为MONOCHROME2,需自己转换。
有时候用SimpleITK的GetSpacing()获取的PixelSpacing是不正确的(不正确时往往为(1, 1),如:https://ask.csdn.net/questions/7447976),应当根据DICOM中的标签来获取PixelSpacing,用pydicom代码如下:
import numpy as np
import pydicomdef read_a_dcm_pydicom(dcm_path):pydicom_file = pydicom.read_file(dcm_path)img = pydicom_file.pixel_arrayimg = img.astype(np.float32)if pydicom_file.PhotometricInterpretation == 'MONOCHROME1':max_pixel = np.max(img)img = max_pixel - img # converting MONOCHROME1 to MONOCHROME2try:pixel_spacing = pydicom_file[0x0028, 0x0030].value # PixelSpacingpixel_spacing = [float(spacing) for spacing in pixel_spacing]except (AttributeError, KeyError):pixel_spacing = pydicom_file[0x0018, 0x1164].value # ImagerPixelSpacingpixel_spacing = [float(spacing) for spacing in pixel_spacing]return img, pixel_spacingif __name__ == '__main__':dcm_path = 'test.dcm'img, pixel_spacing = read_a_dcm_pydicom(dcm_path)
SimpleITK代码如下:
import SimpleITK as sitkdef read_a_dcm_sitk(dcm_path):sitk_file = sitk.ReadImage(dcm_path)img = sitk.GetArrayFromImage(sitk_file)[0] # (h, w)try:spacings = sitk_file.GetMetaData('0028|0030').split('\\') # PixelSpacingexcept (AttributeError, KeyError):spacings = sitk_file.GetMetaData('0018|1164').split('\\') # ImagerPixelSpacingspacings = [float(spacing) for spacing in spacings]return img, spacingsif __name__ == '__main__':dcm_path = 'test.dcm'img, pixel_spacing = read_a_dcm_sitk(dcm_path)