FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程

2023-11-17

FreeSurfer当前只支持Linux系统和Mac OS。我所使用的系统是Ubuntu 16 .0.4,FreeSurfer的安装耗时较小,但是在处理时耗时较长,可能需要数个小时,甚至一天,这个取决于机器性能,但是和GPU好像没太大关系。下面先给出总的安装步骤,然后单独给出详细的安装步骤。

首先给出几个我参考的文章:

  1. FreeSurfer-Introduction
  2. FSL/FreeSurfer安装教程
  3. FreeSurfer使用手册
  4. 使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐

其中第2个参考文章还安装了FSL,我现在也不是很清楚这个FSL是什么,据我的安装和使用结果来看,没必要单独安装,FreeSurfer里应该集成了FSL。(2020.09.15更新,在文章的第四部分增加了FSL的安装和使用说明)

一、FreeSurfer总安装步骤

wget https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/7.1.0/freesurfer-linux-centos6_x86_64-7.1.0.tar.gz #下载安装包
tar -zxv -f freesurfer-linux-centos6_x86_64-7.1.0.tar.gz #解压缩
# 注册,得license.txt,并将license.txt拷贝到./freesurfer目录下
sudo chmod -R 777 ./freesurfer #改变freesurfer的权限
vi ~/.bashrc
# 在~/.bashrc文件中添加以下两行
export FREESURFER_HOME=/home/syzhou/zuzhiang/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh
source ~/.bashrc
sudo apt-get install tcsh #安装tcsh,类似与bash,不安装运行的时候会报错

二、FreeSurfer安装分步介绍

1. 下载FreeSurfer压缩包

首先到官网下载相应的安装包,下载界面如下图所示,看好是下载Linux下的还是MacOS下的,虽然Linux下的安装包写的是CentOS,但是也支持Ubuntu。在红色框上面右击选择“复制下载连接”,然后在Linux系统下选择相应的路径,使用命令wget https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/7.1.0/freesurfer-linux-centos6_x86_64-7.1.0.tar.gz 下载安装包。
在这里插入图片描述

2. 安装

虽然说是安装,其实只需要解压就可以了,使用命令tar -zxv -f freesurfer-linux-centos6_x86_64-7.1.0.tar.gz进行解压缩,如果你下载和我不是同一个版本,需要把压缩文件的文件名改一下,下同。解压后会在当前目录下生成一个名为freesurfer的文件夹。

3. 注册

前往官方注册网站进行注册,过段时间后会收到一封电子邮件,附件中有名为license.txt的文件,下载下来,放到freesurfer文件夹下面。注册页面如下图所示。
在这里插入图片描述

4. 改变freesurfer文件夹权限

使用命令sudo chmod -R 777 ./freesurfer更改文件夹权限,文件夹路径可能需要根据自己的做相应的调整。

5. 添加环境变量

使用vi ~/.bashrc命令打开环境变量文件,在~/.bashrc文件中添加以下两行:

export FREESURFER_HOME=/home/syzhou/zuzhiang/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

并使用source ~/.bashrc命令使改变后的环境变量立即生效。然后会显示下图所示的信息。
在这里插入图片描述

6. 安装tcsh

使用sudo apt-get install tcsh 命令安装tcsh,tcsh类似与bash,不安装的话,运行的时候会报错。

7. 测试

在命令行中输入recon-al --help命令,如果显示帮助信息则说明安装成功,如果提示命令不存在或者只显示了路径信息则说明安装有问题,前者可以通过重新安装解决,后者应该是安装的第6步有问题。

三、FreeSurfer的使用

这里主要是使用FreeSurfer来对脑部图像做头骨的去除。参考的文章是最开始提到的第四篇。

!!!

需要格外注意的是,每次进入终端使用FreeSurfer的时候需要输入命令:

export FREESURFER_HOME=/home/syzhou/zuzhiang/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

否则不能正常使用。

!!!

