1

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

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

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

4

1 回答 1

0

下面是一个基于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, 0, Sx],
            [F21 * dr, F22 * dc, 0, Sy],
            [F31 * dr, F32 * dc, 0, Sz],
            [0, 0, 0, 1]
        ]
    )

我只测试了标准 [1, 0, 0, 0, 1, 0] 方向的几个案例。通过进一步的测试,我很乐意将 pydicom 作为 Dataset 方法添加。这也可以扩展到 3d 仿射(使用第一个和最后一个 ImagePositionPatient),如同一链接中所述。

于 2020-08-19T00:56:45.650 回答