基于Dpabi和spm12的脑脊液(csf)分割和提取笔记
一、前言
脑脊液(csf)一直被认为与新陈代谢有重要关联,其为许多神经科学研究提供重要价值,从fMRI图像中提取脑脊液信号可用于多种神经系统疾病的诊断。特别是自2019年Science上那篇著名的csf-BOLD文章发表后,大家都试图用csf阅读出更多的信息。
本人提取csf信号的思想都基于封面2019年这篇Science,不过因为扫描参数不同略有调整。我在学习csf-extract时还是花了一个月的时间,并且踩了不少坑,特此在这篇笔记里梳理与分享。

二、环境配置
系统:Windows 11
软件运行平台:Matlab2022a
所需工具包:
- SPM12(下载安装教程)
- DPABI(下载安装教程)
三、脑脊液提取过程
csf protocol
目录
一、前言
二、环境配置
三、脑脊液提取过程
1.数据预处理
a.时间层校正(Slice Timing)
b.头动校正(Realign)
2.提取csf掩模
3.抓取csf信号
总结
1.数据预处理
DPARSF的基础教程在此不做赘述,如需要可以参考(基础教程)。
将功能像的数据都由dcm转化为.nii文件并去除了前面10个时间点后,就可以开始预处理了。
-
a.时间层校正(Slice Timing)
- 首先必须要进行的是Slice Timing,因为各扫描层激发时间不同Slice timing校正可以将所有切片的信号同步到一个参考时间点,通常是TR(重复时间)的中点。打开DPARSF后在红框所圈范围分别填上序列对应的Slice Number,Slice Order和参考切片(一般为中间)。然后点击右下角运行。
-
DPRASFslicetiming前后对比,会发现信号强度经过了细微调整。 -
b.头动校正(Realign)
- 【可选】头动校正(Realign)。有些用短回波成像的研究中并没有进行这一步,因为会改变csf附近的体素信号,但是我处理的是正常TR=2的序列。如果不进行头动校正影响较大,我还是选择了Realign,方法仅供参考。但无论是否应用头动校正,都需要DPARSF的头动参数.txt文件,让我们排除掉头动过大的被试。

- 【可选】滤波(Filter)。滤波参数我选择的是0.01-0.1HZ因为低频信号通常包含呼吸、心跳等生理噪声,高频信号可能包含仪器噪声等无关信息。
- 要不要做滤波? -可以都试。很多作者也报告省略滤波后的结果。但我用没有bandpass的信号进行相关矩阵分析发现:如果不做带通滤波,被试间的信号都显著相关,说明噪音大;bandpass后被试的信号只和自己的序列相关,与他人无关,说明提升了信噪比。
- 如何做滤波? -用DPARSF请手动检查!最好自己写脚本,报错少。DPARSF的滤波功能应该是使用y_bandpass()函数完成的,会在某些情况下在一个时间点上生成全是0信号。如果用DPARSF自带的滤波,一定要在处理完后逐个时间点检查。
滤波前后
2.提取csf掩模
在前面的步骤中,我们将BOLD信号经过了时间校正(Slice Timing)、头动校正(Reaglign)、带通滤波(Filter)后已经得到了信噪比较高的BOLD图像。
对预处理后的4DBOLD进行时间维度求平均,得到单张3D均值图像,然后利用SPM12的分割工具对该均值图像进行组织分割,得到CSF的概率图。之后设置较高的概率阈值(0.9)创建CSF掩模,以确保提取的是高置信度的CSF区域。最后将这个掩模应用到原始的4D功能像上,即可得到目标区域内的CSF时间序列信号。这种方法的优势在于通过严格的阈值筛选,保证了提取信号的可靠性。
% 计算均值图像并用SPM分割得到CSF掩模
img = mean(func_4d.img, 4);
save_nii(img, 'mean.nii');
spm_segment('mean.nii'); % 提取CSF区域信号
mask = double(csf_prob.img)/256 >= 0.9;
csf_timeseries = func_4d.img .* repmat(mask,[1,1,1,size(func_4d.img,4)]);
3.抓取csf信号
脑脊液主要分布在脑室系统和蛛网膜下隙中。在大脑横断面水平切片上,从下到上看,最大的CSF池是位于脑干前方的桥前池,这是在底部切片的位置。这就是我们在提取CSF信号时主要关注最后非零切片的原因 ,在这个位置上的CSF信号最为纯净,受到周围灰质和白质组织的污染最少。
% 对每个时间点的3D体积提取CSF信号
for i = 1:size(img,4)% 获取当前时间点的3D体积img3d = img(:,:,:,i);% 找到含有信号的最后一个切片(对应脑底部CSF池的位置)nonZeroSlices = squeeze(any(any(img3d, 1), 2));lastNonZeroSlice = find(nonZeroSlices, 1);img2d = img3d(:,:,lastNonZeroSlice);csf(j,i) = mean(img2d(img2d>0));
end
总结
提取出来的csf可以与全脑信号计算耦合呢。
相关文章:

基于Dpabi和spm12的脑脊液(csf)分割和提取笔记
一、前言 脑脊液(csf)一直被认为与新陈代谢有重要关联,其为许多神经科学研究提供重要价值,从fMRI图像中提取脑脊液信号可用于多种神经系统疾病的诊断。特别是自2019年Science上那篇著名的csf-BOLD文章发表后,大家都试图…...
【每日一题】2012考研数据结构 - 求字符串链表公共后缀
本篇文章将为大家讲解一道关于链表的经典题目——求两个链表的共同后缀节点。该问题在实际开发中同样具有很大的应用价值,是每一位数据结构学习者不可错过的重要题目。 问题描述 假设我们有一个带头结点的单链表来保存单词,每个节点包含一个字符和指向…...

