跳转到内容

SPM/使用4D数据

来自Wikibooks,开放世界中的开放书籍
< SPM

使用四维数据

[编辑 | 编辑源代码]

最近的SPM版本(SPM5或更高版本)可以处理4D NIfTI数据集,这些数据集通常用于表示fMRI的3D体积时间序列,以及更一般的相关图像体积集合(例如DARTEL模板中不同的组织类别)。

在图形用户界面中使用4D数据(例如,单击显示检查注册,或在批处理界面中选择图像)的关键是要意识到图像选择对话框(在右侧,就在所选文件列表上方)中显示的1指的是4D数据集的第一个体积或帧。请注意,3D数据可以看作是只有一个体积的4D数据的特例,因此第一个(唯一)帧也适用于正常的3D图像。

要选择除第一个以外的体积,您只需更改帧规范。要选择特定帧,您可以用所需编号替换数字1,例如10或100,但更有用的是,您可以输入MATLAB范围,然后您将看到所有/所有体积,直到上限,因此输入1:999将允许您选择时间序列中少于1000个体积的所有体积。这些体积在其文件名末尾的逗号后显示其帧号。

对于fMRI数据,更改过滤器表达式从'.*'到仅显示您感兴趣的图像集的正则表达式(例如,将其更改为'^u'以仅查看以'u'开头的重新对齐且未扭曲的图像),然后将帧范围从1更改为'1:999'(或足够大的数字以显示所有体积),然后右键单击并选择'选择全部'。有关过滤器(正则表达式)的更多帮助,请单击对话框左侧的'?'。

帧范围不直接默认为1:9999999的原因是,如果您进入包含大量NIfTI文件的目录,界面将非常慢,因为需要读取所有NIfTI头文件以找出每个文件实际上包含多少体积(即使大多数文件只包含1个)。同样请注意,在扩展帧范围之前设置过滤器可以在这种情况下有所帮助。

一个例子

[编辑 | 编辑源代码]

在本文中,我使用了检查注册,导航到我的SPM目录(使用上一个下拉菜单),输入工具箱目录,然后输入Seg目录,其中包含新分割工具箱的组织概率图(TPM)(另请参见SPM -> 工具 -> 新分割)。4D TPM.nii NIfTI文件中包含六个TPM体积;通过将帧号从'1'更改为'1:10',我可以查看所有六个体积,我选择了第二帧和第三帧(显示为TPM.nii,2TPM.nii,3),它们对应于白质和CSF组织类别。

更多细节

[编辑 | 编辑源代码]

对于高级用户,批处理系统允许您创建根据模式选择文件的批处理,使用

BasicIO -> File Selector (Batch Mode)

在这种情况下,将选择整个4D NIfTI文件(没有',n'帧号)。然后,您可以使用另一个批处理模块

SPM -> Util -> Expand image frames

引用单个4D文件,并将指定列表或范围的帧与它关联。然后,生成的体积集可用作依赖项,在批处理的后续模块中使用。

最后,更高级的用户可以简单地将帧号添加到MATLAB脚本中的文件名,这甚至允许人们使用有时用于多元数据集的五维数据(!)(例如,参见此NIfTI图的第3页和第4页),通过在逗号后添加两个数字。例如,要查看存储在5D DARTEL速度场第五维中的三个(x、y和z)分量(或者只是为了炫耀!),您可以执行以下操作

>> ims = [repmat('u_rc1Blah_Template.nii', 3, 1) [',1,1';',1,2';',1,3']]
>> spm_check_registration(ims)

要自动扩展4D nifti文件路径中的体积,您可以在SPM12上使用

>> ims = spm_select('expand', fullfile(SCAN_dir,'SCAN.nii'))

对于SPM8及更低版本,您必须手动计算体积数量并自行扩展,以下是一段代码片段

