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