使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐

本文是在原链接https://blog.csdn.net/qq_38302885/article/details/94045126
的基础上,增加的一些补充,对新入门的同学可能有一些启发。

更新日志

2020.8.25更新:

  • 完善freesurfer的下载链接和教程
  • freesurfer处理代码recon-all后面增加-parallel,可以使用多线程(感谢评论区mamemory同学指出)
  • 增加预处理后裁剪的代码

Freesurfer安装:

1、下载
https://surfer.nmr.mgh.harvard.edu/fswiki/rel7downloads
使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐_第1张图片

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.csdn.net/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是去除头骨且仿射对齐后的图像。
使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐_第2张图片

裁剪和归一化

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

使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐_第3张图片

欢迎交流。

你可能感兴趣的:(voxelmorph,python,linux,深度学习)