多模态脑影像数据处理方案

文摘   2024-11-11 08:03   北京  


PSYCH统计实验室


01 引言

在脑科学领域,理解大脑的复杂功能和结构是一项巨大的挑战。而多模态脑影像的应用为这一领域提供了全新的解决方案。多模态融合为我们带来了更丰富、更全面的视角,帮助我们深入揭示大脑活动背后的奥秘。在本期,我们将介绍多模态影像数据的处理步骤,以及一批数据处理的案例分享。


02 多模态脑影像数据


多模态脑影像数据是指利用不同成像技术采集的大脑信息,这些技术包括功能磁共振成像(fMRI)、结构磁共振成像(sMRI)、扩散张量成像(DTI)、正电子发射断层扫描(PET)等。每种成像技术都有其独特的优势:

· fMRI 可以测量大脑的功能活动,帮助了解特定任务或静息状态下的神经活动。

· sMRI 提供大脑的解剖结构信息,帮助识别不同脑区的形态变化。

· DTI 则用于观察大脑中的白质纤维束,揭示不同脑区之间的连接情况。

处理步骤

数据预处理:不同模态的数据通常需要进行基本的清洗和校正,例如头动矫正、对齐(配准)、归一化等,以保证各模态数据的准确性和可比性。

配准:多模态数据的融合是多模态分析的关键步骤,主要通过空间配准技术将不同模态的数据整合到统一的坐标系中。这有助于在结构图像上看到功能活动,或者在功能连接上结合结构信息。

特征提取、分析、建模等:提取各模态的特征,进行预测或分类等。

多模态脑影像处理中的问题

不同模态的数据在空间分辨率、时间分辨率、信噪比等方面存在差异,如何有效地将这些差异的数据融合起来是一个重要的难题,并且,在多模态数据处理的各个环节,缺乏统一的标准和流程。

03 案例 

这批数据包含PET,sMRI两个模态,主要计算海马的体积以及PET的SUVR值。

处理环境:Ubuntu 22

使用软件: Python,ANTs

1. 在标准空间制作ROI

使用cat12的neuromorphometrics.nii文件提取海马区域的ROI,文件路径为spm12\toolbox\cat12\templates_MNI152NLin2009cAsym。代码如下:

from nilearn import plotting, image

import nibabel as nib

import numpy as np

neuro = image.load_img('neuromorphometrics.nii')

neurodata = neuro.get_fdata()

keep_values = [47, 48]

mask = np.isin(neurodata, keep_values)

neurodata[~mask] = 0

nib.save(nib.Nifti1Image(neurodata, neuro.affine), 'atlas.nii')


2. 配准

由于sMRI的大脑结构更清晰,因此一般使用sMRI到标准空间进行配准,因此,首先要将PET配准到sMRI,再将sMRI配准到标准空间,在同一个体不同模态的配准中,由于不涉及到大脑形态的变化,一般采用刚性配准(6自由度),在配准到标准空间时采用非线性配准,代码如下。


#代码

#!/bin/bash

path=/yourpath

for file in $(ls $path)

do

cd $path/ ${file}

antsRegistrationSyN.sh -d 3 \

-f /yourpath/${file}/${file}.nii.gz \

-m ${file}_pet.nii \

-o petcort1_ \

-n 24 -t r

mv petcort1_Warped.nii.gz ${file}_petint1.nii.gz

done

 

#代码

#!/bin/bash

path=/yourpath

for file in $(ls $path)

do

cd $path/${file}

antsRegistrationSyN.sh -d 3 \

-f /yourpath/tpl-MNI152NLin2009cAsym_res-01_desc-brain_T1w.nii.gz \

-m *_stripped.nii.gz \

-o out_ \

-n 24

done


3. 提取体积以及SUVR

将ROI配准到个体空间,代码如下:

#!/bin/bash

path=/yourpath

for file in $(ls $path)

do

cd $path/ ${file}