以下是使用FreeSurfer批量对图像进行去除头骨和仿射对齐等操作。其中path/a/b/c变量的值需要根据实际情况来改变。代码的第19行,如果图像文件的格式名不同,需要保留的字符串长度也不同,只需要文件名(不包括扩展名)即可。

cmd变量对应的命令中,a/b/c是环境变量配置命令,recon-all是颅骨去除的命令,mri_convert是进行格式转换,从mgz转到nii.gz,只是为了方便查看,mri_convert --apply_transform是进行仿射对齐操作。

import os
import glob

path = r"/home/syzhou/zuzhiang/Dataset/MGH10/Heads"
# 读取目录下的.img文件
images = glob.glob(os.path.join(path,"*.img"))
# 下面为freesurfer的环境配置命令
a = "export FREESURFER_HOME=/home/syzhou/zuzhiang/freesurfer;"
b = "source $FREESURFER_HOME/SetUpFreeSurfer.sh;"
# 数据所在的目录
c = "export SUBJECTS_DIR="+path+";"

#images=['/home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127.img']
for image in images:
    # 将文件路径和文件名分离
    filename = os.path.split(image)[1] # 将路径名和文件名分开
    filename = os.path.splitext(filename)[0] #将文件名和扩展名分开,如果为.nii.gz,则认为扩展名是.gz
    # freesurfer环境配置、颅骨去除、未仿射对齐mpz转nii、仿射对齐、仿射对齐mpz转nii.gz格式
    #recon-all是颅骨去除的命令
    # mri_convert是进行格式转换,从mgz转到nii.gz,只是为了方便查看
    # --apply_transform:仿射对齐操作
    # 转格式
    filename=filename[:] #根据扩展名的不同,这里需要做更改,只保留文件名即可
    cur_path=os.path.join(path,filename) 
    print("file name: ",cur_path)
    cmd = a + b + c \
          + "recon-all -parallel -i " + image + " -autorecon1 -subjid " + cur_path + "&&" \
          + "mri_convert " +  cur_path + "/mri/brainmask.mgz " +cur_path + "/mri/"+filename+".nii.gz;"\
          + "mri_convert " + cur_path + "/mri/brainmask.mgz --apply_transform " + cur_path + "/mri/transforms/talairach.xfm -o " + cur_path + "/mri/brainmask_affine.mgz&&" \
          + "mri_convert " + cur_path + "/mri/brainmask_affine.mgz " + cur_path + "/mri/"+filename+"_affine.nii.gz;"
    #print("cmd:\n",cmd)
    os.system(cmd)

为了更直观的看清楚cmd对应的指令,下面列出了当图像文件为1127.img时,cmd对应的内容,为了方便查看我加入了换行。

 export FREESURFER_HOME=/home/syzhou/zuzhiang/freesurfer;
 
 source $FREESURFER_HOME/SetUpFreeSurfer.sh;
 
 export SUBJECTS_DIR=/home/syzhou/zuzhiang/Dataset/MGH10/Heads;
 
recon-all -i /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127.img -autorecon1 -subjid 1127&&

mri_convert /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/brainmask.mgz /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/brainmask.nii.gz;

mri_convert /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/brainmask.mgz --apply_transform /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/transforms/talairach.xfm -o /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/brainmask_affine.mgz&&

mri_convert /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/brainmask_affine.mgz /home/syzhou/zuzhiang/Dataset/MGH10/Heads/1127/mri/brainmask_affine.nii.gz;

假设图像文件名为1127.img,则会在path对应的目录下生成一个以图像文件名命名的文件夹,里面保存处理的结果。下图就是g6.img对应的输出文件夹,里面的结构如下图所示,我们想要得到图片位于mri文件夹下。
在这里插入图片描述

mri文件夹下的文件如下图所示,其中brainmask.nii.gz是去除头骨后的图像,brainmask_affine.nii.gz是去除头骨且仿射对齐后的图像。
在这里插入图片描述

