一个关于fsaverage bem文件的说明
MNE文档:基于模板 MRI 的 EEG 前向算子
Head model and forward computation
在了解了脑图谱发展的过程之后,对脑的模版有了更深的认识,所以,对于之前使用的正向的溯源文件,进行一下解析,查看包含的信息,mne的存储格式和nilearn中的格式是否有区别。
本示例中,mne除了fsaverage还有sample,这两个常用。
文章目录
- samaple和fsaverage的对比
- 1. **`fsaverage`:标准模板大脑**
- (1) **来源与定义**
- (2) **数据结构**
- (3) **获取方式**
- 2. **`sample`:示例数据集**
- (1) **来源与定义**
- (2) **数据结构**
- (3) **获取方式**
- 3. **关键区别**
- 4. **何时使用哪一个?**
- (1) **使用 `fsaverage` 的场景**
- (2) **使用 `sample` 的场景**
- 5. **代码示例**
- (1) 加载 `fsaverage` 的 BEM 模型
- (2) 加载 `sample` 的 MEG 数据
- 6. **常见问题**
- (1) **能否将个体数据映射到 `fsaverage` 模板?**
- (2) **`sample` 数据集是否包含 `fsaverage` 数据?**
- (3) **如何切换被试目录?**
- 7. **文档参考**
- 总结
- 几个模版被试的说明
- 1. `fsaverage`
- 2. `fsaverage_sym`
- 3. `morph-maps`
- 4. `sample`
- 总结
- 导入数据
- bem文件的说明
- 计算并可视化 BEM 表面
- bem的surf查看
- 单层的
- 三层的
- BEM模型键值详细分析
- (1) **层 ID 4**(电导率 0.3 S/m)
- (2) **层 ID 3**(电导率 0.006 S/m)
- (3) **层 ID 1**(电导率 0.3 S/m)
- 2. **电导率值的意义**
- 3. **层 ID 的编号问题**
- 使用nilearn进行fsaverage的导入
- 对于src的查看
- 使用 mne.viz.plot_bem
- 生成一个bem文件
samaple和fsaverage的对比
在 MNE-Python 中,sample
和 fsaverage
是两个不同的模板/数据集,但它们的用途和定位有本质区别。以下是详细解释:
1. fsaverage
:标准模板大脑
(1) 来源与定义
- 来源:由 FreeSurfer 提供,是一个 标准化的平均大脑模板,基于多被试 MRI 数据配准到 MNI 空间后生成。
- 用途:
- 用于跨被试分析(如组水平统计)。
- 当个体 MRI 数据不可用时,作为替代模板(如源空间、BEM、皮层表面等)。
- 支持脑区标签(如 Brodmann 分区)的标准化映射。
(2) 数据结构
- 包含内容:
- 高分辨率皮层表面(如
white
、pial
、inflated
)。 - 预计算的 BEM 模型(如
fsaverage-5120-5120-5120-bem-sol.fif
)。 - 标准源空间(如
fsaverage-ico-5-src.fif
)。 - 解剖标签(如
aparc.a2009s
分区)。
- 高分辨率皮层表面(如
- 坐标系:MNI 坐标系(标准空间)。
(3) 获取方式
import mne
mne.datasets.fetch_fsaverage(subjects_dir="/path/to/your/subjects_dir")
- 下载后文件存储在
subjects_dir/fsaverage/
中。
2. sample
:示例数据集
(1) 来源与定义
- 来源:MNE-Python 官方提供的 单被试示例数据集,包含一名真实被试的匿名化数据(EEG/MEG/MRI)。
- 用途:
- 学习 MNE 的入门工具(教程、文档示例)。
- 测试算法或脚本的功能。
- 演示数据预处理、源定位、可视化等完整流程。
(2) 数据结构
- 包含内容:
- 原始 MEG 数据(
.fif
文件)。 - MRI 数据(已通过 FreeSurfer 重建的个体大脑)。
- 事件标记、电极位置、噪声协方差矩阵等。
- 预计算的 BEM 模型、源空间、正向模型。
- 原始 MEG 数据(
- 坐标系:个体 MRI 坐标系(未经 MNI 标准化)。
(3) 获取方式
import mne
sample_data_path = mne.datasets.sample.data_path()
subjects_dir = sample_data_path / "subjects"
3. 关键区别
特性 | fsaverage | sample |
---|---|---|
类型 | 标准模板(群体平均) | 单被试真实数据(匿名化) |
用途 | 跨被试分析、模板化处理 | 学习、测试、演示流程 |
坐标系 | MNI 空间 | 个体 MRI 空间 |
BEM/源空间 | 预生成的模板模型 | 基于个体 MRI 生成的模型 |
数据内容 | 仅解剖结构和模板数据 | 完整的 MEG/EEG 数据 + 解剖数据 |
4. 何时使用哪一个?
(1) 使用 fsaverage
的场景
- 你的研究没有个体 MRI 数据,需要标准化分析。
- 进行组水平统计或跨被试比较。
- 需要与文献中的 MNI 坐标结果对齐。
(2) 使用 sample
的场景
- 学习 MNE 的基本操作(如教程中的代码示例)。
- 测试新脚本或算法的兼容性。
- 演示从原始数据到源定位的完整流程。
5. 代码示例
(1) 加载 fsaverage
的 BEM 模型
subjects_dir = "/path/to/subjects_dir"
bem_file = subjects_dir / "fsaverage/bem/fsaverage-5120-5120-5120-bem-sol.fif"
bem_sol = mne.read_bem_solution(bem_file)
(2) 加载 sample
的 MEG 数据
from mne.datasets import sample
data_path = sample.data_path()
raw_file = data_path / "MEG/sample/sample_audvis_raw.fif"
raw = mne.io.read_raw_fif(raw_file, preload=True)
6. 常见问题
(1) 能否将个体数据映射到 fsaverage
模板?
是的!通过 配准(registration) 将个体 MRI 对齐到 fsaverage
的 MNI 空间,使结果可跨被试比较。
工具:
- FreeSurfer 的
recon-all --target fsaverage
。 - MNE 的
mne.coregister
。
(2) sample
数据集是否包含 fsaverage
数据?
不直接包含,但可单独下载 fsaverage
。两者通常分开使用。
(3) 如何切换被试目录?
设置 subjects_dir
环境变量或在代码中指定:
import mne
mne.set_config("SUBJECTS_DIR", "/path/to/your/subjects_dir")
7. 文档参考
fsaverage
文档:
MNE: FreeSurfer’s fsaveragesample
数据集文档:
Sample Dataset Tutorial
总结
fsaverage
是标准模板大脑,用于跨被试分析和标准化处理。sample
是单被试示例数据集,用于学习和测试。- 根据研究需求选择:需要模板化分析 →
fsaverage
;需要真实数据示例 →sample
。
几个模版被试的说明
你提到的四个文件夹 (fsaverage
, fsaverage_sym
, morph-maps
, 和 sample
) 在神经影像学和脑电图(EEG)/脑磁图(MEG)数据处理中扮演着不同的角色,它们分别对应不同的模板或功能。下面我将详细解释每个文件夹及其内容的区别:
1. fsaverage
- 描述:
fsaverage
是一个标准的大脑模板,由 FreeSurfer 提供,并广泛用于神经影像研究中。它是一个平均化的、对称的大脑模型,基于多个大脑扫描结果构建而成。 - 用途:
- 作为解剖参考框架,用于标准化不同被试的大脑数据。
- 在 MNE-Python 中,常用于源定位分析,提供了一个通用的源空间和 BEM 模型。
- 特点:高分辨率,包含详细的皮层结构信息。
2. fsaverage_sym
- 描述:
fsaverage_sym
是fsaverage
的一个变体,特别强调左右半球的对称性。这个模板在创建时进行了额外的处理,以确保两个半球尽可能对称。 - 用途:
- 当需要进行严格对称性分析时使用,例如在研究左右半球功能差异时。
- 对于某些特定的统计分析或可视化任务,可能更倾向于使用对称模板。
- 特点:左右半球高度对称,适用于需要严格对称性的研究。
3. morph-maps
- 描述:
morph-maps
文件夹通常包含形态映射(morphing maps),这些映射用于将一个被试的数据转换到另一个被试或模板上。 - 用途:
- 在多被试研究中,用于将个体数据标准化到共同的空间框架下,便于跨被试比较和群体分析。
- 可以将单个被试的源估计结果映射到
fsaverage
或其他模板上,以便进行群体水平的统计分析。
- 特点:包含从个体到模板或其他个体的映射关系,是实现数据标准化和群体分析的关键工具。
4. sample
- 描述:
sample
通常指的是一个示例被试的数据集,包括 EEG/MEG 数据、MRI 扫描结果等。MNE-Python 提供了一个名为sample
的示例数据集,用于演示和教学目的。 - 用途:
- 作为学习和测试 MNE-Python 功能的示例数据。
- 研究人员可以使用
sample
数据集来熟悉各种数据处理和分析流程。
- 特点:包含完整的实验数据和相关文件,适合初学者和开发者用来学习和调试代码。
总结
fsaverage
和fsaverage_sym
:都是标准大脑模板,但后者更强调左右半球的对称性。morph-maps
:包含用于数据标准化和群体分析的形态映射。sample
:是一个示例数据集,用于学习和测试 MNE-Python 的功能。
在实际应用中,根据你的具体需求选择合适的模板和工具非常重要。如果你正在进行多被试研究,可能需要使用 morph-maps
来标准化数据;如果专注于单个被试的详细分析,则可以直接使用 fsaverage
或 fsaverage_sym
作为参考框架。
导入数据
import numpy as npimport mne
from mne.datasets import eegbci, fetch_fsaverage# Download fsaverage files
fs_dir = fetch_fsaverage(verbose=True)
subjects_dir = fs_dir.parent# The files live in:
subject = "fsaverage"
trans = "fsaverage" # MNE has a built-in fsaverage transformation
src = fs_dir / "bem" / "fsaverage-ico-5-src.fif"
bem = fs_dir / "bem" / "fsaverage-5120-5120-5120-bem-sol.fif"
我们获取fsaverage 的存储文件夹。
之前文件中有过一定的描述,下面进行更加详细的记录。
第一个文件fsaverage-ico-4-src.fif中的“src”可能代表“source
space”,即源空间。源空间定义了大脑中可能产生信号的源的位置,通常是皮层表面。ico-4可能指的是四阶的Icosahedron(二十面体)细分,用于生成源空间的网格。Ico-4的细分级别决定了源的数量,细分级别越高,源点越多,计算量也越大。用户可能需要这个文件来进行源定位分析,比如计算逆解。第二个文件fsaverage-5120-5120-5120-bem-sol.fif中的“bem”代表边界元模型(Boundary
Element
Model),用于正向计算中的电磁场模拟。BEM模型需要不同组织的边界,如头皮、颅骨、脑脊液和大脑等。文件名中的5120可能指的是每个边界面(如头皮、颅骨、大脑)的三角形数量,例如5120个三角形。而“sol”可能表示解文件,即已经计算好的BEM模型的解,用于快速计算导联场或正向解。用户在进行EEG/MEG的正向计算时会用到这个文件。
先继续插入可视化的代码,对于raw,需要的可能是布局文件,
(raw_fname,) = eegbci.load_data(subjects=1, runs=[6])
raw = mne.io.read_raw_edf(raw_fname, preload=True)# Clean channel names to be able to use a standard 1005 montage
eegbci.standardize(raw)# Read and set the EEG electrode locations, which are already in fsaverage's
# space (MNI space) for standard_1020:
montage = mne.channels.make_standard_montage("standard_1005")
raw.set_montage(montage)
raw.set_eeg_reference(projection=True) # needed for inverse modeling# Check that the locations of EEG electrodes is correct with respect to MRI
mne.viz.plot_alignment(raw.info,src=src,eeg=["original", "projected"],trans=trans,show_axes=True,mri_fiducials=True,dig="fiducials",
)
bem文件的说明
BEM 表面是不同组织之间界面三角剖分,用于前向计算。这些表面例如包括内颅骨表面、外颅骨表面和皮肤外表面,即头皮表面。
计算并可视化 BEM 表面
计算 BEM 表面需要使用 FreeSurfer,并使用命令行工具 mne watershed_bem 或 mne flash_bem,或者相关的函数 mne.bem.make_watershed_bem() 或 mne.bem.make_flash_bem()。
这里我们假设它已经计算过了。每个受试者需要几分钟。
对于脑电图(EEG),我们使用 3 层(内颅骨、外颅骨和皮肤),而对于脑磁图(MEG),只需要 1 层(内颅骨)就足够了。
bem.keys()
dict_keys([‘solution’, ‘bem_method’, ‘surfs’, ‘solver’, ‘is_sphere’,
‘nsol’, ‘sigma’, ‘source_mult’, ‘field_mult’, ‘gamma’])
bem的surf查看
如果要生成一个新的bem,应该需要,这几个层的surf文件
此处需要使用的就是,inner_skull.surf,outer_skull.surf,outer_skin.surf
Using surface:
C:\Users\maten\mne_data\MNE-fsaverage-data\fsaverage\bem\inner_skull.surf
Using surface:
C:\Users\maten\mne_data\MNE-fsaverage-data\fsaverage\bem\outer_skull.surf
Using surface:
C:\Users\maten\mne_data\MNE-fsaverage-data\fsaverage\bem\outer_skin.surf
显示一下,这个的样子
单层的
# 说明,使用pyvista,需要使用不同的绘图格式,表面的点需要转为数量,加上坐标的形式,并构成一维数组。
from mne import read_surface
import numpy as np
import pyvista as pv
import numpy as np
outer_skin_coords, outer_skin_faces = read_surface('C:/Users/maten/mne_data/MNE-fsaverage-data/fsaverage/bem/outer_skin.surf')
faces_pyvista = np.hstack((3 * np.ones((outer_skin_faces.shape[0], 1), dtype=outer_skin_faces.dtype), outer_skin_faces))
surf = pv.PolyData(outer_skin_coords, faces_pyvista.ravel())
surf.plot()
对于
outer skin CM is -0.21 -19.38 -0.23 mm
outer skull CM is -0.19 -19.34 -0.49 mm
inner skull CM is -0.53 -21.10 6.21 mm
这个对应的是质心的坐标。
三层的
from mne import read_surface
import pyvista as pv
import numpy as npdef create_polydata_from_mne_coords_faces(coords, faces):"""Convert coordinates and faces from MNE format to PyVista format."""# 在每个面的前面添加数字 3(因为是三角形)faces_pyvista = np.hstack((3 * np.ones((faces.shape[0], 1), dtype=faces.dtype), faces))return pv.PolyData(coords, faces_pyvista.ravel())# 定义表面文件路径
subjects_dir = 'C:/Users/maten/mne_data/MNE-fsaverage-data/fsaverage/bem/'
surfaces = [('inner_skull', subjects_dir + 'inner_skull.surf', 'blue'),('outer_skull', subjects_dir + 'outer_skull.surf', 'green'),('outer_skin', subjects_dir + 'outer_skin.surf', 'red')
]# 创建PyVista Plotter对象
plotter = pv.Plotter()# 循环遍历每个表面文件并添加到绘图器中
for name, path, color in surfaces:coords, faces = read_surface(path)polydata = create_polydata_from_mne_coords_faces(coords, faces)plotter.add_mesh(polydata, color=color, opacity=0.5, smooth_shading=True)# 显示图形
plotter.show()
BEM模型键值详细分析
BEM (边界元素法) 模型中的键值具有以下含义:
-
solution:BEM求解矩阵,包含了边界面之间的电位关系,用于计算头部不同组织界面上的电位分布。
-
bem_method:使用的BEM方法类型,常见的有"linear collocation"(线性搭配法)或"linear Galerkin"(线性伽辽金法)。
-
surfs:包含头模型中使用的表面信息,通常包括内颅骨、颅骨和头皮三个表面的几何描述(点、面等)。
-
solver:用于求解BEM方程的算法类型。
-
is_sphere:布尔值,表示该BEM模型是否基于球形模型(True)或真实头部形状(False)。
-
nsol:解决方案的维度或自由度数量。
-
sigma:组织电导率值列表,单位通常为S/m(西门子/米),分别对应脑组织、颅骨和头皮的电导率。
-
source_mult:源乘数,与源强度计算相关的系数。
-
field_mult:场乘数,与电场计算相关的系数。
-
gamma:BEM公式中的γ系数矩阵,用于描述不同表面之间的电位关系。
这些参数共同构成了完整的BEM解决方案,用于在MEG/EEG分析中进行正向计算,即从已知的源活动推算出在传感器位置处产生的场分布。
for layer in bem["surfs"]:print(f"层 ID: {layer['id']}")print(f"顶点数: {len(layer['rr'])}, 三角面片数: {len(layer['tris'])}")print(f"电导率 (σ): {layer['sigma']} S/m")
ID: 4 顶点数: 2562, 三角面片数: 5120 电导率 (σ): 0.30000001192092896 S/m
ID:3 顶点数: 2562, 三角面片数: 5120 电导率 (σ): 0.006000000052154064 S/m
ID: 1 顶点数: 2562, 三角面片数: 5120 电导率 (σ): 0.30000001192092896 S/m
(1) 层 ID 4(电导率 0.3 S/m)
- 解剖结构:头皮(Scalp)
- 最外层,包裹颅骨和脑组织。
- 电导率较高(约 0.3 S/m),反映头皮组织(皮肤、肌肉、脂肪)的导电性。
- 作用:
- 在 EEG 中,头皮是电流的最终传导层,直接影响电极测量的电势分布。
- 在 MEG 中,对磁场影响较小(因磁场穿透性强)。
(2) 层 ID 3(电导率 0.006 S/m)
- 解剖结构:颅骨(Skull)
- 中间层,分隔头皮和脑内结构。
- 电导率极低(约 0.006 S/m),反映颅骨的低导电性(骨组织导电性差)。
- 作用:
- 在 EEG 中,颅骨会显著衰减脑内电流的传播,导致头皮电势分布模糊化。
- 是影响 EEG 空间分辨率的主要因素。
(3) 层 ID 1(电导率 0.3 S/m)
- 解剖结构:脑壳(Brain)
- 最内层,包裹脑实质(灰质、白质)和脑脊液(CSF)。
- 电导率较高(约 0.3 S/m),反映脑组织和脑脊液的导电性。
- 作用:
- 直接承载神经元活动产生的电流,是 EEG/MEG 信号的主要源头。
- 在 BEM 模型中,通常与脑脊液合并为一层(尤其在简化模型中)。
2. 电导率值的意义
- 头皮和脑壳(0.3 S/m):
高导电性允许电流自由流动,对 EEG 信号的空间分布起主导作用。 - 颅骨(0.006 S/m):
低导电性导致电流在穿过颅骨时被强烈衰减,是 EEG 信号空间模糊化的主要原因。
注意:颅骨电导率的值存在争议,一些研究建议使用 0.01–0.015 S/m [1],但 MNE 默认使用 0.006 S/m。
默认值:头皮 0.3 S/m,颅骨 0.006 S/m,脑壳 0.3 S/m。
3. 层 ID 的编号问题
你提供的层 ID(4、3、1)与常规 FreeSurfer/MNE 标准 不一致。
- 标准标识(FreeSurfer 惯例):
3
:脑壳(Brain)4
:颅骨(Skull)5
:头皮(Scalp)
- 可能原因:
- 数据生成时使用了非标准标签(如自定义 BEM 模型)。
- 文件可能来自旧版本 MNE 或特定数据集(如
fsaverage
模板的某些变体)。 - 需进一步检查数据来源或通过可视化验证(见下文)。
import mne# 绘制 BEM 模型,叠加白质表面
mne.viz.plot_bem(subject="sample",subjects_dir="/path/to/subjects_dir",brain_surfaces="white", # 指定表面类型orientation="coronal",slices=[100, 120, 140], # 切片位置show=True
)
brain_surfaces的类型说明:
[“white”, “pial”]可以叠加显示多个
‘white’ 表面适合检查源空间与解剖的对齐。
“pail”
‘inflated’ 表面适合观察功能激活的拓扑模式。
“sphere”
‘head’ 或 ‘skull’ 和’brain’用于验证 BEM 模型的几何闭合性。
并不存在,没有对应的文件。
使用nilearn进行fsaverage的导入
from nilearn import datasets, plotting
from nilearn.surface import load_surf_data, load_surf_meshfsaverage = datasets.fetch_surf_fsaverage()
fsaverage#字典
我们可以看到这个文件是上面不同层的
其中pial_left的文件也是由两部分组成的coordinates和face。
作为一个表面模型,有三维坐标点和,构成一个三角面的三维索引坐标。
# Step 2: 加载左半球网格并查看顶点数量
mesh = load_surf_mesh(fsaverage['pial_left']) # 返回 (vertices, faces)
n_vertices = mesh[0].shape[0] # vertices 是 (n_vertices, 3) 的坐标数组print(f"左半球顶点数量:{n_vertices}")# Step 3: 生成与顶点数量相同的随机数据
random_data = np.random.randn(n_vertic
plotting.plot_surf(surf_mesh=fsaverage['pial_left'], # 表面网格surf_map=random_data, # 表面数据hemi='left', # 半球view='lateral', # 视角:外侧colorbar=True, # 显示颜色条title='Left Hemisphere Activation'
)
plotting.show()
对于src的查看
import os.path as op
import numpy as np
import os
import mne
from mne.datasets import fetch_fsaverage# Download fsaverage files
fs_dir = fetch_fsaverage(verbose=True)
subjects_dir = op.dirname(fs_dir)# The files live in:
subject = "fsaverage"
trans = "fsaverage" # MNE has a built-in fsaverage transformation
#说明ico-5-src.fif文件是源空间文件,bem-sol.fif文件是 bem 文件,用于解决 bem 问题。、
#ico-5的数据太大,无法计算,使用ico-4进行尝试
src = op.join(fs_dir, "bem", "fsaverage-ico-4-src.fif")
bem = op.join(fs_dir, "bem", "fsaverage-5120-5120-5120-bem-sol.fif")
src = mne.read_source_spaces(src)
src.plot()src = mne.read_source_spaces(src)
src.plot()
使用 mne.viz.plot_bem
对于bem的可视化,查看的是T1.mgz的图像。
fs_dir:这个是放置模版的文件夹
src:是roi文件或者对应的类似的
subject:是在fs_dir中,在加一个路径。
orientation有三种视图’coronal’, ‘axial’, and ‘sagittal’
冠状面(coronal plane)和矢状面(sagittal plane) ,横断面(axial)
slices:时间的切片
mne.viz.plot_bem(subject='fsaverage', subjects_dir=fs_dir, src=None, orientation='axial',slices=[0,10,50,100],show=True)
图示一下这三个面
把有效的溯源点,使用一些数据映射到头图像上,有些不均匀。
对于ico-4进行前向分解的左右脑,因为生理约束,有的点在头皮之外,无法作为有效的点。
生成一个bem文件
生成失败了, 目前还没找到原因
import mne
subjects_dir = r"D:\系统数据\git仓库\MNE-Cookbook\mne_data\MNE-sample-data\subjects"
conductivity = (0.3, 0.006, 0.3) # 标准导电率值 (S/m) for [脑脊液, 颅骨, 头皮]
model = mne.make_bem_model(subject='fsaverage', ico=4, conductivity=conductivity,subjects_dir=subjects_dir)
bem_sol = mne.make_bem_solution(model)
mne.write_bem_solution('fsaverage-bem-sol.fif', bem_sol)
主要使用的应该是那三个suf文件
理论上,看之前可视化也没什么问题,但是生成的时候报错了。
目前还找不到什么原因。