赞
踩
数据来源:ADNI数据库
图像类型:sMRI数据
处理工具:fsl工具箱
学习记录,不保证全对,更不是权威教程,谨慎观看
ADNI数据库
数据类型:sMRI数据
如果需要完全的一致性尝试,我上传了这些图片(百度网盘链接)
使用工具:fsl工具箱
下载地址:官方下载地址
mac系统:下载fslinstaller.py文件后终端运行
windows系统:下载虚拟机后参照mac系统终端运行
这玩意下载抽象至极,建议使用大家都知道的方式加速下载。
同时卡住进度2小时内不变建议重下,卡100进度2小时不变说明太倒霉(进度条100后仍有下载进行)
建议早上下载,成功率更高
实在下载不了可以离线包安装,但是问题不少,我没尝试过(因为我找不到)
原图脑组织周围存在颅骨、下颚等没有意义的结构,徒增计算负担增加模型噪声。因此对于sMRI图像的第一步处理:非脑组织剥离
注意:fsl工具箱要的是nii格式的图片,但是我并没有从fsl上找到转换dicom格式的工具包,这很奇怪,多半是我没找到。可以用别的工具转换
在fsl的GUI界面中点击 FSLeyes打开图片预览窗口
左上角file -> add from file 加载图片
加载如下
在fsl的GUI界面点击bet Brain extraction打开脑组织剥离页面
选项用途:
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选择原始图片
依次选择下拉菜单:
对于图片4388选择裁切后的图片(在转换为nii时工具进行),直接robust
得到图片如下:
建议多次实验选择合适的处理方式
至此颅骨剥离完成
一些题外话:
剥离阈值:0.5,可以调整大小,前面提到更小可以保留更多一些脑组织,反之更大可以消除更多“非”脑组织。当然,各位可以自己试试,实际上调整这个参数的意义很小。在fsl官方Q&A中提到了这个问题,即使调整它也不见得有效。比如如果获取的图像有很多的非脑组织颈部之类的,把这个值调高也达不到一个好的效果。事实上处理方式中可以选择颈部剥离,而单独调整每一张图像的阈值也是不切实际的行为。
每个被试的脑子有大有小,拍摄的过程不是完全静止,甚至不是连贯的(拍一段然后出去再回来都是可能的),因此对于mri图像的组分析需要进行一些列的配准,所谓配准指的是将一组的图像按照一个标准的空间进行拟合,使得得到的图像能够在一个相对统一的“形状”下进行训练,排除额外的影响因素
截了两张图方便理解
可以看到,红色代表的是图像空间,一般指的是MNI152(找的152个人来建立的坐标空间,这不重要,图像空间可以有很多)。灰色的指的是待配准图像
线性配准:对于图像中的每一个体素都采取操作,一般是配准的第一步,先有线性配准才有非线性配准。
非线性配准:对于图像中的特定体素采取操作,一般是进一步纠正线性配准中的一些不太合理的地方,比如中间那个“X”(理解一下,不是学医的),在线性配准过程中可能导致形变,因此完善的配准过程应当包含非线性配准对其进行一定的纠正。
这张图形象展全部的配准过程
正如之前所说,组分析之间需要消除个体之间的非重要因素差距(东倒西歪的,大小不一的)
对所有体素采取的一系列变化,使得个体之间相对一致(因为所有体素的形变可能导致别的偏差)
对个别体素采取一系列的变化,消除因为所有体素形变导致的偏差(看中间那个x)
FLIRT指令:仍以GUi界面说明
依次说明:
- 选项:
- Mode:模式,即实现线性配准的模式,有两个
- 将输入图像(普通图像)配准到参考图像上(一般用这个)
- 将输入图像(低分辨率图像)超采样后配准到参考图像上,再将这个超采样的图像作为新的参考图像,将原图像配准到高分辨率副本后得到参考图像的低分辨率版本
- Reference image:参考图片,也就是图像空间的样本图像,这里选取之前所说的MNI152
- Input image/Output image
- Number of secondary images to apply transform to :
不懂捏- Model/DOF:转换类型,线性配准的“拉扯图像”的方式,允许设置不同的模式以允许线性配准在“拉扯图像”时使用的自由度的数量
- 12:仿射变化(没什么问题就允许更为细致的图像变化)
- 9:传统变化
- 7:全局缩放
- 6:刚体变化
- 特别的,2d图像转换只允许3个自由度的刚体变化
线性配准后结果如下:
可以看到4张图像都固定在了相同的坐标空间中
需要注意的是,如果没有进行线性配准,图像坐标将显示的是各自采样时的坐标,基本上没有意义,只有显示下图所示才代表图像完成了配准
上面熟悉fsl用法后,不要使用GUI界面。因为没法批量处理,可以一张张检查,但是推荐不要一张张导入brain Extraction处理
使用命令行方式处理
上文列出了常用的,演示全过程如下
打开终端键入bet2
基本用法为: bet2 ‘输入路径’ ‘输出路径’ -参数
那么处理一张图像的例子为:
bet /Users/yaoaileijiangbaobao/Downloads/CN/T1Img/153_S_4125/
MPRAGE_MPRAGE_20110720084315_2_Crop_1.nii /Users/yaoaileijiangbaobao
/Downloads/CN/brain -R
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
执行步骤:
使用一个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.")
cd python文件所在的目录
python folder_create.py
./shell.sh
再次声明,有错误的话多半是我错
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。