Created
February 3, 2021 20:19
-
-
Save larsoner/4c964e21045fc499cb5e380dc79137c0 to your computer and use it in GitHub Desktop.
bems_brainsuite_fsl.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# convert MGZ->NII | |
# | |
# $ bet T1.nii stripped.nii.gz -n -A -v -e | |
# | |
import numpy as np | |
import nibabel as nib | |
import pyvista as pv | |
import mne | |
img = nib.load('T1.mgz') | |
xfm = img.header.get_vox2ras_tkr() | |
bet_map = dict( | |
brain='', | |
outer_skin='_outskin', | |
inner_skull='_inskull', | |
outer_skull='_outskull', | |
) | |
for fs_name, bet_name in bet_map.items(): | |
continue # XXX | |
mesh = pv.read(f'stripped{bet_name}_mesh.vtk') | |
rr = np.array(mesh.points) | |
rr = mne.transforms.apply_trans(xfm, rr) | |
tris = mesh.faces.reshape(5120, 4)[:, 1:] | |
mne.write_surface(f'bet_{fs_name}.surf', rr, tris) | |
# Nearly instantaneous but not great: | |
# | |
# $ bse -i T1.nii --mask T1_brain.nii | |
# $ skullfinder -i T1.nii -m T1_brain.nii -o T1_labeled.nii -s subject --finalOpening | |
# | |
bs_map = dict( | |
brain='brain', | |
inner_skull='inner_skull', | |
# These are swapped, which is weird | |
outer_skull='scalp', | |
outer_skin='outer_skull', | |
) | |
ras_xfm = np.array( | |
[[-1, 0, 0, 256], [0, 0, -1, 256], [0, 1, 0, 0], [0, 0, 0, 1]]) | |
xfm = img.header.get_vox2ras_tkr() @ ras_xfm | |
for fs_name, bs_name in bs_map.items(): | |
with open(f'subject.{bs_name}.dfs', 'rb') as fid: | |
header_type = fid.read(12).decode().split('\x00')[0] | |
assert header_type in ('DFS_LE v2.0', 'DFS_BE v2.0'), repr(header_type) | |
bo = dict(L='<', B='>')[header_type[4]] | |
header_size, meta_off, subj_off, n_tris, n_verts = \ | |
np.fromfile(fid, f'{bo}i4', 5) | |
fid.seek(header_size + meta_off + subj_off) | |
tris = np.fromfile(fid, f'{bo}i4', 3 * n_tris).reshape(n_tris, 3) | |
rr = np.fromfile(fid, f'{bo}f4', 3 * n_verts).reshape(n_verts, 3) | |
rr = mne.transforms.apply_trans(xfm, rr) | |
mne.write_surface(f'bs_{fs_name}.surf', rr, tris, overwrite=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment