本文是在原链接https://blog.youkuaiyun.com/qq_38302885/article/details/94045126
的基础上,增加的一些补充,对新入门的同学可能有一些启发。
更新日志
2020.8.25更新:
- 完善freesurfer的下载链接和教程
- freesurfer处理代码recon-all后面增加-parallel,可以使用多线程(感谢评论区mamemory同学指出)
- 增加预处理后裁剪的代码
Freesurfer安装:
1、下载
https://surfer.nmr.mgh.harvard.edu/fswiki/rel7downloads
2、Licence:
前往官方注册网站进行注册,正确填写邮箱地址,其他信息随意,后面将会收到一封含有附件license.txt的电子邮件,下载下来,放到freesurfer文件夹下面。
http://surfer.nmr.mgh.harvard.edu/registration.html
3、安装
官方安装教程:
https://surfer.nmr.mgh.harvard.edu/fswiki//FS7_linux
中文教程请参考:
https://blog.youkuaiyun.com/uinglin/article/details/79541063
4、安装tcsh
sudo apt-get install tcsh
完成后输入tcsh,不报错的话就没问题了。
使用Freesurfer进行头骨去除和仿射对齐
下面介绍安装好freesurfer后,利用python批处理整个IXI-T1文件夹下所有nii文件的颅骨去除和仿射对齐操作。
测试平台为Ubuntu 16.04,python 3.7,理论上在其他linux环境也能用。
import os
import glob
#请将该路径更改为IXI-T1的原始文件路径
path = r"/run/media/feng/98B216BDB216A034/datasets/IXI-T1/"
# 读取目录下的nii.gz文件
images = glob.glob('/run/media/feng/98B216BDB216A034/datasets/IXI-T1/*.gz*')
# 下面为freesurfer的环境配置命令
a = "export FREESURFER_HOME=/home/feng/freesurfer;"
b = "source $FREESURFER_HOME/SetUpFreeSurfer.sh;"
# 数据所在的目录
c = "export SUBJECTS_DIR=/run/media/feng/98B216BDB216A034/datasets/IXI-T1;"
for image in images:
# 将文件路径和文件名分离
(filepath, tempfilename) = os.path.split(image)
(filename, extension) = os.path.splitext(tempfilename)
# freesurfer环境配置、颅骨去除、未仿射对齐mpz转nii、仿射对齐、仿射对齐mpz转nii.gz格式
cmd = a + b + c \ #根据评论有同学反映,recon-all后面增加parallel使用多线程
+ "recon-all -parallel -i " + image + " -autorecon1 -subjid " + filename[:-4] + "&&" \
+ "mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz /" + path + filename[:-4] \
+ "/mri/brainmask.nii.gz;"\
+ "mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz --apply_transform /" + path + filename[:-4] \
+ "/mri/transforms/talairach.xfm -o /" + path + filename[:-4] + "/mri/brainmask_affine.mgz&&" \
+ "mri_convert /" + path + filename[:-4] + "/mri/brainmask_affine.mgz /" + path + filename[:-4] \
+ "/mri/brainmask_affine.nii.gz;"
os.system(cmd)
cmd
部分代码说明:
- 第一条
"recon-all -parallel -i " + image + " -autorecon1 -subjid " + filename[:-4]
是颅骨去除的命令; - 第二条
"mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz /" + path + filename[:-4] + "/mri/brainmask.nii.gz;"
是格式转换,为了方便查看,将未进行仿射对齐的图像,从mgz转到nii.gz; - 第三条
"mri_convert /" + path + filename[:-4] + "/mri/brainmask.mgz --apply_transform /" + path + filename[:-4] + "/mri/transforms/talairach.xfm -o /" + path + filename[:-4] + "/mri/brainmask_affine.mgz"
进行仿射对齐--apply_transform
参数是关键。 - 第四条
"mri_convert " + path + filename[:-4] + "/mri/brainmask_affine.mgz /" + path + filename[:-4] + "/mri/brainmask_affine.nii.gz;"
转格式,将仿射对齐后的mgz转为nii.gz。
整个颅骨去除的过程较慢,根据评论有同学反映,recon-all
后面增加-parallel
,可以使用多线程加快处理速度。单线程全部转完可能要几天的时间。
请参考http://132.183.240.105/fswiki/ReleaseNotes
请在该网页查找 -parallel
以查看相关内容。
处理后的文件如下所示,其中brainmask.nii.gz
是去除头骨后的图像,brainmask_affine.nii.gz
是去除头骨且仿射对齐后的图像。
裁剪和归一化
import glob
import os
import nibabel as nib
#找出IXI-affine下面的所有含有-T1结尾的文件夹路径,请修改该路径
images = sorted(glob.glob('/media/sky/D/DataSet/IXI-affine/*-T1*'))
for image in images:
#再在该路径下找到子文件夹./mri/ 下含nii.gz的文件
pic = sorted(glob.glob(image + "/mri/*_affine.nii.gz*"))
#用nib读入nii文件
vol = nib.load(pic[0]).get_data()
#归一化
vol = vol / 255
#裁剪成160 x 192 x 224
vol = vol[48:-48, 31:-33, 3:-29]
#生成nii文件并保存
newvol = nib.Nifti1Image(vol, affine=None)
print(newvol.shape)
print(image.split('/')[-1] + '.nii.gz')
nib.save(newvol, '/media/sky/D/DataSet/train/' + image.split('/')[-1] + '.nii.gz')
图片查看
nii.gz文件查看可以使用ITK-SNAP
欢迎交流。