以下两图是处理前后的结果。
在这里插入图片描述
在这里插入图片描述
但是可以发现上述做法有两个问题,一是无法同时对图像及其对应的label进行仿射对齐,二是在去除脑壳后图像移动过了,这对后续的操作会造成障碍。这两个问题的解决请见第四、五部分。

四、FSL的安装和使用

之所以要用到FSL是因为在对图像进行仿射对齐时,无法同时对图像对应的标签进行相同的仿射对齐操作,而FSL是可以的。FSL的安装和使用同样是在Ubuntu系统下进行的。

1. FSL的安装

# 下载FSL安装包,这里下载的是压缩版
wget http://fsl.fmrib.ox.ac.uk/fsldownloads/fsl-5.0.9-centos6_64.tar.gz
# 新建一个文件夹作为FSL的安装路径,并改变其权限
sudo chmod -R 777 文件夹名
# 将下载好的安装包解压到该文件夹下
tar -zxv -f fsl-5.0.9-centos6_64.tar.gz
# 配置环境变量
vi ~/.bashrc
# 在~/.bashrc文件中追加以下三行
export FSLDIR=FSL文件夹的绝对路径
export PATH=$PATH:$FSLDIR/bin
source $FSLDIR/etc/fslconf/fsl.sh
# 使环境变量立即生效
source ~/.bashrc
# 查看是否安装成功,如果出现版本信息则说明安装成功
flirt -version

2. FSL的使用

据说FSL有界面,但是我这边的服务器使用显示器不方便,所以是用命令行进行的。这里我只使用到了FSL的仿射对齐功能以及将已有的仿射矩阵作用在其他图像上的功能,所以只对这两个命令进行介绍。详细信息见官网

Interpolation :Tri-Linear; Nearest Neighbour

线性配准两幅图像:
flirt -in m_img.nii.gz -ref f_img.nii.gz -out m2f_img.nii.gz -omat m2f.mat -dof 12

其作用是将输入图像按照dof参数指定的方式对齐到参考图像,并保存为out参数指定的图像以及omat参数指定的变换。

其中-in后面是输入图像的名称;-ref后面是参考图像的名称;-out后面是输出图像的名称;-omat后面是变换矩阵的名称,.mat的后缀不是强制的,也可以是别的;-dof是Degrees of Freedom的缩写,即自由度,对于3D到3D的配准来说,12为仿射变换,9为传统变换,7为全局重缩放变换,6为刚体变换,对于2D到2D的配准来说,只有3表示刚体变化这一种。

将保存的变换(transformation)作用在另一张图像:
flirt -in m_label.nii.gz -ref f_img.nii.gz -out m2f_label.nii.gz -init m2f.mat -applyxfm -interp nearestneighbour

其中-init参数是已经保存的变换;-applyxfm表示将已经保存的变换作用在新图像上;-interp nearestneighbour表示使用最近邻插值,最近邻插值可以让label的类别和原来的保持一致,默认是线性插值。

五、FreeSurfer+FSL

(2020.09.23更新)

这一部分我想将FreeSurfer的头骨去除和FSL的仿射对齐结合起来,实现既去除头骨又对图像和label进行仿射对齐,但是上面提到了在用recon-all命令进行颅骨去除的时候图像会产生移动。所以换了一个命令,使用mri_watershed命令,这个命令比recon-all命令速度更快。

import os
import glob


# 使用FreeSurfer对图像进行颅骨剥离
print("FreeSurfer start......\n")
# 图像坐在的目录
#------------------------图像路径需更改------------------------#
path ="/home/syzhou/zuzhiang/Dataset/MGH10/Heads"
# 读取目录下的.img文件列表,*.img表示该目录下所有以.img结尾的文件
#-----------------------图像后缀名需更改--- -------------------#
files = glob.glob(os.path.join(path,"*.img"))
# 输出路径
#------------------------输出路径需更改------------------------#
out_path="/home/syzhou/zuzhiang/MIP/FSL_img/MGH10_results"
print("number: ",len(files))
# 下面为freesurfer的环境配置命令
a = "export FREESURFER_HOME=/home/syzhou/zuzhiang/freesurfer;"
b = "source $FREESURFER_HOME/SetUpFreeSurfer.sh;"
# 数据所在的目录
c = "export SUBJECTS_DIR="+path+";"

