如何从python中的DICOM文件获取仿射信息?

问题描述

我有一个带有DICOM文件文件夹(例如CT扫描),我需要提取体积的仿射信息,因为我将生成一个遮罩,以后需要它来对齐体积和遮罩。

但是,我现在的解决方案根本不是最优的。我使用dicom2nifti软件包首先从包含DICOM文件文件夹中创建一个nifti文件,然后使用nibabel打开创建的nifti文件。然后我得到仿射信息 nii.affine(其中nii是已加载的nifti文件python对象)。
这就是为什么创建nifti文件要花很多时间的原因。

如何使用python获取仿射矩阵?

解决方法

下面是一个基于https://nipy.org/nibabel/dicom/dicom_orientation.html#dicom-affine-formula的二维单切片仿射矩阵,使用pydicom,并将pydicom数据集ds传递给该函数。

import numpy as np 

def affine2d(ds):
    F11,F21,F31 = ds.ImageOrientationPatient[3:]
    F12,F22,F32 = ds.ImageOrientationPatient[:3]

    dr,dc = ds.PixelSpacing
    Sx,Sy,Sz = ds.ImagePositionPatient

    return np.array(
        [
            [F11 * dr,F12 * dc,Sx],[F21 * dr,F22 * dc,Sy],[F31 * dr,F32 * dc,Sz],[0,1]
        ]
    )

我仅针对标准[1,0,0,0,1,0]方向测试了几种情况。经过进一步的测试,我很乐意作为数据集方法添加到pydicom中。如同一链接所述,它也可以扩展到3d仿射(使用第一个和最后一个ImagePositionPatient)。