步骤 06:电极定位
设置电极位置(蒙太奇)以便后续空间操作
1. 目标
为每个通道赋予空间坐标(x, y, z),使后续的坏导插值、源定位、ICA 空间滤波都有可靠的几何依据。越早设置越好——延迟设置会导致插值偏差、坏导漏检。
2. 何时使用 / 何时跳过
- 强烈建议使用:任何包含 EEG 通道的数据
- 可跳过:纯诱发实验 ERP 研究 + 仅做时域平均(如不做源定位)——但插值精度会下降
3. 前置条件
- 已执行步骤 04:通道列表已稳定
- 通道名必须匹配 MNE 标准 montage 命名(如
'Fp1','Cz')
4. 核心代码
Python
import mne
# ====== 方式 A:使用 MNE 内置标准 montage(推荐新手) ======
# 常用标准 montage
montage = mne.channels.make_standard_montage('standard_1020') # 10-20 系统
# 其他常见选项:'standard_1005', 'standard_alphabetic', 'standard_postfixed',
# 'standard_prefixed', 'biosemi16', 'biosemi32',
# 'biosemi64', 'biosemi128', 'biosemi160',
# 'easycap-M1', 'easycap-M10', 'easycap-M11',
# 'GSN-HydroCel-32', 'GSN-HydroCel-64_1.0',
# 'GSN-HydroCel-128', 'GSN-HydroCel-256'
# 查询当前支持的所有 montage:
print(mne.channels.get_builtin_montages())
raw.set_montage(montage, match_case=False, on_missing='warn')
# ====== 方式 B:从被试专属电极位置文件加载 ======
# Polhemus Isotrak 文件 → 用 mne.channels.read_dig_polhemus_isotrak
montage = mne.channels.read_dig_polhemus_isotrak('subject-01.isotrak')
raw.set_montage(montage)
# 其他格式:
# - .elp / .hsp / .locs / .sfp → 用 mne.channels.read_custom_montage()
montage = mne.channels.read_custom_montage('subject-01.elp')
raw.set_montage(montage)
# ====== 方式 C:从电极位置 CSV 自定义 montage ======
montage = mne.channels.make_dig_montage(
ch_pos={
'Fp1': (-0.027, 0.084, 0.054),
'Fp2': (0.027, 0.084, 0.054),
'Cz': (0.0, 0.0, 0.066),
# ... 其余通道
},
coord_frame='head',
)
raw.set_montage(montage)
# ====== 方式 D:缺失通道的处理策略 ======
raw.set_montage(montage, on_missing='warn') # 仅警告,不报错
raw.set_montage(montage, on_missing='ignore') # 静默忽略
5. 参数详解
| 参数 | 含义 | 推荐值 |
|---|---|---|
match_case |
是否忽略大小写匹配通道名 | True(默认)/ False(处理 'FP1' vs 'Fp1') |
match_alias |
是否接受别名(如 'EEG 001' ≈ 'EEG001') |
False(默认) |
on_missing |
通道名找不到位置时如何处理 | 'raise'(默认)/ 'warn' / 'ignore' |
⚠️ 真实签名中无
set_dig参数——set_montage()默认替换已有 digitization;如需保留 digitization 用raw.set_montage(None)后重新设置。
⚠️coord_frame也不是参数——montage 对象自身决定坐标系。⚠️ 常见 montage 命名差异:标准 10-20 是
Fp1(大写 F、小写 p)、BioSemi 是Fp1、BrainVision 可能输出FP1。设match_case=False自动适配。
6. 验证方法
Python
# 验证 1:查看 montage
print(raw.get_montage())
# 输出应包含每个 EEG 通道的坐标
# 验证 2:定位点数与通道数一致
montage = raw.get_montage()
n_eeg = len([ch for ch in raw.info['chs'] if ch['kind'] == 2]) # FIFFV_EEG_CH = 2
n_dig = len([d for d in raw.info['dig'] if d['kind'] == 3]) # FIFFV_POINT_EEG = 3
print(f"EEG 通道数: {n_eeg}, 已定位数: {n_dig}")
# 期望:n_dig == n_eeg 或非常接近
# 验证 3:2D 头皮图
raw.plot_sensors(show_names=True)
# 期望:64 个电极均匀分布在 2D 圆周图上
7. 常见错误
| 错误 | 原因 | 解决方案 |
|---|---|---|
ValueError: DigMontage is empty |
自定义 dict 给了空坐标或未提供 | 检查 ch_pos 字典 |
| 部分通道缺失 | 通道名与 montage 不匹配 | 用 match_case=False 或检查命名规范 |
| 通道位置全部错位(如左右颠倒) | montage 坐标系方向与厂商文件不一致 | 检查 coord_frame,必要时手动镜像 |
RuntimeError: ... EEG average reference ... |
后续平均参考失败 | 确认 EEG 通道都有坐标(无需 EOG/ECG) |
8. 官方来源
| 资源类型 | 链接 |
|---|---|
set_montage |
https://mne.tools/stable/generated/mne.io.Raw.html#mne.io.Raw.set_montage |
make_standard_montage |
https://mne.tools/stable/generated/mne.channels.make_standard_montage.html |
make_dig_montage |
https://mne.tools/stable/generated/mne.channels.make_dig_montage.html |
| 支持的 montage 列表 | https://mne.tools/stable/generated/mne.channels.get_builtin_montages.html |
| 教程 | https://mne.tools/stable/auto_tutorials/forward/35_eeg_no_mri.html |
9. 学术引用
无需单独引用。坐标系遵循 SEEG/EEG 行业标准(Stevens, 1937; American Clinical Neurophysiology Society, 1994)。