本篇博文主要是结合python库Nilearn中提供的API,对fMRI数据的处理方式进行介绍。
撰写时间:2018.5.17
作者:selous
0.fMRI数据介绍
以脑成像为例,fMRI与MRI的区别主要是,传统的MRI为结构性成像(structural),扫描脑灰质,白质,脑脊液的形态结构等以判断是否有病变或损伤.fMRI(functional)功能成像,是基于大脑进行某项活动时局部脑区血氧水平的变化,来观察进行某项任务时所谓”脑激活”情况.是BOLD信号成像.前者可认为时间分辨率为无穷大(不发生损伤或病理性改变及老化因素等影响,脑结构基本保持稳定),后者的时间分辨率为秒级.
1.fMRI数据格式
本章的主要内容是结合haxby2001数据集和Nilearn库中提供的API介绍fMRI数据的格式
首先从该网址(http://data.pymvpa.org/datasets/haxby2001/subj2-2010.01.14.tar.gz)中下载一个样本的数据,其中文件bold.nii.gz时fMRI数据,将其解压之后,我们对其进行分析。
1.1 读取图像
import nilearn
niiImage = nilearn.image.load_img("subj1/bold.nii");
print niiImage.get_data().shape
#result:(40, 64, 64, 1452)
从上述结果可以知道fMRI数据是四维数据,其中第四维为时间维度,前三维是传统的脑图像扫描之后的3D图像数据。
1.2 可视化图像
first_image = image.index_img(niiImage, 0)
#print first_image
plotting.plot_anat(first_image)
plotting.show()
可视化结果:
2.fMRI数据处理方式
原始的fMRI数据是四维数据,传统的机器学习方法都不能很好的应用在原始数据上面,下面介绍的就是对原始数据的两个基本操作。
2.1 Mask
将四维数据转化为两维数据,该过程就叫做MASK。简单来讲就是特征提取的过程,提取的二维矩阵为一维的时间和一维的特征。也就是从fmri中的每一个时间片上(三维脑图)中提取特征,组合在一起。
from nilearn.input_data import NiftiMasker
masker = NiftiMasker(mask_img="subj1/mask4_vt.nii", standardize=True)
fmri_masked = masker.fit_transform("subj1/bold.nii")
print fmri_masked.shape
#result:(1452, 577)
2.2 Timeseries
从上面的结果可以看出,一个样本的特征时特别多的,下面的过程就是挑选出一些有效的时间序列建立功能性脑网络结构。具体的参考内容可以查看该网址
2.2.1 基于标准脑区图谱
#基于标准aal图谱
from nilearn.input_data import NiftiLabelsMasker
masker = NiftiLabelsMasker(labels_img="subj1/aal.nii", standardize=True,
memory='nilearn_cache', verbose=5)
time_series = masker.fit_transform("subj1/bold.nii")
print time_series.shape
#result:(1452, 116)
2.2.2 基于概率图谱
#概率图谱
atlas_filename = "msdl_atlas/MSDL_rois/msdl_rois.nii"
data = "subj1/bold.nii";
from nilearn.input_data import NiftiMapsMasker
masker = NiftiMapsMasker(maps_img=atlas_filename, standardize=True,
memory='nilearn_cache', verbose=5)
time_series = masker.fit_transform(data)
print time_series.shape
#result:(1452, 39)
2.3 建立功能型脑网络
通过脑区的时间序列,计算不同脑区之间的相关系数,构建脑网络。