Supervised Image Classification With Bio7, R And ImageJ


I created a new Bio7 example which demonstrates how to classify an image with Bio7, ImageJ and R.


For the classification I used the “randomForest” R package and an image example of ImageJ so you can reproduce the example quite easily. I made the example script as easy as possible and trained the classifier with 64 trees by default (see literature below). Not shown in the video is the procedure to control the prediction of the trained classifier with test data. You can find a simple script in the repository, too, which uses a method of the powerful ‘caret’ package.


If you have some recommendations of how to effectively use a decent classifier for image classification (e.g., which classifier is well suited for images, which tuning parameters are useful in this context, which additional signatures could be used, etc.) I would be happy to hear.


Fernández-Delgado, M., Cernadas, E., Barro, S. & Amorim, D. Do we Need Hundreds of Classifiers to Solve Real World Classification Problems? Journal of Machine Learning Research 15, 3133–3181 (2014).

Oshiro, T. M., Perez, P. S. & Baranauskas, J. A. in Machine Learning and Data Mining in Pattern Recognition (ed. Perner, P.) 154–168 (Springer Berlin Heidelberg, 2012).

Latinne, P., Latinne, P., Debeir, O. & Decaestecker, C. Limiting the Number of Trees in Random Forests. IN PROCEEDINGS OF MCS 2001, LNCS 2096, 2001.

New R plot preferences and improvements for the R editor in Bio7


In the current release of Bio7 2.3  two new plot preferences are available to automatically plot data with the size of the visible display (as an image) or with the size of available ImageSizeX and ImageSizeY R workspace variables.

The second option is handy if you transfer images from ImageJ to the R workspace (the variables ImageSizeX and ImageSizeY will be autmatically created, too). You can then create an R image plot (e.g. from a classification) in the same size as an overlay of the original image (in turn plotted and overlayed in ImageJ).


Improvements of the  R editor for the upcoming Bio7 2.4 release

For the upcoming release of Bio7 I also add new features to the Bio7 R editor.

Among other things until now I improved the code completion. If you now type a a left parenthesis you get a help tooltip if the function is known (if you load frequent used R packages with the Bio7 GUI interface the package function context will be added to the code completion, tooltip interface).


Screenshot 1: Improved tooltip when a left parenthesis is typed.


Figure 2: Code completion (Keys: CTRL+Space) now preselects the right context (e.g. functions with ‘.’ char)

In addition I added a function to set right parentheses, braces, etc. automatically when left parentheses, etc.  are typed in the R editor.

Bio7 Toolbar Improved


Finally I was able to find the CSS error in the toolbar layout which resulted in a visible gap when, e.g., the Flow editor was active. Now everything looks much better (see the red arrows!) especially when you install Eclipse plugins which make contributions to the main toolbar.


