介绍
在医疗领域工作时,可以使用两种类型的文件。第一个是 dicom
文件,这些文件代表您希望研究的身体部位的2D 切片。然后是身体的3D 表示,它是由多个 dicom
甚至常规图像或数组构建的 2D 切片的集合。
在之前的文章中,我们讨论了dicom
和 nifti
之间的区别,以及如何从 dicoms
创建 nifti
文件。因此,在本文中,我们将讨论如何从标准数组生成这些 nifti
文件。
为什么我们需要进行这种转换?
您可能想知道为什么我们需要执行这样的转换。答案如下:
- 如果您有普通的
JPG 或 PNG
图像,则可以使用它们,然后将其转换为dicoms
,然后再转换为nifti
,但是您可以看到这需要两个步骤。因此,当您使用本文中的方法时,将图像从JPG或PNG
转换为nifti
将会更容易。
+它们可以是代表卷的CSV文件,正如我们在许多数据集中发现的那样,因此如果您需要将它们放在一个单独的nifti
文件中并希望在特殊情况下使用,您可以使用本文中描述的方法。 - 最常用的方法,也是在我的项目中需要的方法,是当你执行一个分割任务时,你必须将输出掩码保存为一个单一的nifti文件;对于这个,这个方法将是你的解决方案。
您需要的工具
您将需要两个库来完成此任务:numpy
和nibabel
。Nibabel
是专门为 nifti
扩展而设计的库,但是转换数组/nifti
需要一个 numpy 数组作为输入。
要安装它们,您可以像往常一样使用 pip(或 conda):
pip install numpy
pip install nibabel
方法
您必须完成此过程的两个步骤:
- 第一步,将你拥有的任何类型的数组转换为
numpy
数组;如果您拥有的数组表示图像,则必须指定数据类型,例如图像的float
类型和掩码的int
类型(如果您正在进行分割,掩码也可以是float
类型)。
converted_array = numpy.array(normal_array, dtype=numpy.float32)
我选择float32
作为类型,因为我需要它,但你可以使用任何你需要的类型。
- 第二步,使用一行代码将
numpy
数组转换成nifti
文件。在nibabel
库中,有一个名为Nifti1Image
的函数,它接受 5 个参数,其中三个是可选的,另外两个是必需的。在我的例子中,前两个参数就足够了,但是如果你需要更多,你可以添加它们。第一个参数是我们刚刚转换的numpy
数组,第二个参数是仿射,它是一个齐次仿射,提供体素坐标(像素的3D表示)和世界坐标(来自文档)之间的关系。第二个参数可以是None
或4×4
数组;出于我们的目的,我们将使用由numpy.eye
函数创建的4×4
数组。
现在不需要其他参数,但稍后可能需要一个:header
。如果您有文件头,则此参数将采用文件头。这是元数据(患者和图像信息)。
nifti_file = nibabel.Nifti1Image(converted_array, affine) 其中, affine = numpy.eye(4)
。
您的 nifti 文件现在可以使用了;您可以立即使用或保存以备后用。
nibabel
库中另一个名为save
的命令可用于保存文件。nibabel.save(nifti_file, path_to_save)
这是完整的脚本:
import numpy as np
import nibabel as nib
converted_array = numpy.array(normal_array, dtype=numpy.float32) # You need to replace normal array by yours
affine = numpy.eye(4)
nifti_file = nibabel.Nifti1Image(converted_array, affine)
nibabel.save(nifti_file, path_to_save) # Here you put the path + the extionsion 'nii' or 'nii.gz'
我希望您觉得这篇文章有用,因为在下一篇文章中讨论3D体积的数据增强时,我们将需要这些转换。