In May my paper was finally released into the wild. Amongst other things it was the culmination of 4 years of me learning to use R for data analysis (and in my case data = images of cells). I’ve been meaning to blog some of this for a while, but I will try for my own sanity to keep everything in bite size chunks. Starting at the start: data import.

tiff : Read and write TIFF images

Up until this point I’ve only had need to ’port single plane .tif images of kymographs (of which, more later) generated in FIJI into R.

For this purpose, the ‘tiff’ package on CRAN is more than adequate: it has two very straight forward functions, readTIFF and writeTIFF. It can handle 8-bit, 16-bit integer and 32-bit float samples (great because my kymograph workflow culminates in a 32-bit float). Reading in a single plane image creates a matrix. Reading in multiple channels creates an array. The ‘tiff’ package can handle up to 4 channels (no z and t), so it is limited for scientific image purposes, but small and simple has it’s advatages too.

kymo <- readTIFF("MAX_Reslice_of_low_pass_axon_16bit.tif")

dim(kymo) #dimensions of the matrix, original image was 951 x 181 pixels
## [1] 181 950
min(kymo) #minimum value of the matrix, B&C ImageJ viewer said 468.65
## [1] 0
max(kymo) #maximum value of the matrix, B&C ImageJ viewer said 1433.88
## [1] 1
kymo[1:5, 1:6] #display the first five rows and the first six columns of data
##           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
## [1,] 0.2281071 0.1949645 0.1776913 0.1648585 0.1603571 0.1607843
## [2,] 0.1527733 0.1647364 0.1945373 0.1920958 0.2046693 0.2461891
## [3,] 0.2525826 0.2375677 0.2014038 0.1574426 0.1527733 0.1884642
## [4,] 0.1949340 0.1897612 0.1783322 0.2124056 0.1819638 0.1805905
## [5,] 0.2153201 0.2297551 0.2054322 0.1726101 0.1298543 0.1367361
image(kymo) #quick auto display of the image data

So that was easy! The power of R is now at your disposal. As a side note, the .tif file on my hard drive was 692kb, whilst the matrix is 1.3 Mb. There are also the equivalent packages for ‘jpeg’ and ‘png’ image formats.

EBImage : Image processing and analysis toolbox for R

‘EBImage’ is a package avaiable on bioconductor. Essentially it wraps up the ‘tiff’, ‘jpeg’ and ‘png’ packages and extends them to provide better functionality for more complex image processing and analysis tasks. There is a really great (recent) vignette for EBImage, so I won’t repeat too much here. It creates it’s own class, Image, to store and process images. One part of this is the same array you get with the ‘tiff’ package. The other part is a list of attributes describing your image, which are much better at handling z and t stacks than the ‘tiff’ package. One thing I will say is that the display options can’t handle 32bit images, however you’ll also notice that it automatically corrects the display oddities that happen with just the raw array. (You can install EBImage by installing bioconductor with source("") followed by installing EBImage with biocLite("EBImage"))


kymo2 <- readImage("MAX_Reslice_of_low_pass_axon_16bit.tif")

## Image 
##   colorMode    : Grayscale 
##   storage.mode : double 
##   dim          : 950 181 
## : 1 
##   frames.render: 1 
## imageData(object)[1:5,1:6]
##           [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
## [1,] 0.2281071 0.1527733 0.2525826 0.1949340 0.2153201 0.3075303
## [2,] 0.1949645 0.1647364 0.2375677 0.1897612 0.2297551 0.2842451
## [3,] 0.1776913 0.1945373 0.2014038 0.1783322 0.2054322 0.2771954
## [4,] 0.1648585 0.1920958 0.1574426 0.2124056 0.1726101 0.2917525
## [5,] 0.1603571 0.2046693 0.1527733 0.1819638 0.1298543 0.2816510
display(kymo2, method = "raster") # setting method = "raster" previews images inside Rstudio, rather than in the interactive browser viewer

Other good stuff


So as I was browsing the new EBImage vignette the other day (prompted by Steve Royal’s tweet, I love sci-twitter), I discovered something that pretty much made my day. There is an R interface to the Bio-Formats library on Github. I had no idea such a thing existed! I am now hankering after the day I can use this in a project. No more batch import/export in ImageJ!

imager : Image Processing Library Based on ‘CImg’

Before I go, to be completist, I also wanted to point to the ‘imager’ package. This is authered by Simon Barthelmé, a CNRS researcher at Gipsa-lab, Grenoble. There’s a version on CRAN, a develpoment version on GitHub, and quite a few useful vignettes available. Worth a look.