You can also add this corrections easily to a current Bio7 2.3 installation. Just add the following lines to the default Bio7 CSS (Path: Bio7/plugins/

.MToolBar.Draggable {
  handle-image: url(./dragHandle.png);

.MToolControl.TrimStack {
  handle-image: url(./dragHandle.png);

.MToolControl.Draggable {
  handle-image: url(./dragHandle.png);

And delete the following ‘handle-image’ line in the Perspective Switch attribute:

/*Perspective Switch!*/
#org-eclipse-ui-main-toolbar #PerspectiveSwitcher {
    handle-image: none;

Or just copy over the CSS from the default_win7.css github file.

Spatstat – An introduction and measurements with Bio7


Here I present a summary of a small spatstat workshop I created. I also explain in several videos how to transfer and convert 2d and 3D ImageJ measurements to a spatial point pattern with Bio7. The example datasets and code samples used here were taken from the spatstat help and from spatstat scripts cited at the end of the summary. The github repository with spatstat scripts, image scripts, documentation and more can be found here. I hope that this material is useful for others and helps in the creation of a spatial point pattern analysis with the fantastic spatstat package.


From the spatstat website:

‘spatstat is a package for analyzing spatial point pattern data. Its functionality includes exploratory data analysis, model-fitting, and simulation.’ (1)

The package supports:

  • creation, manipulation and plotting of point patterns
  • exploratory data analysis
  • simulation of point process models
  • parametric model-fitting
  • hypothesis tests and model diagnostic

Classes in spatstat

To handle point pattern datasets and related data, the spatstat package supports the following classes of objects:

  • ppp: planar point pattern
  • owin: spatial region (‘observation window’)
  • im: pixel image
  • psp: pattern of line segments
  • tess: tessellation
  • pp3: three-dimensional point pattern
  • ppx: point pattern in any number of dimensions
  • lpp: point pattern on a linear network

Creation of a point pattern object

A point pattern object can be created easily from x and y coordinates.

library (spatstat)
# some arbitrary coordinates in [0,1]
x <- runif(20)
y <- runif(20)
# the following are equivalent
X <- ppp(x, y, c(0,1), c(0,1))
X <- ppp(x, y)
X <- ppp(x, y, window=owin(c(0,1),c(0,1)))
# specify that the coordinates are given in metres
X <- ppp(x, y, c(0,1), c(0,1), unitname=c("metre","metres"))

Study region (window)

Many commands in spatstat require us to specify a window, study region or domain!

An object of class “owin” (‘observation window’) represents a region or window (rectangular, polygonal with holes, irregular) in two dimensional space.


w <- owin(c(0,1), c(0,1))
# the unit square
w <- owin(c(10,20), c(10,30), unitname=c("foot","feet"))
# a rectangle of dimensions 10 x 20 feet
# with lower left corner at (10,10)

# polygon (diamond shape)
w <- owin(poly=list(x=c(0.5,1,0.5,0),y=c(0,1,2,1)))
w <- owin(c(0,1), c(0,2), poly=list(x=c(0.5,1,0.5,0),y=c(0,1,2,1)))
# polygon with hole
  ho <- owin(poly=list(list(x=c(0,1,1,0), y=c(0,0,1,1)),
     list(x=c(0.6,0.4,0.4,0.6), y=c(0.2,0.2,0.4,0.4))))



Task 1: Create a point pattern object from x,y data.

Task 2: Create a point pattern object within a specified window object.

Example dataset


Summary statistics of the dataset


## Planar point pattern:  71 points
## Average intensity 0.007395833 points per square unit (one unit = 0.1 
## metres)
## Coordinates are integers
## i.e. rounded to the nearest unit (one unit = 0.1 metres)
## Window: rectangle = [0, 96] x [0, 100] units
## Window area = 9600 square units
## Unit of length: 0.1 metres

Computes the distance from each point to its nearest neighbour in a point pattern.


##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   2.236   5.541   8.246   7.908  10.050  15.650

Finds the nearest neighbour of each point in a point pattern.

m <- nnwhich(cells)
m2 <- nnwhich(cells, k=2)
#Plot nearest neighbour links
b <- cells[m]
arrows(cells$x, cells$y, b$x, b$y, angle=15, length=0.15, col="red")

Density plot:

plot(density(swedishpines, 10))

Contour plot of the dataset

contour(density(X,10), axes=FALSE)

How to create point data from an ImageJ particle analysis and Bio7

  1. Open an image dataset (we open the blobs.gif example image from the internet)
  2. Threshold the image
  3. Make a Particle Analysis (Analyze->Analyze Particles…). Select the option ‘Display results’
  4. Transfer the Results table data with the Image-Methods view action ‘Particles’ (ImageJ-Canvas menu: Window->Bio7-Toolbar – Action: Particles)
  5. Execute the R script below

#Plot is visualized in ImageJ (Java) coordinates!
X<- ppp(Particles$X, Particles$Y, c(0,imageSizeX), c(0,imageSizeY))
plot(x = 1, y = 1,xlim=c(0,imageSizeX),ylim=c(imageSizeY,0), type = "n", main = "blobs.gif", asp = 1, axes = F, xlab = "x", ylab = "y")
plot(X,axes=TRUE,xlim=c(1,imageSizeX),ylim=c(imageSizeY,1),add = T)
axis(2, las = 2)

We can also plot the points as an overlay (Script just for plotting – normally image data for spatstat has to be converted!).

im<, owin(xrange=c(0,imageSizeX), yrange=c(0,imageSizeY)))
#Plot is visualized in ImageJ (Java) coordinates!
plot(x = 1, y = 1,xlim=c(0,imageSizeX),ylim=c(imageSizeY,0), type = "n", main = "", asp = 1, axes = F, xlab = "x", ylab = "y"),add=T)
plot(X,xlim=c(0,imageSizeX),ylim=c(imageSizeY,0),add = T)

Video 1: Create a spatstat point pattern from a particle analysis

Video 2: Create a spatstat point pattern from SpatialPoints

Task 1: Create a spatstat object from the image example ‘Cell_Colony.jpg’.

Task 2: Create a density plot from the image ‘Cell_Colony.jpg’.

Task 3: Create a contour plot from the image ‘Cell_Colony.jpg’.

A polygonal window with a point pattern object can also be created with the ‘Image-Methods’ view action ‘Selection’ which opens a view to transfer different type of ImageJ selections as spatial data.

  1. Open the ‘Image-Methods’ view and execute the action ‘Selection’
  2. Open the blobs.gif example and make a polygonal selection
  3. Add the selection to the ROI Manager
  4. Transfer the selection with an enabled ‘Spatial Data’ option as a ‘Spatial Polygons’ – this will create the variable ‘spatialPolygon’ in the R workspace
  5. Convert the SpatialPolygon to a spatstat window object
  6. Threshold the image and execute the ‘Particle’ action in the Image-Methods view
  7. Make a Particle analysis with Bio7 and ImageJ
  8. Plot the particles with the polygonal window

The plot in R coordinates (0,0 in lower left)!


## Loading required package: sp
## Checking rgeos availability: TRUE

polWin<-as(spatialPolygons, "owin")


X<- ppp(Particles$X, Particles$Y,window=polWin)

Video: Create a spatstat point pattern with a polygonal window (study region)

Task 1: Create a polygonal point pattern object from the image ‘Cell_Colony.jpeg’.

Marked point patterns

Points in a spatial point pattern may carry additional information called a ‘mark’. A mark can represent additional information like height, diameter, species, etc. It is important to know that marks are not covariates (the points are not a result of the mark values!).

#from the spatstat help:
# marks
m <- sample(1:2, 20, replace=TRUE)
m <- factor(m, levels=1:2)
X <- ppp(x, y, c(0,1), c(0,1), marks=m)


With Bio7 and ImageJ marked point patterns can be created with the ‘Selection’ action which can transfer a SpatialPointDataFrame which again can be converted to a marked point pattern.

  1. Select points and transfer the selections to the ROI Manager
  2. Measure the selections and transfer the ImageJ Results Table to R with the Image-Methods view ‘IJ RT’ action
  3. Transfer the points of the ROI Manager as a SpatialPointsDataFrame (Enable the ‘Add selected data frame’ option and select the dataframe in the combobox)
  4. Convert the SpatialPointsDataFrame to a spatstat point pattern object with the results table as marks

spatialPointsDF<-as(spatialPointsDataFrame, "ppp")


#print a summary!

## Marked planar point pattern:  8 points
## Average intensity 0.0002494232 points per square unit
## Coordinates are integers
## i.e. rounded to the nearest unit
## Mark variables: Area, Mean, Min, Max, X, Y
## Summary:
##       Area        Mean          Min           Max            X        
##  Min.   :0   Min.   :160   Min.   :160   Min.   :160   Min.   : 75.0  
##  1st Qu.:0   1st Qu.:190   1st Qu.:190   1st Qu.:190   1st Qu.:124.9  
##  Median :0   Median :220   Median :220   Median :220   Median :198.5  
##  Mean   :0   Mean   :209   Mean   :209   Mean   :209   Mean   :173.1  
##  3rd Qu.:0   3rd Qu.:232   3rd Qu.:232   3rd Qu.:232   3rd Qu.:221.0  
##  Max.   :0   Max.   :248   Max.   :248   Max.   :248   Max.   :233.5  
##        Y         
##  Min.   : 27.50  
##  1st Qu.: 63.25  
##  Median :119.25  
##  Mean   :129.06  
##  3rd Qu.:204.38  
##  Max.   :230.00  
## Window: rectangle = [75, 233] x [27, 230] units
## Window area = 32074 square units

You can also transfer a dataframe from the Table view of Bio7 (rows must be equal to the number of points!) and assign it to the point pattern.

Video: Create a spatstat marked point pattern:

Task 1: Create a marked point pattern from the image ‘Cell_Colony.jpg’.

Task 2: Create a marked point pattern from spreadsheet data in Bio7.


Tropical rainforest point pattern dataset bei. We want to find out if trees prefer a steep or flat terrain. The data consists of extra covariate data in ‘bei.extra’, which contains a pixel image of terrain elevation and a pixel image of terrain slope.

slope <- bei.extra$grad
par(mfrow = c(1, 2))



Exploratory data analysis

Quadrat count:

Z <- bei.extra$grad
b <- quantile(Z, probs = (0:4)/4)
Zcut <- cut(Z, breaks = b, labels = 1:4)
V <- tess(image = Zcut) 
plot(bei, add = TRUE, pch = "+")


qb <- quadratcount(bei, tess = V)

The plot below is an estimate of the intensity p(z) as a function of terrain slope z. It indicates that the Beilschmiedia trees are relatively unlikely to be found on flat terrain (where the slope is less than 0.05) compared to steeper slopes.

plot(rhohat(bei, slope))

Quadrat counting

The study region is divided into rectangles (quadrats) of equal size, and the number of points in each rectangle is counted.

Q <- quadratcount(X, nx = 4, ny = 3)

##                x
## y               [0,0.25] (0.25,0.5] (0.5,0.75] (0.75,1]
##   (0.667,1]            0          2          1        3
##   (0.333,0.667]        2          2          2        1
##   [0,0.333]            0          1          2        4

plot(Q, add = TRUE, cex = 2)

Ripley’s K function

K <- Kest(X)

L function (common linear transformation of K)

  • lines below theoretical line -> over-dispersion
  • lines above theoretical line -> aggregation

L <- Lest(X)
plot(L, main = "L function")

Generate an envelope for the K and L function

ENV <- envelope(Y = swedishpines, fun = Kest, nsim = 40)

## Generating 40 simulations of CSR  ...
## 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
## 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
## 31, 32, 33, 34, 35, 36, 37, 38, 39,  40.
## Done.


ENVL <- envelope(Y = swedishpines, fun = Lest, nsim = 40)

## Generating 40 simulations of CSR  ...
## 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
## 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
## 31, 32, 33, 34, 35, 36, 37, 38, 39,  40.
## Done.


Task 1: Analyze the image example ‘Cell_Colony.jpg’ with the K and the L function.


Creation of line patterns

linePattern <- psp(runif(10), runif(10), runif(10), runif(10), window=owin())

Video: Create a spatstat line pattern

Dirichlet Tessellation of point pattern

X <- runifpoint(42)
plot(X, add=TRUE)

Point patterns in 3D

threeDPpp <- pp3(runif(10), runif(10), runif(10), box3(c(0,1)))

Video: Create a 3D point pattern from SpatialPoints measurements

Nearest neighbour measurements in 3D


##  [1] 0.3721581 0.1554657 0.2885439 0.1554657 0.5179962 0.6377469 0.1899220
##  [8] 0.2733618 0.1785442 0.1785442

Ripley’s K in 3D

threeDPppKest <- K3est(threeDPpp)

Point pattern example on a Linear Network (e.g. car accidents on a road)

Xlin <- rpoislpp(5, simplenet)

Fit a point process model to an observed point pattern.

# fit the stationary Poisson process
# to point pattern 'nztrees'

## Extracting model information...Evaluating trend...done.
## Checking arguments..determining simulation windows...

plot(modelFitted, main="Fitted Model")


Used for this script:

(1) A. Baddeley and R. Turner. Spatstat: an R package for analyzing spatial point patterns Journal of Statistical Software 12: 6 (2005) 1-42. ISSN: 1548-7660

(2) A. Baddeley and R. Turner. Modelling spatial point patterns in R. Chapter 2, pages 23-74 in In Case Studies in Spatial Point Pattern Modelling (eds. A. Baddeley, P. Gregori, J. Mateu, R. Stoica and D. Stoyan) Lecture Notes in Statistics 185. New York: Springer-Verlag 2006. ISBN: 0-387-28311-0

(3) A. Baddeley. Analysing Spatial Point Patterns in R. Workshop Notes, December 2010. Published online by CSIRO, Australia. Download here (232 pages, pdf, 12.2Mb)

Bio7 2.3 Released!


As a result of the useR conference 2015 with fantastic workshops and presentations where I also presented my software I released a new version of Bio7 with many improvements and new features inspired by the R conference and important for the next ImageJ conference 2015 where I will give a Bio7 workshop.

For this release I didn’t bundle R for MacOSX (so R is easier to update, etc.).
So for MacOSX and Linux R and Rserve have to be installed. But this becomes very easy because Bio7 uses now the default OS systems paths which normally point to the default R installation (as long as no path in the Bio7 preferences is specified).
In addition some precompiled Rserve binaries (cooperative mode) are available and can be installed easily from within R – see the installation section below.

Download Bio7:

Release notes:


  • Updated R to 3.2.2 (Windows).
  • Added new R Markdown functionality – see video below (installation of ‘rmarkdown’, ‘knitr’ package and ‘pandoc’ binary required).

  • Added an option to use the JavaFX browser to open HTML markdown knitr documents to allow a fullscreen view (primary F1,F2, secondary F3, tertiary F4, quartary F5 monitor).
  • Added a simple default markdown editor to Bio7.
  • Added a new wizard for markdown documents.
  • In the ‘Navigator’ view you can now set the working dir of R (context menu action).
  • Added a new convert to list action in the context menu of the R-Shell.
  • Added a new default hidden „Custom“ perspective“ in which custom views can be opened in a predefined layout.
  • Added two new actions to open Bio7 views more easily (as a replacement for the disfunctional open view actions).
  • Improved the ImageJ ‘Zoom In’ and ‘Zoom Out’ action (now zooms correctly to the mouse pointer).
  • Improved the default paths for Linux and MacOSX.
  • Now the R system path, the R default library path and the pdflatex path is fetched from the PATH environment (as long as no specific location is set in the Bio7 preferences ).
  • Improved the installation of Rserve on Linux and Mac with precompiled Rserve libraries which can be installed easily from within R (R version 3.2.2 required!) .
  • Compiled Rserve in cooperative mode for MacOSX and Linux. This will make the installation process of Rserve very easy.
  • Deactivated some R editor options by default (can be enabled in the R preferences).

HTML GUI editor

  • Mouse selection now works again (thanks to Java 1.8.60).

ImageJ and R

  • Changed the variables names for the size of the image in the Particles transfer to ‘imageSizeX’, ‘imageSizeY’ (to be in accordance with the image matrix transfer).
  • Improved the ‘ImageMethods’ view ‘Selection’ action (see video below). Now it is opened as a view for multiple transfers.
  • Added new actions to transfer ImageJ selections as SpatialPolygons, SpatialLines or Spatial Points (or SpatialPolygonsDataframe, etc., if an available dataframe is selected). Selected objects can be transferred georeferenced if a georeferenced raster file (*.geotiff) is selected – see video below:


  • More stability improvements.
  • Fixed some Eclipse 4.5 bugs, feature? which opened an extra shell when opening an SWT ‘InputDialog’ class.
  • Improved the visual appearance of menus (menu size can be set in the Bio7 ImageJ preferences).
  • Improved the path to the native OS applications by using the systems path by default. So normally no paths have to be adjusted.


  • Improved the stability by fixing a bug/feature? in the Nebula grid spreadsheet components.
  • Now R has to be installed seperately. The default path will be fetched from the OS environment PATH (as long as no path is given in the preferences).
  • Rserve has to be installed from within R. A compiled binary is available and can be installed easily (see installation details below).
  • Fixed some Font bugs (especially for the console). Fonts can be customized in the default Bio7 CSS!


  • Updated  Java to Jre 1.8.60.


  • Updated to version 1.50.a

Bug Fixes:

Many other improvements and bug fixes for Linux and MacOSX and Bio7 in general (see the Bio7 Bitbucket repository for details).


Simply unzip the archive of Bio7 2.3 (Windows, Linux) in your preferred OS location. The MacOSX version can be installed easily with the available *.dmg file installer. To start the application simply double click on the  Bio7 binary file.

R and Rserve installation

For Linux and MacOSX R and Rserve has to be installed. Bio7 will fetch the default paths from the OS System PATH (so hopefully no other adjustments have to be made).

Rserve has to be available in cooperative mode which can be installed from the Bio7 Bitbucket website from within R with:


install.packages(“”, repos=NULL)

Linux (compiled with Linux Mint 17.2):

install.packages(“”, repos=NULL)

Or simply download from the Bio7 Bitbucket repository:

Compilation of Rserve (if necessary):

Rserve can be compiled and installed in the local R application with the shell command:



R Markdown:

To use the R Markdown features please install the rmarkdown package, knitr from within R and the pandoc binaries from here:

For Windows and MacOSX pandoc must be on the system PATH – Linux adds the path by default.

You can also add the path in R with:

MacOSX: Add pandoc to the OS PATH. Else type in the R console:

> Sys.setenv(PATH=”/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin”)

or with the LaTeX path added:


Linux: After installation available. Else type in the R console:

> Sys.setenv(PATH=”/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin”)

Windows: Add pandoc path to the Windows PATH (evtl restart). Else type in the R console:

Sys.setenv(PATH=paste(Sys.getenv(“PATH”),”C:/pandoc”, sep=””))

The commands can be copied and saved for each startup (only if necessary) in the R preferences textfield: R->Preferences->Rserve Preferences->R startup commands


To use LaTeX with Bio7 please install a LaTeX environment e.g.

Windows: MiKeTX (

MacOSX: MacTeX (

Linux: TeX Live (

Then adjust the Bio7 path to the pdflatex binary (only necessary if not on the OS path!):

R->Preferences->Rserve preferences->pdflatex path

To get the installation location folder on Linux or on MacOSX type:

> which pdflatex

For Windows MikeTeX pdflatex can be typically found at:

C:\Program Files (x86)\MiKTeX 2.9\miktex\bin