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 :stuck_out_tongue:). 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

A T1 image obtained from http://www.jannin.org/mritemplate/ (this one to be precise) is used for example purposes in what follows. We can read it into R using the library oro.nifti.

library(oro.nifti)
img <- readNIfTI("Template-T1-U8-RALPFH-BR.nii.gz", reorient = FALSE)
class(img)
## [1] "nifti"
## attr(,"package")
## [1] "oro.nifti"
dim(img)
## [1] 182 512 512

Visualize brain slices with image

The library 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 img.

image(img, z = 225, plot.type = "single")

plot of chunk image

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).

image(img)

plot of chunk image_all

Display an orthographic projection with orthographic

The function orthographic, also from the library oro.nifti, gives an excellent overview of the 3D structure of the brain in two dimensions.

orthographic(img)

plot of chunk orthographic

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")

plot of chunk orthographic_mask

(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))

plot of chunk ortho2

Show two orthographic displays side by side with double_ortho

The function 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)

plot of chunk double_ortho

Beyond MRI

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)

An oro.nifti::image plot of the lung:

image(nii, z = 100, plot.type = "single")

plot of chunk lung_image

An oro.nifti::orthographic plot of the lung:

orthographic(nii, xyz = c(200, 220, 100))

plot of chunk lung_orthographic

Written on January 27, 2017