antsApplyTransforms \

   -d 3 \

   -i /yourpath/atlas.nii \

   -r ${file}_stripped.nii.gz \

   -t [out_0GenericAffine.mat, 1] \

   -t out_1InverseWarp.nii.gz \

   -n GenericLabel \

   -o atlas.nii.gz

   mv atlas.nii.gz ${file}_atlas.nii.gz

done

#计算体积

import pandas as pd

import nibabel as nib

import numpy as np

import os

import pandas as pd

import subprocess

base_path = '/yourpath'

 

df = pd.read_excel('all.xlsx')

for id in os.listdir(base_path):

    folder_path = os.path.join(base_path, id)

    roifilename = os.path.join(folder_path, f'{id}_atlas.nii.gz')

    roifile = nib.load(roifilename)

    roidata = roifile.get_fdata()

    dim = roifile.header.get_zooms()

    volInVoxel = dim[0] * dim[1] * dim[2]

    for i in [47, 48]:

        tmpAtlas = np.copy(roidata)

        tmpAtlas[tmpAtlas != i] = 0

        tmpAtlas[tmpAtlas == i] = 1

        volume = np.sum(tmpAtlas) * volInVoxel

        df.loc[df['ID'] == id, f'volume_{i}'] = volume

    print(id)

outputfile = 'volume.xlsx'

df.to_excel(outputfile, index=False)

 

#计算SUVR

import pandas as pd

import nibabel as nib

import numpy as np

import os

import pandas as pd

import subprocess

from nilearn.image import resample_to_img

 

type = 'yourtype'

base_path = f'/yourpath/{type}'

t1path = '/yourpath '

df = pd.read_excel('yourpath.xlsx')

 

for id in os.listdir(base_path):

    folder_path = os.path.join(base_path, id)

    petfilename = os.path.join(folder_path, f'{id}_{type}.nii.gz')

    petfile = nib.load(petfilename)

    petdata = petfile.get_fdata()

 

    reforig = nib.load(os.path.join(t1path, id, f'{id}_seg.nii.gz'))

    tmp = nib.load(os.path.join(t1path, id, f'{id}_n4.nii.gz'))

    ref = resample_to_img(reforig, tmp, interpolation='nearest')

    refdata = ref.get_fdata()

 

    roifilename = os.path.join(t1path, id, f'{id}_atlas.nii.gz')

    roifile = nib.load(roifilename)

    roidata = roifile.get_fdata()

 

    for i in [47, 48]:

        tmpAtlas = np.copy(roidata)

        tmpAtlas[tmpAtlas != i] = 0

        tmpAtlas[tmpAtlas == i] = 1

        df.loc[df['ID'] == id, f'{type}_{i}'] = np.sum(petdata * tmpAtlas) / np.sum(tmpAtlas)

#省略参考区域

outputfile = 'output.xlsx'

df.to_excel(outputfile, index=False)

04 后记 


关注我们,获取更多神经科学与心理学相关资讯!在后续的推文中,我们还将介绍更多的相关内容,敬请期待!


PSYCH统计实验室

通知公告

网络分析课程目前开放视频课啦

单次课200元/讲(学生),250元/讲(非学生)

共有四讲内容:

①横断面网络分析简介与基础

②网络分析与因子分析

③交叉滞后网络分析

④时间序列网络分析

购买后开放视频权限14天,可多次申请。

并赠送所有课程相关资料(无PPT)

如果想申请购买,请联系M18812507626


更多资讯

关注我们

文稿:Lee

排版:Little Star

责编:Wink
审核:摘星

本文由“Psych统计自习室”课题组原创,欢迎转发至朋友圈。如需转载请联系后台,征得作者同意后方可转载。


Psych统计自习室
大家好,我们是由来自北京师范大学,西南大学,天津医科大学等高校在读硕士、博士研究生组成的一个科研团队——Psych统计自习室。Psych统计自习室旨在关注心理学、精神病学领域的最前沿的系列研究,并做前沿统计知识的分享。
 最新文章