IXI数据预处理 + Linux + freesurfer

1. freesurfer下载安装测试

1.1 下载受阻,安装axel-2.4,多线程下载

由于网络网速受阻,一直无法下载,总是中断。于是我在linux 上安装axel -2.4 插件,支持多线程下载。
参考:axel-2.4 安装教程。共计13个小时,下载完成。

1.2 安装

参考:
freesurfer 安装参考1
freesurfer安装参考2

1.3 安装时出现的问题

输入sudo gedit /etc/profile
出现错误:Unable to init server: Could not connect: Connection refused
原因,使用的vscode 远程连接ubuntu 服务器,不支持图形界面,改为vi或者nano
ubuntu vi 打开编辑内容后,如何保存
Ubuntu vi 打开后 如何换行
Ubuntu移动和复制文件夹到另一个文件夹

1.4 测试

安装测试freesurfer

1.5 使用前注意

(1)更改 .bashrc
不要在root 下的ect/.bashrc ,在个人的/home/自己的环境名/.bashrc
(2)每次使用之前都要设置环境变量
linux freesurfer

export FREESURFER_HOME=/usr/local/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

2. freesurfer 处理IXI

2.1 freesurfer 的使用

参考1
freesurfer 中文教程
freesurfer recon-all 讲解

2.2 从零开始处理IXI

2.2.1 命令行skull_stripping 单个.nii文件

安装tcsh ,因为freesurfer 的recon-all 要求在tcsh 下运行

sudo apt-get install tcsh 

由于在个人的/home/xukepeng/.bashrc 添加了

export FREESURFER_HOME=/usr/local/freesurfer
source $FREESURFER_HOME/SetUpFreeSurfer.sh

每次打开bash
在这里插入图片描述
每次使用之前都要 修改 SUBJECTS_DIR

export SUBJECTS_DIR=/data/../Learn/pytorch/IXI_T1——single

测试一个.nii文件的处理

