Nifti1文件格式

Predefined dimensions for space and time(预定义的空间和时间维度)

在Nifti格式中,前三个维度保留用于定义三个空间维度——x、y和z,而第四个维度保留用于定义时间点——t。其余维度(从第五个到第七个)用于其他用途。然而,第五维仍然可以具有一些预定义的用途,例如存储体素特定的分布参数或保存基于矢量的数据。

Overview of the header structure(头结构的概述)

为了保持与Analyze格式的兼容性,Nifti头部的大小与旧格式一样保持在348字节。一些字段被重用,一些字段被保留,但被忽略,一些字段被完全覆盖。下表显示了每个字段、它们的大小和简要说明。关于应该如何解释每个字段的更多细节将在下面进一步提供。
在这里插入图片描述
注:对于x分布,当p1=1时,为半正态分布;当p1=2时,为瑞利分布;当p1=3时,为Maxwell-Boltzmann分布。其他意图代码可用来表明文件包含的数据不是统计性质的。
在这里插入图片描述
intent parameters存储在字段float intent_p1、float intent_p2和float intent_p3中。或者,如果每个体素的参数不同,则它们应该存储在文件的第五维中。人类可读的intent name可以存储在字段char intent_name[16]中,当数据不能或没有使用上述任何意图代码和参数进行编码时,这可能有助于解释数据的intention。

Data type and bits per pixel/voxel(数据类型和每像素/体素的比特)

字段int datatype指示存储的数据的类型。可接受的值包括:
在这里插入图片描述
字段short bitpix保存每个体素的比特数的信息。该值必须与如上所示的由数据类型确定的类型相匹配。

Slice acquisition information(切片采集信息)

字段char slice_code、short slice_start、short slice_end和float slice_duration对于存储有关fMRI采集时序的信息很有用,需要与包含字段slice_dIM的char dim_info一起使用。当且仅当slice_dim不同于零时,slice_code被解释为:
在这里插入图片描述
字段short slice_start和short slice_end分别表明了哪些是对应于实际MRI采集的第一个和最后一个切片。图像中存在的超出此范围的切片将被视为填充切片(例如,包含零)。字段float slice_duration表示获取单个切片所需的时间量。在单独的字段中具有该信息允许正确地存储实验的图像,其中slice_duration*dim[slice_dim]小于存储在Pixdim[4]中的值,通常是重复时间(TR)。
在这里插入图片描述
切片代码,用于指定切片采集定时。在本例中,slice_start=2和slice_end=11,表示存储在文件中的切片#01和#12没有真正使用MRI获取,而是被填充到文件中。字段slice_duration指定获取每个切片所需的时间。对应于切片采集的维度(在本例中为dim[3],z)在字段dim_info中编码。

Voxel dimensions

每个体素的维度存储在字段float pixdim[8]中,每个元素与其各自的short dim[8]相匹配。但是,float pixdim[0]中的值具有特殊含义,如下所述;它应始终为-1或1。前4个维度的测量单位在字段xyzt_unit中指定,如下所述。

Voxel offset

对于单个文件(.nii),int vox_offset字段指示成像数据开始之前的字节偏移量。为了与旧软件兼容,可能的值是16的倍数,最小值是352(大于348的16的最小倍数)。对于文件对(.hdr/.img),如果除图像数据本身以外的任何信息都不会存储在.img中(最常见),则应将其设置为零,但它也可以大于零,从而允许将用户定义的额外信息预先添加到.img中,如dicom标题。然而,在这种情况下,最终可能会违反16的倍数的规则。此字段为浮点型(32位,IEEE-754),允许指定最多224的整数。使用float而不是更自然的选择int的原因是为了与Analyze格式兼容。

Data scaling

存储在每个体素中的值可以线性缩放到不同的单位。字段float scl_slope和float scl_inter定义线性函数的斜率和截距。数据扩展功能允许在比数据类型所允许的范围更广的范围内进行存储。但是,可以在相同的数据类型中使用缩放。对于RGB数据的存储,这两个缩放字段都应该被忽略。对于复杂类型,它应该同时应用于实部和虚部。

Data display

对于存储标量(非向量)数据的文件,字段float cal_min和float cal_max确定打开图像时的预期显示范围。等于或低于cal_min的体素值应显示为色标中的最小颜色(在灰度可视化中通常为黑色),等于或大于cal_max的值应显示为色标中的最大颜色(通常为白色)。

Measurement units

用于维度dim[1]到dim[4] (以及分别用于pixdim[])的空间和时间测量单位都在字段char xyzt_unit中编码。位1-3用于存储空间维度,位4-6用于时间维度,并且不使用位6和7。可以在字段float toffset中指定时间偏移量。xyzt_unit的代码(以十进制表示)为
在这里插入图片描述

Description

此字段char description p[80]可以包含最多80个字符的任何文本。该标准没有指定该字符串是否需要以空字符结尾。想必,这取决于应用程序是否正确地处理它。

