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文件
理論上,看之前可視化也沒什么問題,但是生成的時候報錯了。
目前還找不到什么原因。