MRI脑影像分析——根据脑图谱获取感兴趣区域mask,以海马体与丘脑为例(matlab+nilearn+nibabel+REST1.8)

在这里插入图片描述

| 图源

脑影像分析中,我们常常会针对性的对某些感兴趣区域进行分析,而对它们进行分析的前提是获取该区域的mask。感兴趣区域可以用以某些坐标为球心的球形区域定义,也可以用脑图谱上对应的某些脑区定义,其中,后者是较为常见的,也是我们今天要讨论的。脑图谱是一类特殊脑影像,它的每一个位置上不是信号值,而是脑区编号(标签),这也就意味着我们可以通过感兴趣区域的脑区编号,得到对应的感兴趣区域位置的集合,它也就是感兴趣区域的mask。以下将以1mm和3mm的brainnetome图谱,并以海马体与丘脑为例生成mask,如果要生成其它mask,只需要修改编号序列即可。要用到的工具包括matlab、REST1.8、nilearn和nibabel等,从matlab到python,从GUI到代码脚本全方位覆盖,一起往下看吧。

NIFTI解析

copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/118481241


获取海马体和丘脑的mask


  • 海马与丘脑的区域编号

脑图谱是一类特殊脑影像,它的每一个位置上不是信号值,而是脑区编号(标签)。任何一个图谱都会有其对应的脑区编号(标签)表,brainnetone的编号表格可以在它的官网找到,这里就只截取了海马体与丘脑那部分。在图谱中,海马体与丘脑分别被分成了多个亚区,编号范围分别是215-218,231-246。

在这里插入图片描述
用mricron打开图谱图像,可以轻易地验证上述内容的正确性,即脑图谱每一个位置上不是信号值,而是脑区编号(标签),如下图。
在这里插入图片描述

  • REST1.8获取海马与丘脑mask

REST1.8(静息态功能磁共振数据处理工具包 V1.8)是一个静息态脑影像分析matlab工具包,通过它,只需要点点点就可以获取到感兴趣区域的mask。基本步骤如下图所示,最关键的步骤是设置阈值范围,这也就是在通过选择脑区编号(标签)得到感兴趣区域,范围设置遵从matlab语法。另外在保存mask之前需要设置cluster大小,这对最终mask并没有什么影响,但是不能设置得太离谱,一般设置30 0 5,参照卢家峰老师的视频

在这里插入图片描述
海马与丘脑mask:保存之后用mricron打开,以原来图谱为背景,设置颜色为grayscale,以mask为overlay,设置颜色为red,即可看到叠加之后的效果。

在这里插入图片描述

  • matlab获取海马与丘脑mask(推荐使用)

由上面的分析可知,只需要找到符合感兴趣区域对应的脑区编号范围内的所有位置就可以得到感兴趣区域的mask,这很容易实现,只需要解析NIFTI文件,再用阈值过滤数值即可。笔者在这篇文章里面详细的记录了各种解析NIFTI文件的方法,这里使用matlab自带的函数。只有0,1的mask方便用于提取该区域的全部信号,保留原始编号的mask则方便用于计算区域内各亚区的相关关系。

提取海马:215-218

ROI_label = 215:218;
area_name = 'hipp';
img = niftiread('BN_Atlas_246_1mm.nii');
info = niftiinfo('BN_Atlas_246_1mm.nii');

%创建一个空白mask
mask = uint8(zeros(size(img))); 

for i = ROI_label
    mask = mask + uint8(img==i);
end

% 区域内为1,区域外为0,一个编号
niftiwrite(mask,[area_name, '_uni_mask.nii'], info)

% 区域内为原来编号,区域外为0

niftiwrite(mask.*img,[area_name, '_sep_mask.nii'], info)

在这里插入图片描述

提取丘脑:231-246

ROI_label = [231:240,241:246];
area_name = 'tha';
img = niftiread('BN_Atlas_246_1mm.nii');
info = niftiinfo('BN_Atlas_246_1mm.nii');

%创建一个空白mask
mask = uint8(zeros(size(img))); 

for i = ROI_label
    mask = mask + uint8(img==i);
end

% 区域内为1,区域外为0,一个编号
niftiwrite(mask,[area_name, '_uni_mask.nii'], info)

% 区域内为原来编号,区域外为0

niftiwrite(mask.*img,[area_name, '_sep_mask.nii'], info)

在这里插入图片描述

  • nibabel获取海马与丘脑mask

nibabel是python平台上用于解析神经影像的工具,不仅可以解析nifti也可以解析gifti。这里用它来解析并封装nifti,以生成mask。mask类型与保持上面一致。

pip install nibabel

提取海马:215-218

import numpy as np
import nibabel as nib

area_name = 'hipp'
ROI_label = range(215,219)

img = nib.load('BN_Atlas_246_1mm.nii')
data = img.get_fdata()
mask = np.zeros(data.shape)

# 创建mask
for i in ROI_label:
    mask[data==i] = 1

# 用原先的仿射矩阵与头包装mask成nifti
#区域内为1,区域外为0,一个编号

