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
.