当前位置:   article > 正文

使用fsl工具箱批量预处理sMRI图像过程_fsl配准

fsl配准

使用fsl处理sMRI数据过程

数据来源:ADNI数据库
图像类型:sMRI数据
处理工具:fsl工具箱
学习记录,不保证全对,更不是权威教程,谨慎观看

1. 数据获取

ADNI数据库
数据类型:sMRI数据
如果需要完全的一致性尝试,我上传了这些图片(百度网盘链接)

2. 数据处理

使用工具:fsl工具箱
下载地址:官方下载地址
mac系统:下载fslinstaller.py文件后终端运行
windows系统:下载虚拟机后参照mac系统终端运行

这玩意下载抽象至极,建议使用大家都知道的方式加速下载。
同时卡住进度2小时内不变建议重下,卡100进度2小时不变说明太倒霉(进度条100后仍有下载进行)
建议早上下载,成功率更高
实在下载不了可以离线包安装,但是问题不少,我没尝试过(因为我找不到)

2.1 颅骨剥离(非脑组织剥离)

原图脑组织周围存在颅骨、下颚等没有意义的结构,徒增计算负担增加模型噪声。因此对于sMRI图像的第一步处理:非脑组织剥离

注意:fsl工具箱要的是nii格式的图片,但是我并没有从fsl上找到转换dicom格式的工具包,这很奇怪,多半是我没找到。可以用别的工具转换

2.1.1 Bet Brain Extraction:
  • linux命令行形式
  • GUI界面操作
    以下先采用GUI界面操作(注意,GUI界面不支持批量处理,需要批量处理例子的直接看第三部分)
2.1.2 实验记录
  1. 在fsl的GUI界面中点击 FSLeyes打开图片预览窗口

  2. 左上角file -> add from file 加载图片
    加载如下
    未处理图像

  3. 在fsl的GUI界面点击bet Brain extraction打开脑组织剥离页面
    Bet Brain Extraction GUI界面
    选项用途:

    • Input image:设置输入文件目录

    • Output image:设置输出文件目录

    • Fractional intensity threshold:分数强度阈值

      阈值默认:0.5

      • 增大阈值:使得保留的脑组织变小
      • 减小阈值:使得保留的脑组织变大
    • Advanced options

      bet2为bet颅骨剥离的附加选项,在命令行中不能共同调用。
      修改选项将能选取bet2中提供的更多附加选项,它们分别是

      • 生成覆盖在原始图像上的脑表面轮廓
      • 生成二进制大脑掩码
      • 生成粗略的头骨图像(不如betsurf生成的图像干净)
      • 不生成默认的大脑图像输出
      • 分数强度阈值(0->1);默认值=0.5;较小的值给出较大的大脑轮廓估计
      • 分数强度阈值的垂直梯度(-1->1);默认值=0;正值在底部显示更大的大脑轮廓,在顶部显示更小的大脑轮廓
      • 头部半径(mm而非体素);初始曲面球体设置为该值的一半
      • 初始网格表面的重心(体素而非mm)。
      • 将阈值法应用于分割的脑图像和掩模
      • 将大脑表面生成.vtk格式的网格
    • 下拉菜单Run standard brain extraction using bet2 :

      • Run standard brain extraction using bet2:使用bet运行标准的脑组织提取流程
      • Robust brain center estimation(iterates bet2 several times):更强大的脑中心估计(使用bet迭代若干次,使得剥离能尽可能的靠近脑区)
      • eye & optic nerve cleanup (can be useful in SIENA):眼部以及视神经清除
      • bias field & neck clean up(can be useful in SIENA):偏置场以及颈部清除(脖子部分很多的话)
      • improve bet if FOV is very small in Z:改进后的bet(如果FOV中的Z很小)
      • apply to 4D fMRI data:应用于4d fMRI数据类型
      • run bet2 and then betsurf to get additional skull and scalp surfaces:同时运行bet2以及betsurf以获取额外的颅骨以及头皮表面
      • As above, when also feeding in non-brain-exracted T2:(额,我也不知道是干嘛的 )

    对于图片4388选择原始图片
    依次选择下拉菜单:

    • Robust brain center estimation(iterates bet2 several times)
    • bias field & neck clean up(can be useful in SIENA)
      得到图像如下
      4388原始图片robust后neck
      可以看到去除了太多脑组织

    对于图片4388选择裁切后的图片(在转换为nii时工具进行),直接robust

    得到图片如下:
    4388裁切后robust建议多次实验选择合适的处理方式
    至此颅骨剥离完成
    一些题外话
    剥离阈值:0.5,可以调整大小,前面提到更小可以保留更多一些脑组织,反之更大可以消除更多“非”脑组织。当然,各位可以自己试试,实际上调整这个参数的意义很小。在fsl官方Q&A中提到了这个问题,即使调整它也不见得有效。比如如果获取的图像有很多的非脑组织颈部之类的,把这个值调高也达不到一个好的效果。事实上处理方式中可以选择颈部剥离,而单独调整每一张图像的阈值也是不切实际的行为。

2.2 配准

每个被试的脑子有大有小,拍摄的过程不是完全静止,甚至不是连贯的(拍一段然后出去再回来都是可能的),因此对于mri图像的组分析需要进行一些列的配准,所谓配准指的是将一组的图像按照一个标准的空间进行拟合,使得得到的图像能够在一个相对统一的“形状”下进行训练,排除额外的影响因素

