| 图源

脑影像分析中,我们常常会针对性的对某些感兴趣区域进行分析,而对它们进行分析的前提是获取该区域的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_labelmask = mask + uint8(img==i);
end% 区域内为1,区域外为0,一个编号
niftiwrite(mask,[area_name, '_uni_mask.nii'], info)% 区域内为原来编号,区域外为0niftiwrite(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_labelmask = mask + uint8(img==i);
end% 区域内为1,区域外为0,一个编号
niftiwrite(mask,[area_name, '_uni_mask.nii'], info)% 区域内为原来编号,区域外为0niftiwrite(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 nibarea_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 nibarea_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 nparea_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 nparea_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 nparea_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 nparea_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_labelmask = mask + uint16(img==i);
endidx = find(mask==1);for i = 1:length(idx)mask(idx(i))=i;
endniftiwrite(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_labelmask = mask + uint16(img==i);
endidx = find(mask==1);for i = 1:length(idx)mask(idx(i))=i;
endniftiwrite(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

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

  1. 鼠标按键获取感兴趣区域 2

    #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include & ...

  2. 鼠标按键获取感兴趣区域

    #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include & ...

  3. LabVIEW感兴趣区域分析(实战篇—1)

    目录 1.ROI定义及实现方法 2.基础案例:图像感兴趣区域手动标记 3.进阶案例:图像颗粒自动标记 ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以 ...

  4. 使用ENVI提取SPOT影像感兴趣区域的水体范围

    第一次使用spot进行水体提取,这里提供一个简单的方法,就是通过NDWI指数进行水体提取,但是spot影像和其他遥感数据有些区别,所以在提取过程中,需要注意一些问题. 目录 1.影像下载 2.影像加载 ...

  5. MRI脑影像分析——多种工具实现Nifti(*.nii)文件读取、处理与写入——把小舞写进脑海里、6mm半高全宽高斯核平滑脑影像、NIFTI文件合并、算fMRI平均图像

    | 图源   Nifti(Neuroimaging Informatics Technology Initiative,神经影像信息学技术倡议)文件格式,是目前各大神经影像分析工具普遍兼容的体素水平的 ...

  6. 《中国人工智能学会通讯》——11.66 结构属性表示及其在脑影像分析中的应用...

    11.66 结构属性表示及其在脑影像分析中的应用 传统属性表示方法主要集中在视觉属性.部件属性和相似属性.由于现实问题的复杂性和多样性,现有的属性表示方法无法对具有明显结构信息的图像进行有效表达.例如 ...

  7. NeuroPM-box基因脑影像分析平台

    诊断和治疗异质性脑部疾病需要具有跨遗传学.蛋白质组学和神经成像多个学科的专业技术.NeuroPM-box旨在满足这一需求,它是一款用户友好.开放访问.多工具的跨平台软件,能够描述多尺度和多因素的神经病 ...

  8. 脑影像分析工具保姆级安装教程——VMware Workstation16.1.2中安装FSL6.0.3/FSL6.0.4、MRtrix3、MRIcron并修复fsleyes not found

    | 图源   之前写过三篇关于FSL安装的文章,包括简易安装.docker下完整安装,Linux下完整安装,这篇在VMware Workstation16.1.2中安装,算是之前的各种安装方法的一个集 ...

  9. 获取图片中感兴趣区域的信息(Matlab实现)

    内容提要 如果一幅图中只有一小部分图像你感兴趣(你想研究的部分),那么截图工具就可以了,但是如果你想知道这个区域在原图像中的坐标位置呢? 这可是截图工具所办不到的,前段时间我就需要这个功能,于是将其用 ...

最新文章

  1. eclipse如何连接mysql_Python如何连接 MySQL?
  2. 百练-16年9月推免-B题-字符串判等
  3. Ubuntu 下 apt-get 命令
  4. 通过流进行字符集编码转换
  5. .NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
  6. 40 个 SpringBoot 常用注解:让生产力爆表!
  7. redis指定配置文件启动_redis基础知识整理-安装
  8. python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件
  9. 调用天气接口获取天气预报
  10. shell 脚本执行报错/bin/bash^M: bad interpreter: No such file or directory
  11. lzg_ad:使用EWF API开发常见问题
  12. ORA-01017解决方案
  13. 腾达u2无线网卡驱动Linux,腾达u2网卡驱动下载
  14. 电脑联网打不开网页只能用qq和微信
  15. 区块链是什么通俗解释_区块链技术是什么?区块链的通俗解释原来是这样!
  16. python,给定任意列表lst和一个任意值item,返回item在lst中第一次出现的位置
  17. 让div填满剩下的空间
  18. 基于微信理共享停车位预约小程序系统设计与实现 开题报告
  19. UTONMOS开启元宇宙数字化经济新纪元
  20. Linux cat命令学习

热门文章

  1. 线性插值改变图像尺寸_数码相机的成像原理、显示屏尺寸、像素的介绍
  2. ae2020不支持的视频驱动程序_pr2020显示不支持的视频驱动程序(如图)?
  3. Android studio app启动时默认启动页面为自定义界面
  4. android+动态光圈效果,OpenGL Shader实例分析(8)彩色光圈效果
  5. 新基建必看系列——一文看懂爆火的智慧灯杆未来趋势及竞争格局
  6. xampp v3.2.2 php版本,xampp 3.2.2下载
  7. 华为鸿蒙是开源式系统,全面开源!华为自研操作系统鸿蒙正式亮相
  8. 如何在outlook里面把收件箱分组,以便快速的查看最重要的email。
  9. 小米手环3 NFC 自定义 门禁卡数据
  10. linux :Java SE Development Kit 7u5