【问题标题】:How to get affine information from a DICOM file in python?如何从 python 中的 DICOM 文件中获取仿射信息?
【发布时间】:2020-08-17 12:49:02
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为问题在于将文件读取为“本机 DICOM”,而不像当前那样将其转换为 NIFTI。
  • 我建议查看 nibabel 源代码 - 它应该是 ImagePositionPatient、ImageOrientationPatient、GridFrameOffsetVector 或其他的某种组合。如果有人可以为 pydicom 编写 Dataset.affine() 函数,我很乐意将其合并。
  • 我使用 pydicom 基于nipy.org/nibabel/dicom/… 创建了仿射代码。如果问题被重新打开,我可以发布它。
  • 我投票重新提出这个问题,因为在 DICOM 的上下文中,OP 的要求非常清楚(尤其是在@darcymason 的编辑获得批准之后)。
  • @darcymason - 问题重新打开,你可以继续 :)

标签: python pydicom nifti medical-imaging


【解决方案1】:

下面是一个基于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),如同一链接中所述。

【讨论】:

  • 我想这作为数据集属性/方法会有点奇怪,因为偏移量对于卷的不同切片会有所不同(因此 affine2d 会为相同卷的切片产生不同的结果),整个 4x4 矩阵更像是体积的属性,而不是数据集的(单片)。
  • 是的,我意识到,在我发布之后,正如我注意到完整的仿射需要第一个和最后一个切片,因此必须保留一个单独的函数,或者作为一个新对象将切片收集在一起的方法。
猜你喜欢
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多