Visualization of MRI data in R
Lately I was getting a little bored with genomic data (and then TCGA2STAT started to give me a segfault on my university’s high performance computing facility too ). So I decided to analyze some brain imaging data that I had lying around instead. The first step is to do some visual data exploration. In this blog post I present some functions which I was able to find for MRI visualization in R, and which I found to be very useful. All functions presented below presuppose an image in the NIfTI data format as input, and are very user-friendly.
Example MRI data
library(oro.nifti) img <- readNIfTI("Template-T1-U8-RALPFH-BR.nii.gz", reorient = FALSE) class(img) ##  "nifti" ## attr(,"package") ##  "oro.nifti" dim(img) ##  182 512 512
Visualize brain slices with image
oro.nifti provides a version of the generic function
image. It allows to plot slices of the brain. The following plots the 225th axial slice of
image(img, z = 225, plot.type = "single")
It can also be used to draw all available slices in a single plot next to each other (but that turns out not very helpful in this case).
Display an orthographic projection with orthographic
orthographic, also from the library
oro.nifti, gives an excellent overview of the 3D structure of the brain in two dimensions.
In order to indicate or emphasize a certain region of the brain,
orthographic can be used to display a mask on top of the original image. For example, the following code chunk removes the skull from the MRI data (you need the FSL software and the fslr R package for this), and then plots the extracted brain as a mask on top of the original image.
# skull stripping using FSL's Brain Extraction Tool (BET) library(fslr) img_bet <- fslbet(infile = img, retimg = TRUE) # plotting extracted brain as a mask on top of original data mask <- img in_mask <- img_bet > 0 mask[in_mask] <- 1 mask[!in_mask] <- NA orthographic(x = img, y = mask, col.y = "lightblue")
(Notice that the extracted brain does not fit the original image quite perfectly, but I will not pursue further improvements to the skull stripping at this point, in order to concentrate on visualization alone.)
Polish orthographic displays with ortho2
The R package
neurobase provides the function
ortho2 as an improved version of
orthographic. Here we use it to overlay the brain as a semi-transparent layer on top of the original image.
library(scales) ortho2(img, mask, col.y = alpha("red", 0.3))
Show two orthographic displays side by side with double_ortho
double_ortho can be used to display two orthographic brain images of the same dimensions next to each other. As a quick demonstration we can look at the original image and the extracted brain side by side.
brain <- img brain[!in_mask] <- NA double_ortho(img, brain)
Of course the same functions can be repurposed for other types of imaging data. For example I can look at CT images of the lung, where the data is taken from a current kaggle.com competition.
library(oro.dicom) # generate a NIfTI image from a collection of DICOMs all_slices <- readDICOM("./00cba091fa4ad62cc3200a657aeb957e/") nii <- dicom2nifti(all_slices)
oro.nifti::image plot of the lung:
image(nii, z = 100, plot.type = "single")
oro.nifti::orthographic plot of the lung:
orthographic(nii, xyz = c(200, 220, 100))