for file in files:
    # 将文件路径和文件名分离
    filename = os.path.split(file)[1] # 将路径名和文件名分开
    filename = filename.split(".")[0] # 去除所有扩展名   
    #recon-all是颅骨去除的命令
    # mri_convert是进行格式转换,从mgz转到nii.gz,只是为了方便查看
    filename=filename[:] #根据扩展名的不同,这里需要做更改,只保留文件名即可
    # 当前输出文件路径,以.nii.gz格式保存
    cur_out_path=os.path.join(out_path,filename+".nii.gz")
    print("file name: ",file)
    cmd = a + b + c + "mri_watershed "+file+" "+ cur_out_path
    #print(cmd,"\n")
    os.system(cmd)


# 使用FSL对图像和对应的label进行仿射对齐
print("FSL start......\n")
# fixed图像的路径
#---------------去除头骨后的fixed图像名需更改-------------------#
f_path= os.path.join(out_path,"g1.nii.gz")
# moving图像的路径
m_path=out_path
# label的路径
#-----------------------label路径需更改-----------------------#
label_path="/home/syzhou/zuzhiang/Dataset/MGH10/Atlases"
files=glob.glob(os.path.join(m_path,"*.nii.gz"))
print("number: ",len(files))
for file in files:
    print("file: ",file)
    # 根据图像名找到对应的label名
    filename=os.path.split(file)[1]
    filename = filename.split(".")[0] # 去除所有扩展名
    #---------------------label后缀名需更改--------------------#
    label=os.path.join(label_path,filename+".img")
    # 下面分别是输出图像名/转换矩阵名/label名,
    out_img=os.path.join(out_path,filename+"_img.nii.gz")
    out_mat=os.path.join(out_path,filename+".mat")
    out_label=os.path.join(out_path,filename+"_label.nii.gz")
    # 如果当前文件和fixed图像一样则只将对应label格式转换为.nii.gz
    if f_path==file:
        convert="mri_convert " + label +" " + out_label
        os.system(convert)
        print("continue.........")
        continue    
    # 将moving图像对齐到fixed图像
    flirt_img="flirt -in "+file+ " -ref "+f_path+" -out "+out_img+" -omat "+out_mat+ " -dof 12"
    # 将上一步的仿射变换矩阵作用在图像对应的label上
    flirt_label="flirt -in "+label+" -ref "+f_path+" -out "+out_label+" -init "+out_mat+" -applyxfm -interp nearestneighbour"
    #print(flirt_img,"\n")
    #print(flirt_label,"\n")
    os.system(flirt_img)
    os.system(flirt_label)