recon-all -i pytorch/IXI_T1/*.nii -autorecon1 -subjid output

会在SUBJECTS_DIR路径下自动生成output 文件夹
在这里插入图片描述
处理一份.nii文件,共计13分钟

2.2.2 分析处理完成后的文件

在这里插入图片描述
output/mri/brainmask.mgz 为生成的去除头骨后的图像
output/mri/transforms/talairach.xfm为仿射对齐矩阵
将.mgz转为.nii.gz 方便查看

mri_convert brainmask.mgz brainmash.nii.gz

远程显示.nii

import SimpleITK as itk 
from matplotlib import pyplot as plt 

def show_nii(img):
    slices=1
    for i in range(0,img.shape[0],10):#注意这里的间隔选取,需要参考img.shape=[256,256,256]
        plt.subplot(6,5,slices) #注意这里不能天i+1,因为i是以10增加
        plt.imshow(img[i,:,:],cmap='gray')
        plt.axis('off')
        slices+=1 
        
itk_img=itk.ReadImage('../Learn/pytorch/IXI_T1/output/mri/brainmash.nii.gz')
img=itk.GetArrayFromImage(itk_img)

show_nii(img)
plt.savefig('IXI_skull-stripped.jpg')
plt.show()

在这里插入图片描述

2.2.3 仿射对齐.nii

绝对路径,打点只是我个人为了隐去名字

cd /data/../pytorch/IXI_T1_single/output/mri
export SUBJECTS_DIR=/data/../pytorch/IXI_T1_single/output

运行:注意要指定生成的文件类型,否则报错

mri_convert brainmask.mgz --apply_transform /transforms/talairach.xfm -o /mri/brainmask_affine.mgz

brainmask_affine.mgz 在

/data/../Learn/pytorch/IXI_T1_single/output/mri/brainmask_affine.mgz

2.2.4 批量处理IXI

tar -xvf 文件名 -C 存到指定路径

批量移动文件夹

mv *.nii.gz /data/../Learn/voxelmorph/IXI_T1

screen 操作
os.path.split 分离路径和当前文件名
os.path.splitext 分离文件名和后缀
cmd & 与 && 区别

import os
import glob
images=glob.glob('/data/../Learn/voxelmorph/IXI_T1/*.nii.gz')
#print(images) #返回一堆路径
(filepath,tempfilename)=os.path.split(images[0])
print(filepath)
print(tempfilename)
(filename,extension)=os.path.splitext(tempfilename)
print(filename)
print(extension)
print(filename[:-4])

每一个单独的.nii.gz 处理后都有单独的文件夹存储

2.2.5 批skull_stripping

import os
import glob
path=r"/data/../Learn/voxelmorph/IXI_T1/"
#读取目录下的nii.gz文件
images=glob.glob('/data/../Learn/voxelmorph/IXI_T1/*.nii.gz')
#为freesurfer环境配置命令
a="export FREESURFER_HOME=/usr/local/freesurfer;"
b="source $FREESURFER_HOME/SetUpFreeSurfer.sh;"
#数据所在目录
c="export SUBJECTS_DIR=/data/../Learn/voxelmorph/IXI_T1;"

for image in images:
    #将文件路径与文件名分离
    (filepath,tempfilename)=os.path.split(image) #返回文件的路径和文件名
    (filename,extension)=os.path.splitext(tempfilename)
    #freesurfer环境配置,颅骨去除,未仿射对齐.mpz转.nii,仿射对齐,仿射对齐.mpz转.nii
    cmd = a + b + c \
        # + "recon-all -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)
#程序中断

2.2.5 批修改文件brainmask_affine.mgz类型为brain_aff.nii.gz

python 读取不同文件夹下相似的文件名
glob 结合通配符星号(*)、问号(?)和中括号 使用
格式化命名format

import os
import glob
import sys
"""
1.修改文件类型为brain_aff.nii.gz  #不能直接放到train_vol 会被覆盖
"""
path=r"../Learn/voxelmorph/IXI_T1/"#错误,少了单斜杠
images=glob.glob('../Learn/voxelmorph/IXI_T1/*.nii.gz')# 读取
#print(images)
a="export FREESURFER_HOME=/usr/local/freesurfer;"
b="source $FREESURFER_HOME/SetUpFreeSurfer.sh;"
#数据所在目录
c="export SUBJECTS_DIR=../project/Learn/voxelmorph/IXI_T1;"

for image in images:
    #filename=image[48:54]
    #print(filename)
    (filepath,tempfilename)=os.path.split(image) #返回文件的路径和文件名
    (filename,extension)=os.path.splitext(tempfilename)
    cmd = a+b+c+ "mri_convert " + path + filename[:-4] + "/mri/brainmask_affine.mgz " + path +filename[:-4]+"/mri/brain_aff.nii.gz"
    os.system(cmd)

2.2.6 批量修改文件名,移动到同一个文件夹,并重命名

import os
import glob

"""
1。批量修改文件名
2.移动到同一文件夹下
"""
#path=r"/data/../Learn/voxelmorph/IXI_T1/"
#获得编号名
#filename_list=glob.glob('/data/../Learn/voxelmorph/IXI_T1/*.nii.gz')
path_list=glob.glob('/data/../Learn/voxelmorph/IXI_T1/*T1/mri/*.nii.gz')
""""给../mri/brain_aff.nii.gz更名"""
#print(len(path_list))
# a=0
# for i in path_list:
#     used_name=path_list[a]+os.sep+'mri/brain_aff.nii.gz'
#     print(ssss)
#     new_name=path_list[a]+os.sep+'mri/sub_'+str(a)+'.nii.gz'
#     print(ssssss)
#     os.rename(used_name,new_name)
#     a+=1
"""复制到文件夹train_vol"""
# for path in path_list:
#     (filepath,tempfilename)=os.path.split(path)
#     print(filepath)
#     print(tempfilename)
#     cmd="cd "+filepath+";"+"sudo cp " + tempfilename+ " /data/../Learn/voxelmorph/IXI_T1/train_vol/"
#     os.system(cmd)
"""格式化命名1 -> 001 , 数字补0"""
#path=input('/data/../Learn/voxelmorph/IXI_T1/train_vol/')
file_list=os.listdir(os.getcwd())
#print(len(file_list))
n=0
for f in file_list:
    (filename,extension)=os.path.splitext(f)
    oldname=os.getcwd()+os.sep+file_list[n]
    num=filename[4:-4]
    #print(name)
    num='{:0>3}'.format(num) #补齐
    #print(num)
    newname=os.getcwd()+os.sep+'sub-'+str(num)+'.nii.gz'
    os.rename(oldname,newname)
    print(n)
    n=n+1

总结

作为小白入门笔记记录,上面的代码基本都测试通过,或许存在更为简单的方法,也可能存在错误,欢迎指正

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值