• 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
    
    • 1
    • 2

    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 
    
    • 1

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

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

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

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

    测试一个.nii文件的处理

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

    会在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
    
    • 1

    远程显示.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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    2.2.3 仿射对齐.nii

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

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

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

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

    brainmask_affine.mgz 在

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

    2.2.4 批量处理IXI

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

    批量移动文件夹

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

    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])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    每一个单独的.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)
    #程序中断
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    总结

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

  • 相关阅读:
    “酷暑”结束,程序员待在大型互联网公司能一直安逸下去?
    nginx中deny和allow详解
    Android调用相机拍照,展示拍摄的图片
    java计算机毕业设计双峰县在线房屋租售网站源代码+数据库+系统+lw文档
    全志V3S开发板星光闪烁(linux LED驱动)
    dubbo学习之本地存根实践
    1.32 Cubemx_canfestival对象字典生成工具环境搭建
    Unreal Engine 学习笔记 (2)—— 走跑切换
    Hadoop的由来、Block切分、进程详解
    JAVA:实现Floyd Triangle弗洛伊德三角算法(附完整源码)
  • 原文地址:https://blog.csdn.net/Emily_Buffy/article/details/127721905