print("\n\nEnd")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程 的相关文章

  • ChatGPT的评估指标有哪些?微调与上下文学习是否存在相似性?

    NLP 分很多的任务 不同的任务有不同的指标来度量模型质量 比如AUC Precision Recall是分类模型的度量指标 ChatGPT可以看作一个生成式语言模型 简单说就是给它输入一段文字 它会输出另一段文字 当然输出和输入之间是有关
  • 关于ArithmeticException 异常捕获(double类型的数据除于0为什么是无穷大?)

    关于ArithmeticException 异常捕获 double类型的数据除于0为什么是无穷大 在做实验编写应用程序 从命令行中输入表示两个小数的参数的字符串 求它们的商 要求程序捕获NumberFormatException异常和Ari
  • 测试用例管理工具SynapseRT(jira插件)的具体使用(一)

    话说我们测试团队使用Zephyr进行测试用例管理一段时间后 得到大家的认可 反馈还不错 但我还是觉得它功能太单一 缺点较多 例如提供信息较少 无法记录和跟踪需求 管理人员无法直观了解测试进度等等 为了解决这些问题 我找到了SnapseRT插
  • 基于DVWA的文件上传漏洞测试

    目录 DVWA Low Medium DVWA Low DVWA Security的 low 级别可以直接上传 一句话 木马 1 1 编写测试木马 1 2 没有后缀过滤直接上传 1 3回显上传路径 直接访问即可 http localhost
  • 算法 - 快速排序(C#)

    csharp view plain copy print
  • 分治法 ( Divide And Conquer ) 详解

    文章目录 引言 分治法的范式 递归式 求解递归式的三种方法 代入法 递归树法 主方法 引言 在这篇 blog 中 我首先会介绍一下分治法的范式 接着给出它的递归式通式 最后我会介绍三种方法 代入法 递归树 和主方法 求解递归式 分治法的范式
  • 小程序技术原理分析

    小程序技术原理分析 背景 小程序诞生的技术背景 小程序与普通网页开发的区别 宿主环境 执行环境 小程序架构 一 技术选型 二 双线程模型 三 双线程通信 四 小程序的基础库 五 小程序运行时 运行机制 更新机制 六 性能优化 总结 背景 随
  • 懒加载、热加载(开发者模式)、热部署、预加载、热更新

    热部署 直接重新加载整个应用 生产环境 清空内存重新打包 重新解压war包 热加载 在运行时重新加载class 开发环境 基于字节码的更改 不释放内存开发可用 上线不可用 热加载不重启tomcat 不重新打包 懒加载 延迟加载 实现方法 先
  • 页式存储管理方式

    优点 分页存储管理解决了 内存碎片 问题 提高了资源的利用率 页式存储管理方式的实现思路 将作业分页 物理空间分块 块大小 页大小 将作业的每一页依次装入到物理空间中的块中执行 不要求装入连续的物理块 当所有页全部装入物理块后 才可以运行
  • 华为OD机试真题-核酸检测人员安排【2023Q1】【JAVA、Python、C++】

    题目描述 在系统 网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查 每名采样员的效率不同 采样效率为N人 小时 由于外界变化 采样员的效率会以M人 小时为粒度发生变化 M为采样效率浮动粒度 M N 10 输入保证N 10 的结

随机推荐

  • java对象clone()方法

    java赋值是复制对象引用 如果我们想要得到一个对象的副本 使用赋值操作是无法达到目的的 Test public void testassign Person p1 new Person p1 setAge 31 p1 setName Pe
  • 单目标跟踪算法评价指标

    中心位置误差 center location error CLE 中心位置误差为预测的目标中心和真实的目标中心之间的欧氏距离 以像素为单位 xa ya 表示预测目标中心位置 xb yb 表示真实的目标中心位置 距离精度 diatance p
  • html 编辑框取消默认样式,html5中如何更改、去掉input type默认样式

    1 如何去掉input type date 默认样式 HTML代码 选择日期 选择时间 选择星期 选择月份 目前WebKit下有如下9个伪元素可以改变日期控件的UI webkit datetime edit 控制编辑区域的 webkit d
  • 微信小程序商城项目实战(第三篇:商品列表)

    实现商品列表 利用组件实现 Tabs 组件界面编写
  • JavaWeb会话技术

    1 Cookie对象 cookie是一种会话技术 它用于将会话过程中的数据保存到用户的浏览器中 从而使浏览器和服务器可以更好的地进行数据交互 创建Serlet 创建一个chapter05项目 创建一个自己喜欢的包 在该包中编写一个为Last
  • Linux——netstat

    netstat是一个功能很强大的网络信息统计工具 它可以打印本地网卡接口上的全部连接 路由表信息 网卡接口信息等 我们主要利用的是上述功能中的第一个 即显示TCP连接及其状态信息 毕竟 要获得路由表信息和网卡接口信息 我们可以使用输出内容更
  • Vue项目配置文件(.npmrc、.env、. cz-config.js、commitlint.config.js)

    一 npmrc npmrc 文件位于项目的根目录 即 node modules 和 package json 的兄弟 作为npm运行时的配置文件 registry为npm包注册源地址 legacy peer deps忽略相同modules的
  • django+vue项目搭建,前后端通信打通,

    文章目录 django 环境搭建 1 创建django骨架项目 2 创建应用 3 试着启动项目 验证环境OK 4 基础配置 admin py settings py 前端项目搭建 1 安装vue cli 2 创建前端项目 3 创建时候选什么
  • javascript 纯前端实现汉字转拼音 —— pinyin-pro 库

    一般实现汉字转拼音的功能都是请求服务端 api 实现 而对于一些比较简单的需求 我们可以通过一个 npm 工具包 pinyin pro 纯前端实现中文汉字转拼音的功能 特色功能 支持汉字 词语 句子多种格式输入获取 获取拼音 获取声母 获取
  • vue-quill-editor设置字体大小

    项目中需要用到富文本编辑器 用的Vue 所以选择了vue quill editor这个富文本编辑器 发现字体只有几种大小可以选择 满足不了产品的需求 研究了半天终于改好了 主要是需要更改配置文件 以及对应的CSS和js文件 editor v
  • Open judge程序设计A_分支结构

    include
  • 题目0081-新工号系统

    新工号系统 题目描述 3020年空间通信集团的员工突破20亿人 即将遇到现有工号不够的窘境 现在你负责调研新工号系统 继承历史传统 新的工号系统由小写英文字母a z和数字0 9两部分构成 新工号由一段英文字母开头 之后跟随一段数字 比如 a
  • 因果2-潜在结果框架

    因果2 潜在结果框架 摘要 从因果到统计 我们需要走多久 上一章我们从因果和统计学的关系出发 初步了解了一个经典因果框架 潜在结果框架 今天我们继续学习这个框架 图1是上周我们留下的 吃药治头疼 的数据表格 我们如何从该表格中求出平均处理效
  • 深入探索 Dubbo 的 AOT 技术及其技术演进历程

    引言 随着云原生和微服务架构的兴起 高性能和低延迟成为了开发者们的关注重点 在 Java 生态系统中 Spring 和 Dubbo 是两个备受青睐的框架 它们为开发者提供了强大的功能和灵活性 为了进一步提升性能 Dubbo 团队引入了 AO
  • 开发工具之 Snipaste(超级截图工具)

    snipaste工具是一款开源免费的超级截图工具 这里小编强烈推荐此工具的使用 前言 当你使用ALT TAB习惯性的来回切屏的时候 其实在这个过程中 仔细想想是不是比较累 这样子做久了很容易导致疲劳 所以小编强推贴图功能 好了废话不多说 直
  • 5 insanely great books about mathematics you should read.

    本文转载至 http wp kjro se 2013 12 27 5 insanely great books about mathematics you should read 翻译请参考 http blog jobbole com 55
  • Android Studio 无法打开虚拟机

    Emulator PANIC Cannot find AVD system path Please define ANDROID SDK ROOT 刚安装好Android Studio 却发现无法打开虚拟机 报错信息为 Emulator P
  • Kafka:主题创建、分区修改查看、生产者、消费者

    文章目录 Kafka后台操作 1 主题 2 分区 3 生产者 4 消费者组 Kafka后台操作 1 主题 1 创建主题 bin kafka topics sh create bootstrap server hadoop102 9092 r
  • JavaScript 取消默认事件、阻止事件冒泡的方法

    首先页面上创建一个a标签 a href 默认事件 a 然后给body加一个点击事件 document body nclick function alert body 当我点击这个a标签的时候会有两个我们不想发生的事情 1 浏览器地址尾部出现
  • FreeSurfer和FSL的安装和使用(脑部图像去除头骨+对图像和label同时进行仿射对齐)教程

    FreeSurfer当前只支持Linux系统和Mac OS 我所使用的系统是Ubuntu 16 0 4 FreeSurfer的安装耗时较小 但是在处理时耗时较长 可能需要数个小时 甚至一天 这个取决于机器性能 但是和GPU好像没太大关系 下