This tutorial demonstrates how to read structural MRI data using
nibabel and nilearn in conjunction with almirah.
First, we'll import the necessary libraries.
import nibabel as nib
import nilearn as nil
from almirah import Layout
Next, we'll set up the layout to access the structural MRI data.
lay = Layout(root="/path/to/data", specification_name="bids")
lay
This should output:
<Layout root: '/path/to/data'>
We can query the layout to find all anatomical files with the .nii.gz extension:
files = lay.query(datatype="anat", extension=".nii.gz")
To query a specific file, we can filter by subject, datatype, suffix, and extension:
file = lay.query(subject="D0020", datatype="anat", suffix="T1w", extension=".nii.gz")[0]
print(file.rel_path)
This should output the relative path of the file:
sub-D0020/ses-101/anat/sub-D0020_ses-101_T1w.nii.gz
We can then download the MRI file:
file.download()
This confirms the download:
get(ok): sub-D0020/ses-101/anat/sub-D0020_ses-101_T1w.nii.gz (file) [from origin...]
Next, we read the MRI data using nibabel:
raw = nib.load(file.path)
type(raw)
This should output:
nibabel.nifti1.Nifti1Image
We can inspect the header information of the MRI data:
print(raw.header)
This outputs the header information:
<class 'nibabel.nifti1.Nifti1Header'> object, endian='<'
sizeof_hdr : 348
data_type : b''
db_name : b''
extents : 0
session_error : 0
regular : b'r'
dim_info : 54
dim : [ 3 192 256 256 1 1 1 1]
intent_p1 : 0.0
intent_p2 : 0.0
intent_p3 : 0.0
intent_code : none
datatype : int16
bitpix : 16
slice_start : 0
pixdim : [1. 1. 1. 1. 0.0064721 0. 0.
0. ]
vox_offset : 0.0
scl_slope : nan
scl_inter : nan
slice_end : 0
slice_code : unknown
xyzt_units : 10
cal_max : 0.0
cal_min : 0.0
slice_duration : 0.0
toffset : 0.0
glmax : 0
glmin : 0
descrip : b'TE=2.9;Time=103137.087'
aux_file : b''
qform_code : scanner
sform_code : scanner
quatern_b : 0.0
quatern_c : -0.018800024
quatern_d : 0.0
qoffset_x : -95.44943
qoffset_y : -132.33757
qoffset_z : -134.27122
srow_x : [ 9.9929786e-01 0.0000000e+00 -3.7593402e-02 -9.5449432e+01]
srow_y : [ 0. 1. 0. -132.33757]
srow_z : [ 3.7593581e-02 0.0000000e+00 9.9929309e-01 -1.3427122e+02]
intent_name : b''
magic : b'n+1'
We can also get the raw data as a NumPy array:
raw_data = raw.get_fdata()
type(raw_data)
This should output:
numpy.ndarray
And we can check the shape of the raw data:
raw_data.shape
This gives the shape of the data:
(192, 256, 256)
Finally, we use nilearn to plot the MRI data:
from nilearn import plotting
plotting.plot_img(raw)
This will generate the plot:
This concludes the tutorial. You've learned how to read MRI data using
nibabel and nilearn.