new_img = nib.Nifti1Image(mask,img.affine, header=img.header)
new_img.to_filename(area_name + '_uni_mask.nii')

# 区域内为原来编号,区域外为0
data = np.array(mask*data, dtype=np.uint8)
new_img = nib.Nifti1Image(data, img.affine, header=img.header)
new_img.to_filename(area_name + '_sep_mask.nii')

提取丘脑:231-246

import numpy as np
import nibabel as nib

area_name = 'tha'
ROI_label = list(range(231,240)) + list(range(240,247))

img = nib.load('BN_Atlas_246_1mm.nii')
data = img.get_fdata()
mask = np.zeros(data.shape)

# 创建mask
for i in ROI_label:
    mask[data==i] = 1

# 用原先的仿射矩阵与头包装mask成nifti
#区域内为1,区域外为0,一个编号

new_img = nib.Nifti1Image(mask,img.affine, header=img.header)
new_img.to_filename(area_name + '_uni_mask.nii')

# 区域内为原来编号,区域外为0
data = np.array(mask*data, dtype=np.uint8)
new_img = nib.Nifti1Image(data, img.affine, header=img.header)
new_img.to_filename(area_name + '_sep_mask.nii')

# copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/118481241
  • nilearn获取海马与丘脑mask(推荐使用)

nilearn是在nibabel的基础上开发的,对nibabel做了一定程度的封装,并且集成了处理,统计分析和绘图等,是一个很完善的神经影像分析工具,这里也用它来提取一下丘脑和海马体的mask。与上面类似。

nilearn.image: 图像处理和重采样工具。

pip install nilearn

提取海马:215-218

from nilearn import image
import numpy as np

area_name = 'hipp'
ROI_label = range(215,219)

img = image.load_img('BN_Atlas_246_1mm.nii')
data = img.get_fdata()

# 创建mask
mask = np.zeros(data.shape)
for i in ROI_label:
    mask[data==i] = 1

# 用原先的仿射矩阵与头包装mask成nifti
#区域内为1,区域外为0,一个编号
mask = mask.astype('uint8')
new_img = image.new_img_like(img, mask)
new_img.to_filename(area_name + '_uni_mask.nii')

# 区域内为原来编号,区域外为0
data = np.array(mask*data, dtype=np.uint8)
new_img = image.new_img_like(img, mask*data)
new_img.to_filename(area_name + '_sep_mask.nii')

提取丘脑:231-246

from nilearn import image
import numpy as np

area_name = 'tha'
ROI_label = list(range(231,240)) + list(range(240,247))

img = image.load_img('BN_Atlas_246_1mm.nii')
data = img.get_fdata()

# 创建mask
mask = np.zeros(data.shape)
for i in ROI_label:
    mask[data==i] = 1

# 用原先的仿射矩阵与头包装mask成nifti
#区域内为1,区域外为0,一个编号
mask = mask.astype('uint8')
new_img = image.new_img_like(img, mask*data)
new_img.to_filename(area_name + '_uni_mask.nii')

# 区域内为原来编号,区域外为0
data = np.array(mask*data, dtype=np.uint8)
new_img = image.new_img_like(img, mask*data)
new_img.to_filename(area_name + '_sep_mask.nii')

copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/118481241


补充——生成海马与丘脑区域内为每个体素编码的mask


为区域内每个体素编码的mask主要是方便用dpabi等工具算基于体素的功能连接,因为每个体素都有不同的编码,所以每个体素都会被当成一个ROI来对待,而不会被求平均。

  • nilearn获取海马与丘脑mask

提取海马:215-218

from nilearn import image
import numpy as np

area_name = 'hipp'
ROI_label = range(215,219)

img = image.load_img('BN_Atlas_246_3mm.nii')
data = img.get_fdata()

# 创建mask
mask = np.zeros(data.shape)
for i in ROI_label:
    mask[data==i] = 1

# mask:区域内每个体素一个编号,区域外为0
idx_x, idx_y, idx_z = np.where(mask==1)
for j in range(len(idx_x)):
    mask[idx_x[j]][idx_y[j]][idx_z[j]] = j    
mask = np.array(mask, dtype=np.int16)
new_img = image.new_img_like(img, mask)
new_img.to_filename(area_name + '_all_mask.nii')

提取丘脑:231-246

from nilearn import image
import numpy as np

area_name = 'tha'
ROI_label = list(range(231,240)) + list(range(240,247))

img = image.load_img('BN_Atlas_246_3mm.nii')
data = img.get_fdata()

# 创建mask
mask = np.zeros(data.shape)
for i in ROI_label:
    mask[data==i] = 1

# mask:区域内每个体素一个编号,区域外为0
idx_x, idx_y, idx_z = np.where(mask==1)
for j in range(len(idx_x)):
    mask[idx_x[j]][idx_y[j]][idx_z[j]] = j    
mask = np.array(mask, dtype=np.int16)
new_img = image.new_img_like(img, mask)
new_img.to_filename(area_name + '_all_mask.nii')