Auxiliary file

可以在char aux_file[24]字段中指定包含额外信息的补充文件。例如,该文件可以包含网格的面索引,这些点存储在第五维中,或者包含用于显示颜色的查找表。

Orientation information

与以前的Analyze格式相比,Nifti格式最明显的改进是能够明确地存储信息方向。文件标准假设体素坐标指的是每个体素的中心,而不是它的任何角点。假设世界坐标系为RAS:+x表示向右,+y表示向前,+z表示向上,这与Analyze中使用的坐标系LAS完全不同。该格式提供了三种不同的方法来将体素坐标(i,j,k)映射到世界坐标(x,y,z)。第一种方法仅允许与分析格式兼容。另外两种方法可以共存,并传递不同的坐标系。这些系统在字段short qform_code和short sform_code中指定,它们可以采用表中指定的值:
在这里插入图片描述
原则上,qform_code(下面的方法2)应该包含0、1或2,而sform_code(下面的方法3)可以包含表中所示的任何代码。
Method1
Method1用于与Analyze兼容,并且不应该用作主要取向方法。世界坐标仅通过缩放体素大小来确定:
在这里插入图片描述
Method2
Method2在short qform_code大于零时使用,旨在以类似于dicom header中指定的坐标的方式指示扫描仪坐标。它还可以用于表示图像与同一对象的前一个会话的对齐(例如用于共同配准)。为简洁起见,该字段中的信息以四元数(a,b,c,d)的形式存储,后三个系数位于字段float quatern_b、float quatern_c、float quatern_d中。第一个系数可以从其他三个中在这里插入图片描述
计算出来。这些字段用于构建旋转矩阵,如下所示:
在这里插入图片描述
该旋转矩阵与体素大小和平移向量一起用于定义从体素到世界空间的最终变换:
在这里插入图片描述
q是qfac值,存储在其他未用的单元pixdim[0]中,只能为1或者-1.任何其他的值都被当做1.
Method 3
当short sform_code大于零时使用Method 3。它依赖于存储在字段float srow_*[4]中的完整仿射矩阵来将体素映射到世界坐标:
在这里插入图片描述
与假设包含将体素索引映射到扫描仪世界坐标或在同一对象的两个不同图像之间对齐的变换的Method2不同,方法3用于指示到诸如Talairach或MNI坐标的某些标准世界空间的变换,在这种情况下,坐标系的原点(0,0,0)在大脑的前部。
读取affine矩阵的代码:


```python
import nibabel as nib
# paths_to_origin是存储nii.gz文件的路径
sample['affine'] = read_data(paths_to_origin, False).affine

 def read_data(path_to_nifti, return_numpy=True):
        """Read a NIfTI image. Return a numpy array (default) or `nibabel.nifti1.Nifti1Image` object"""
        if return_numpy:
            return nib.load(str(path_to_nifti)).get_fdata()
        return nib.load(str(path_to_nifti))

结果展示:
在这里插入图片描述

Magic string

char magic[4]字段是一个“魔术”字符串,它声明文件符合Nifti标准。它被放置在header的最末尾,以避免覆盖Analyze格式所需的字段。但是,理想情况下,应该首先检查此字符串。对于.hdr/.img对,它应该是‘n+1’(或十六进制的‘6E 69 31 00’),对于.nii单个文件,它应该是‘n+1’(或‘6E 2B 31 00’)。如果没有此字符串,则应将该文件视为Analyze。Nifti格式的未来版本可能会将字符串递增到‘n+2’、‘n+3’等。事实上,截至2012年,第二个版本正在准备中。

Unused fileds

Nifti格式不使用char data_type[10]、char db_name[18]、int extents、short session_error和char regular字段,但它们包含在header中,以便与Analyze兼容。区段应该是整数16384,规则应该是字符‘r’。字段int glmin和int glmax分别指定分析格式中整个数据集的最小值和最大值。

Storing extra-information

在标准允许的情况下,可以通过多种方式将额外信息包含在Nifti格式中。在header的末尾,下4个字节(即,从字节349到352,包括349到352)可能存在于.hdr文件中,也可能不存在。但是,这些字节将始终存在于.nii文件中。它们应该解释为字符数组,即char extension[4]。原则上,这4个字节应该全部设置为零。如果第一个extension[0]非零,则表示存在从字节号353开始的扩展信息。此类扩展信息的大小需要是16的倍数。此扩展的前8个字节应解释为两个整数,int_esize和int_ecode。字段esize指示范围的大小,包括esize和ecode本身的前8个字节。字段ecode指示用于扩展剩余部分的格式。在撰写本文时,已经定义了三个代码:
在这里插入图片描述
同一文件中可以存在多个扩展名,每个扩展名始终以esize和ecode对开头,并且其第一个字节紧挨着前一个扩展名的最后一个字节。在单个.nii文件中,必须正确设置浮动vox_offset,以便成像数据仅在最后一个扩展名结束后开始。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值