数据结构和算法-贪心算法01- 认识贪心
贪心算法 什么是贪心算法 一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案。 ----《算法导论》 贪心算法(Greedy Method): 所谓贪心算法就是重复地(或贪婪地)根据一个法则挑选解的一部分。当挑选完毕…...
Bash Shell - 获取日期、时间
1. 使用date获取日期 以下代码将date的执行结果存储在today变量中。date 是获取日期和时间的命令。 选择使用 quotes()或$ #!/bin/bashtodaydate echo $todaytoday$(date) echo $today 2. 使用 Format 输出所需日期和时间 date FORMAT 2.1 "MM-DD-YY" 形式输出…...
runnable和callable区别和底层原理
确实,Runnable 可以直接通过 Thread 类来运行,而 Callable 不能直接用于创建和运行线程。Callable 和 Runnable 都是 Java 中用于定义异步任务的接口,但它们的用法和目的有所不同。 ### Runnable 和 Thread Runnable 是接口,它不返…...

Springboot 整合 Java DL4J 打造自然语言处理之语音识别系统
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...

虚幻引擎5(UE5)学习教程
虚幻引擎5(UE5)学习教程 引言 虚幻引擎5(Unreal Engine 5,简称UE5)是Epic Games开发的一款强大的游戏引擎,广泛应用于游戏开发、影视制作、建筑可视化等多个领域。UE5引入了许多先进的技术,如…...

从0开始深度学习(26)——汇聚层/池化层
池化层通过减少特征图的尺寸来降低计算量和参数数量,同时增加模型的平移不变性和鲁棒性。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。 1 最大汇聚层、平均汇聚层 汇聚层和卷积核一样,是在输入图片上进行滑动计算,但是不同于卷积层的…...
兼职发薪系统:高效、便捷的劳务发薪解决方案
在快速发展的数字化时代,企业对于高效、便捷的薪酬发放和管理解决方案的需求日益增长。特别是对于兼职人员众多的企业,如何实现快速、准确的发薪,同时确保员工信息的安全与保密,成为了一个亟待解决的问题。今天,我们将…...

MySQL数据库单表查询习题
目录 数据内容介绍习题题目答案 数据内容介绍 数据库中有两个表 内容如下: 习题 题目 查询出部门编号为D2019060011的所有员工所有财务总监的姓名、编号和部门编号。找出奖金高于工资的员工。找出奖金高于工资40%的员工。找出部门编号为D2019090011中所有…...

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型
前言 本文怎么来的呢?其实很简单,源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型:一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…...
电路原理:电阻桥。
电路的基础是电阻电路。电阻电路有两种基本接线方法(串连和并连,二者有不同的解算与用法:串连分压、并连分流)。电阻电路就是使用基本接线方法的组合方案,其解算方法主要内容是判断好整体布局以及各个局部的串并连关系…...

实践出真知:MVEL表达式中for循环的坑
目录标题 背景MVEL脚本(有问题的)MVEL脚本(正确的)结论分析 背景 需要从一个URL的拼接参数中解析出id的值并输出 比如: 存在URLhttps://xxxxxxxxxx?id999999&type123&name345 然后需要输出id999999 MVEL脚本(有问题的) 入参:parseThisUrlhttp…...

Flutter运行App时出现“Running Gradle task ‘assembleDebug“问题解决
在参考了众多解决办法中最有用并且最快的方法 Gradle Distributions 在这个地方下载对应你这个文件中的gradle版本 然后将 最后一行本来不是这样的,我们把下载好的zip包保存到本地,然后用这个代替网址,最后成功运行...
基于SSM(Spring + Spring MVC + MyBatis)框架的咖啡馆管理系统
基于SSM(Spring Spring MVC MyBatis)框架的咖啡馆管理系统是一个综合性的Web应用程序,用于管理和优化咖啡馆的运营。下面我将提供一个详细的案例程序概述,包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理&…...

【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)
Git仓库 https://gitee.com/Lin_DH/system 介绍 使用 Thymeleaf 写的页面,将(txt、jpg、png)格式文件上传到 MySQL 数据库中。 依赖 pom.xml <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --><depende…...
计算机体系结构之系统吞吐量(三)
前面章节《计算机体系结构之多级缓存、缓存miss及缓存hit(二)》讲了关于系统多级缓存的相关内容,其中提及了系统吞吐量一词。在此章将对其进行讲解。 系统吞吐量是计算机体系结构的一个重要指标,其衡量的是系统在单位时间内处理工…...

高级 HarmonyOS主题课—— 帮助快速构建各种文本识别应用的课后习题
天地不仁,以万物为刍狗; 圣人不仁,以百姓为刍狗。 天地之间,其犹橐龠乎? 虚而不屈,动而俞出。 多闻数穷,不若守于中。 本文内容主要来自 <HarmonyOS主题课>帮助快速构建各种文本识别应用 …...
windows C#-异常和异常处理概述
C# 语言的异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。 异常处理功能使用 try、catch 和 finally 关键字来尝试执行可能失败的操作、在你确定合理的情况下处理故障,以及在事后清除资源。 公共语言运行时 (CLR)、.NET/第三方库或应用程序代码都可…...
每日一题——第一百二十四题
题目:进制转换 #pragma once#include<stdio.h> #include<ctype.h> #include<string.h>/// <summary> /// //将字符串表示的任意进制数转为十进制 /// </summary> /// <param name"str">字符串</param> /// &l…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...