在这里插入图片描述

  • matlab获取海马与丘脑mask

提取海马:215-218

ROI_label = 215:218;
area_name = 'hipp';
img = niftiread('BN_Atlas_246_3mm.nii');
info = niftiinfo('BN_Atlas_246_3mm.nii');
info.Datatype = 'uint16';%数字较大,需要修改原先的uint8到uint16
%创建mask
mask = uint16(zeros(size(img))); 

for i = ROI_label
    mask = mask + uint16(img==i);
end

idx = find(mask==1);

for i = 1:length(idx)
    mask(idx(i))=i;
end

niftiwrite(mask,[area_name, '_all_mask.nii'], info)

提取丘脑:231-246

ROI_label = [231:240,241:246];
area_name = 'tha';
img = niftiread('BN_Atlas_246_3mm.nii');
info = niftiinfo('BN_Atlas_246_3mm.nii');
info.Datatype = 'uint16';
%创建mask
mask = uint16(zeros(size(img))); 

for i = ROI_label
    mask = mask + uint16(img==i);
end

idx = find(mask==1);

for i = 1:length(idx)
    mask(idx(i))=i;
end

niftiwrite(mask,[area_name, '_all_mask.nii'], info)

注:其实只要能够解析nifti的工具都可以用来制作mask,上面只是举了几个例子,不过已经完全够用了。那么接下来就用这些生成的mask来提取感兴趣区域的信号吧,欢迎继续关注。

copyright © 意疏:https://blog.csdn.net/sinat_35907936/article/details/118481241


参考


https://blog.csdn.net/sinat_35907936/article/details/118862614

  • 34
    点赞
  • 227
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
### 回答1: 科学将大划分为不同的区域,以了解其在控制身功能和处理信息方面的作用。 大的主要区域包括: 1. 大皮层:这是大的外层,负责控制认知功能,如思考、记忆、语言和感知。 2. 海马:这是大内部的一个区域,主要负责学习和记忆功能。 3. 基底节:这是控制运动和平衡的重要区域。 4. 小:这是控制运动的重要组成部分,与基底节紧密相连。 5. 干:这是大的中央部分,负责控制自主生理功能,如呼吸和心跳。 这些区域的划分不是固定不变的,随着对大功能的进一步了解,划分可能会有所改变。但是,通过对大不同区域的划分,我们可以更好地理解大如何工作,从而帮助我们更好地处理和治疗部疾病。 ### 回答2: 科学中,人们对大进行了不同的区域划分,主要是为了更好地了解大的功能和结构。这种划分常常基于大在不同的功能上的特化和区域功能之间的连接方式。 首先,大的皮层可以根据功能划分为多个区域,如运动区、感觉区、语言区和认知区等。运动区位于大的中央沟,主要控制肌肉的运动。感觉区位于大的顶部和侧面,接收和处理来自身各个部位的感觉信息。语言区主要位于左半球,参与语言的产生和理解。认知区则涉及记忆、注意、决策等高级认知过程。 此外,大也可以根据神经元的细胞类型和结构特点来进行划分。如,大的灰质和白质就是两个重要的区域。灰质主要由神经元细胞组成,承担信息处理和决策的任务。白质则由神经纤维组成,负责不同区之间的信息传递。 在科学研究中,大也被划分为左半球和右半球。这是因为大的两半球在功能上存在一定的特化。如,左半球主要与语言、分析思维和逻辑推理等活动相关,而右半球则更擅长空间感知、艺术创造和情感验。 总的来说,大区域划分在科学研究中起到重要的作用,使科学家们能够更好地理解大的结构和功能。但需要注意的是,这种划分并非绝对,大的各个区域之间并不是完全独立的,而是通过复杂的神经回路相互连接,共同协作完成各种认知和行为任务。 ### 回答3: 科学中对大不同区域的划分是通过结构和功能特征来进行的。大被分为左右两个半球,每个半球又分为四个叶片,即额叶、顶叶、颞叶和枕叶。每个叶片又包含多个区域,如额叶包括额叶前额叶、额叶中额叶和额叶后额叶等。 这些不同区域之间具有不同的功能特征。比如,额叶前额叶参与决策和行为控制,额叶中额叶则负责语言和执行功能,额叶后额叶在视觉和空间认知中起重要作用。 除了结构上的划分,科学还关注大区域的功能特征。通过神经影像技术如功能性核磁共振成像(fMRI)和电图(EEG),可以观察到不同任务下大不同区域的活动变化。这些功能区域可以是特定的任务执行区域,如运动控制区域或语言处理区域,也可以是感知、认知和情绪处理等特定功能的区域。 在大的划分中,还存在一些重要的连接区域,如海马和杏仁核等。这些区域在不同区域之间传递信息,协调和整合不同区域的功能。 然而,大区域划分仍然是一个较为复杂的领域,目前仍有许多争议和研究不足之处。由于大功能的复杂性和相互影响,区域的功能边界并不是非常明确。因此,需要进一步研究和技术的发展来深化我们对大不同区域划分的理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值