截了两张图方便理解
线性配准
可以看到,红色代表的是图像空间,一般指的是MNI152(找的152个人来建立的坐标空间,这不重要,图像空间可以有很多)。灰色的指的是待配准图像
线性配准:对于图像中的每一个体素都采取操作,一般是配准的第一步,先有线性配准才有非线性配准
非线性配准:对于图像中的特定体素采取操作,一般是进一步纠正线性配准中的一些不太合理的地方,比如中间那个“X”(理解一下,不是学医的),在线性配准过程中可能导致形变,因此完善的配准过程应当包含非线性配准对其进行一定的纠正。
配准过程
这张图形象展全部的配准过程

  • Before Registration: 未配准状态

    正如之前所说,组分析之间需要消除个体之间的非重要因素差距(东倒西歪的,大小不一的)

  • Linear Registration: 线性配准

    对所有体素采取的一系列变化,使得个体之间相对一致(因为所有体素的形变可能导致别的偏差)

  • NoLinear Registration: 非线性配准

    对个别体素采取一系列的变化,消除因为所有体素形变导致的偏差(看中间那个x)

2.2.1 线性配准:

FLIRT指令:仍以GUi界面说明
FLIRT界面

依次说明:

  • 选项:
    • Mode:模式,即实现线性配准的模式,有两个
      1. 将输入图像(普通图像)配准到参考图像上(一般用这个)
      2. 将输入图像(低分辨率图像)超采样后配准到参考图像上,再将这个超采样的图像作为新的参考图像,将原图像配准到高分辨率副本后得到参考图像的低分辨率版本
    • Reference image:参考图片,也就是图像空间的样本图像,这里选取之前所说的MNI152
    • Input image/Output image
    • Number of secondary images to apply transform to :不懂捏
    • Model/DOF:转换类型,线性配准的“拉扯图像”的方式,允许设置不同的模式以允许线性配准在“拉扯图像”时使用的自由度的数量
      1. 12:仿射变化(没什么问题就允许更为细致的图像变化)
      2. 9:传统变化
      3. 7:全局缩放
      4. 6:刚体变化
      5. 特别的,2d图像转换只允许3个自由度的刚体变化

线性配准后结果如下:
可以看到4张图像都固定在了相同的坐标空间中
需要注意的是,如果没有进行线性配准,图像坐标将显示的是各自采样时的坐标,基本上没有意义,只有显示下图所示才代表图像完成了配准
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.批量处理

上面熟悉fsl用法后,不要使用GUI界面。因为没法批量处理,可以一张张检查,但是推荐不要一张张导入brain Extraction处理

使用命令行方式处理
上文列出了常用的,演示全过程如下
打开终端键入bet2
bet基本用法
基本用法为: bet2 ‘输入路径’ ‘输出路径’ -参数
那么处理一张图像的例子为:

bet /Users/yaoaileijiangbaobao/Downloads/CN/T1Img/153_S_4125/
MPRAGE_MPRAGE_20110720084315_2_Crop_1.nii /Users/yaoaileijiangbaobao
/Downloads/CN/brain -R
  • 1
  • 2
  • 3

bet,而不是bet2,这好像是个互斥选项。bet2会直接报错
也可以使用:
bet2 ‘输入文件夹’ ‘输出文件夹’ -f 0.5(也可以什么都不打,空着,默认使用的就是-f 0.5输出颅骨剥离的结果)

批量处理需要使用shell脚本,可以在这个基础上改

#!/bin/bash

# 设置输入和输出目录
input_dir="/Users/yaoaileijiangbaobao/Downloads/CN/merged_files"
output_dir="/Users/yaoaileijiangbaobao/Downloads/CN/brain"

# 遍历输入目录中的所有文件
for file in ${input_dir}/*; do
    echo "Processing: ${file}"
    # 提取文件名和扩展名
    filename=$(basename "$file")
    extension="${filename##*.}"

    # 检查文件扩展名是否是图像文件(如.nii) 或者,你自己的文件名后缀是nii.gz,自己加上就行
    if [[ "$extension" == "nii" ]]; then
        # 构建输出文件路径
        output_file="${output_dir}/${filename%.nii.gz}_brain.nii"

        # 使用bet命令进行脑提取
        # 如果不想用robust也可以自己改,-R对应的就是Robust
        bet "$file" "$output_file" -R -f 0.5

        echo "Finished processing ${filename}"
    fi
    # 报错的,done后面别有空行
done
  • 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

执行步骤:

  1. 打开终端
  2. cd 'shell.sh’所在的路径
  3. 键入 'chmod +x shell.sh’赋予脚本执行权限
  4. 将所有的图像文件统一到一个文件夹

    使用一个python脚本实现就行

实现图片文件移动的python脚本 folder_create.py

import os
import shutil

# 主文件夹路径
main_folder = "/Users/yaoaileijiangbaobao/Downloads/CN/T1Img"

# 创建一个目标文件夹来保存合并后的文件
output_folder = "/Users/yaoaileijiangbaobao/Downloads/CN/merged_files"
os.makedirs(output_folder, exist_ok=True)

# 遍历主文件夹中的所有子文件夹
for subdir, dirs, files in os.walk(main_folder):
    # 检查子文件夹是否包含'Crop_1.nii'文件
    nii_files = [f for f in files if f.endswith('Crop_1.nii')]
    
    if nii_files:
        # 如果子文件夹包含'Crop_1.nii'文件,将它们移动到目标文件夹
        for nii_file in nii_files:
            source_path = os.path.join(subdir, nii_file)
            destination_path = os.path.join(output_folder, nii_file)
            shutil.copy2(source_path, destination_path)

print("Files merged successfully.")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
cd python文件所在的目录
python folder_create.py
  • 1
  • 2
  1. 执行shell脚本
./shell.sh
  • 1

4. 完成

再次声明,有错误的话多半是我错

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/98173
推荐阅读
相关标签
  

闽ICP备14008679号