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

article/2025/11/5 7:47:37

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 globpath = 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.gzif f_path==file:convert="mri_convert " + label +" " + out_labelos.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")

http://chatgpt.dhexx.cn/article/2Ce6Mdu7.shtml

相关文章

FreeSurfer的安装及使用(个人踩坑记录)

一、环境要求 目前只支持在Linux和MacOS系统,虽然可以用 -parallel 进行多线程处理,但基本消耗的是CPU内存。 二、FreeSurfer的下载与安装 1. 下载安装包 官网链接:rel7downloads - Free Surfer Wiki 根据自己系统型号下载对应安装包&am…

【数学建模】统计回归模型

一、 多元线性回归 matlab统计工具箱 [b,bint,rint,stats]regress(y,x,alpha) 输入 y~n维数据向量数据矩阵,第1列为全1向量alpha(置信水平,0.05) 输出 b~β的估计值bint~b的置信区间r~残差向量y-xbrint~r的置信区间(置信区间包含0则对y的影响不太显…

统计学习模型——决策树

决策树学习的三个步骤:特征选择、决策树的生成和决策树的修剪 一、决策树模型(分类与回归方法) 1.1 基本概念 决策树可为多叉树,是描述对实例进行分类的树形结构决策树由结点和有向边组成。其中结点又分为:内部结点…

机器学习的概率统计模型(附代码)(一)

目录 概率论 1.1 离散随机变量分布 1)伯努利分布 2)二项分布 3)泊松分布 1.2 连续随机变量分布 1)均匀分布 2)指数分布 3)正态分布 总结 系列文章目录 概率论 概率论,是研究随机现象数量规…

【统计模型】缺失数据处理方法

目录 一、缺失数据定义 二、缺失数据原因 三、缺失数据处理步骤 四、数据缺失机制 1.完全随机缺失(MCAR) 2.随机缺失(MAR) 3.非随机、不可忽略缺失(NMAR) 五、缺失数据处理方法 1.直接删除 2.缺失值…

数学统计建模

数据预处理 数据清洗 无量纲处理 检验数据来自哪个分布 正态分布检验 K-S检验的P值检验正态性 非正态数据处理 数据偏态处理 BOX-COX变换 成分数据处理 clr变换 ilr变换 logit变换 属性数据 相关性检验 假设检验方法使用时应首先判断数据是否为正态数据。如果是&#x…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多,样本总量n越大越好——>保证拟合效果更好,预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

统计模型分类

传统统计模型->回归模型(可解决过去和预测未来) 数据挖掘模型->决策树、神经网络等(只能预测未来) 横截面模型:多元回归,逻辑回归,托宾回归(涉及到泊松分布) 向量…

(R语言)R的统计模型

1定义统计模型的公式 下面统计模型的模板是一个基于独立的方差齐性数据的线性模型 用矩阵术语表示,它可以写成 其中y是响应向量,X是模型矩阵(model matrix)或者设计矩阵(design ma- trix)。X的列 是决定变…

【统计学习方法】模型评估与模型选择

一、训练误差与测试误差 首先引入误差的概念,误差(error)是指:学习器的实际预测输出与样本的真实输出之间的差异。类似地,学习器在训练集上的误差被称之为训练误差(training error)或者经验误差…

statsmodels︱python常规统计模型库

之前看sklearn线性模型没有R方,F检验,回归系数T检验等指标,于是看到了statsmodels这个库,看着该库输出的结果真是够怀念的。。 文章目录 1 安装2 相关模型介绍2.1 线性模型2.2 离散选择模型(Discrete Choice Model, DCM)2.3 非参数…

数学建模——统计回归模型

前言:看完数学建模的统计回归模型,更是感到了数学建模的“细腻”之处,对比与机器学习,如果说机器学习像是“打一场仗”,那数学建模更是像“做一场手术”,一个简单的回归问题也可以从中感觉到他“细腻”的美…

统计模型 | 学习笔记

一.概述 任何统计模型都是对现实世界复杂联系的简化 根据目的分类 聚类方法(细分类模型):市场细分,协同推荐 预测方法:回归模型,时间序列模型 关联归纳方法:购物篮分析,序列分析…

七大统计模型

一、多元回归 1、概述: 在研究变量之间的相互影响关系模型时候,用到这类方法,具体地说:其可以定量地描述某一现象和某些因素之间的函数关系,将各变量的已知值带入回归方程可以求出因变量的估计值,从而可…

03 常用统计模型简述

逻辑回归模型(LR) 原理:分类模型,依据逻辑斯蒂分布,将线性模型转化为逻辑回归模型,使结果分布0~1之间。 前置条件: 自变量为连续变量,分类变量转为虚拟变量(哑变量)使用 自变量与因…

不可不知的七大统计模型

一、多元回归 1、概述: 在研究变量之间的相互影响关系模型时候,用到这类方法,具体地说:其可以定量地描述某一现象和某些因素之间的函数关系,将各变量的已知值带入回归方程可以求出因变量的估计值,从而可…

数学建模笔记(十一):统计模型(MATLAB计算,函数参数解释待补充)

文章目录 一、概述二、参数估计——区间估计1.糖果称重(求总体均值 μ \mu μ的双侧置信区间)(一)根据公式计算结果(二)直接使用 t t e s t ( ) ttest() ttest()函数 2.灯泡寿命( μ \mu μ的单…

scss和sass的区别,scss的基本使用

scss的官方文档 https://www.sass.hk/ sass和scss有什么关系? 1、sass和scss其实是一样的css预处理语言,SCSS 是 Sass 3 引入新的语法,其后缀名是分别为 .sass和.scss两种。 2、SASS版本3.0之前的后缀名为.sass,而版本3.0之后…

vue 安装 scss

安装scss (安装sass-loader node-sass 前者依赖于后者) sass-loader:把 sass编译成css node-sass:nodejs环境中将sass转css npm install sass-loader --save-dev npm install node-sass --sava-dev 安装指定版本:当由于版本过高报错时&#…

scss、sass 和 css 的区别

项目中,会经常使用诸如scss、sass的style样式,它们和css有什么区别呢? less大家应该都不陌生,同样的scss、sass一样,它们都可以称为:CSS预处理器语言。 简单来说,scss和sass的区别,就…