function n = spm_select_get_nbframes(file)
% spm_select_get_nbframes(file) Get the number of volumes of a 4D nifti file, excerpt from SPM12 spm_select.m
    N   = nifti(file);
    dim = [N.dat.dim 1 1 1 1 1];
    n   = dim(4);
end

function out = expand_4d_vols(nifti)
% expand_4d_vols(nifti)  Given a path to a 4D nifti file, count the number of volumes and generate a list of all volumes
    nb_vols = spm_select_get_nbframes(nifti);
    out = strcat(repmat(nifti, nb_vols, 1), ',', num2str([1:nb_vols]'));
end

然后,您可以使用

>> ims = expand_4d_vols(fullfile(SCAN_dir,'SCAN.nii'))

请注意,上述任何技术都可以用来只选择4D体积的一个子集(例如,为了丢弃前x个体积以避免MRI饱和效应)

>> ims = cellstr(ims(4:end,:));

在SPM中创建4D NIfTI文件

[编辑 | 编辑源代码]

SPM允许您使用批处理系统将多个3D体积连接成一个4D NIfTI

SPM -> Util -> 3D to 4D File Conversion

这些图像必须具有相同的尺寸,否则将它们视为一个4D数据集是没有意义的。

请注意,此界面还允许您使用从现有4D文件中选择的体积创建新的4D文件,这意味着您可以执行一些操作,例如通过创建仅包含您要保留的体积的新4D文件,从一个4D文件的开头丢弃T1平衡扫描。

4D NIfTI文件可能出现的问题

[编辑 | 编辑源代码]

从本质上讲,4D NIfTI文件会不可避免地产生内存问题,因为它们可以增长到任何可能的大小(取决于4D NIfTI文件包含的体积数量)。大多数SPM模块完全支持大型4D NIfTI文件,但第三方工具箱或您自己的使用SPM函数的脚本可能不支持这些大型文件。

即使SPM支持大型NIfTI文件,它也只可以加载与您可用RAM内存大小[1]以及您的文件系统允许的大小[2]相符的文件(不要忘记,处理步骤的输出NIfTI文件可能比输入文件大很多!)。诸如内存外计算之类的技术可以用来存储和分割磁盘文件上的大型计算,但这非常实验性,在大多数神经科学工具箱中不可用。

在实践中,如果您使用的是SPM,使用过大的4D NIfTI文件会导致“无法映射视图”错误(但这并不是唯一可能的原因:从网络SAMBA共享读取文件、权限问题和防病毒软件也会导致此错误)。在这种情况下,您可以尝试将4D NIfTI文件转换为一组3D NIfTI文件,将每个帧分离成一个单独的NIfTI文件,看看这是否能解决您的问题。

将4D NIfTI文件分离成3D体积

[编辑 | 编辑源代码]

此页面应该已经证明,通常您不需要将4D数据集分离成其组成部分的3D体积以在SPM中使用,无论是使用交互式界面、批处理还是脚本,唯一的例外是,如果您有如上所述的过大的4D nifti文件。

在这些情况下,或者由于与您的设计有关的某些特定原因,您可能希望拆分数据集以在无法处理4D NIfTIs的其他软件包中处理图像。为此,SPM提供了一个简单的命令行工具(不在批处理界面中,抱歉),您可以通过键入以下命令来使用它

>> spm_file_split

然后选择(第一帧)一个4D NIfTI。如果您选择Blah.nii,这将创建形式为Blah_00001.nii, Blah_00002.nii等的图像。有关更灵活的使用方法,请参阅help spm_file_split

一个使用spm_file_split的递归4D到3D niftis转换器可以在这里找到。

  1. https://www.jiscmail.ac.uk/cgi-bin/webadmin?A2=ind1009&L=SPM&D=0&I=-3&d=No+Match%3BMatch%3BMatches&P=42567
  2. https://www.jiscmail.ac.uk/cgi-bin/webadmin?A2=ind1411&L=SPM&P=R63209&I=-3&d=No+Match%3BMatch%3BMatches
华夏公益教科书