propagate {EBImage} | R Documentation |
R implementation of the Voronoi-based image segmentation on image manifolds [2].
## S4 method for signature 'Image, IndexedImage': propagate(x, seeds, mask=NULL, lambda=0.1, ext=1, seed.centers=FALSE, ...)
x |
An object of Image to be segmented,
in the Grayscale mode. |
seeds |
An object of IndexedImage of the same
size as x in all three dimensions. This image provides seed points for object detection. |
mask |
An object of Image of the same
size as x in all three dimensions; in the Grayscale mode.
All zero regions will be excluded from object detection. |
lambda |
A numeric value. The regularisation parameter for the
distance calculations, determines the trade-off between the Euclidian distance in
the image plane and the contribution of the gradient of the values
in x . See details. |
ext |
Extension of the neighborhood to estimate image gradient, in pixels in every direction from the central point, i.e. ext=1 means a 3x3 neighborhood. |
seed.centers |
If TRUE , only centers of the seed points are left
in the seeds image supplied to the propagate algorithm. |
... |
Reserved. |
The method operates by computing a discretized approximation of the Voronoi regions for given seed points on a manifold with a metric controlled by local image features.
The metric is a Riemannian metric defined in terms of the image I and a regularization parameter lambda. With this metric the distance between pixels used to let the given seeds grow outwards (propagate) is
d^2 = (grad(I)^2 + lambda * (dx^2 + dy^2)) / (lambda + 1)
The above formulation was proposed by Carpenter et al, however in the calculation we use a modified distance measture, in which sharp gradients are downregulated and large distances additionally penalized. Effectively, we use the following formula:
d = sqrt(grad(I)) + 1e-3*lambda * (dx^2+dy^2)^2
The denominator is left out for speed reasons, so is the square root of the distance.
The gradient is calculated on a neighborhood of pixels (the width of which
is controlled by the argument ext
) to avoid relying on single
(noisy) pixels. Lambda controls the weight of the Euclidian distance
term. In case of large
lambda, d turns into Euclidian distance in the (x,y)
-plane.
For small lambda, the distance will be dominated by the intensity gradient.
An image of Image
, with the same object indexing as
seeds
. No new objects are created, only those specified by
seeds are propagated. Use getFeatures
to assign the
feature matrix.
The underlying C++
code is based on code from CellProfiler
[1,3]. An LGPL license was granted by Thouis Jones to use this part
of CellProfiler's code for the propagate
function.
Original CellProfiler code: Anne Carpenter <carpenter@wi.mit.edu>, Thouis Jones <thouis@csail.mit.edu>, In Han Kang <inthek@mit.edu>.
Port for this package: Oleg Sklyar <osklyar@ebi.ac.uk> and Wolfgang Huber <huber@ebi.ac.uk>.
[1]
A. Carpenter, T.R. Jones, M.R. Lamprecht, C. Clarke, I.H. Kang,
O. Friman, D. Guertin, J.H. Chang, R.A. Lindquist, J. Moffat,
P. Golland and D.M. Sabatini, "CellProfiler: image analysis software
for identifying and quantifying cell phenotypes", Genome Biology 2006, 7:R100
[2]
T. Jones, A. Carpenter and P. Golland,
"Voronoi-Based Segmentation of Cells on Image Manifolds",
CVBIA05 (535-543), 2005
[3]
CellProfiler: http://www.cellprofiler.org
IndexedImage, Image, watershed, getFeatures
## load images of nuclei (seed points later) f <- paste( system.file(package="EBImage"), "images/Gene1_G.tif", sep="/" ) ii = readImage(f) ## normalize images ii = normalize(ii, separate=TRUE) ## segment mask = thresh(ii, 25, 25, 0.02) ## refine segmentation with morphology filters mk3 = morphKern(3) mk5 = morphKern(5) mask = dilate(erode(closing(mask, mk5), mk3), mk5) ## index objects with 'watershed' io = watershed( distmap(mask), 1.5, 1) if (interactive()) display(io) ## load images of cells (the ones to segment with propagate) f <- paste( system.file(package="EBImage"), "images/Gene1_R.tif", sep="/" ) xi = readImage(f) ## normalize images xi = normalize(xi, separate=TRUE) ## segment mask = thresh(xi, 40, 40, 0.0) ## refine segmentation with morphology filters mk7 = morphKern(7) mask = dilate(erode(closing(mask, mk7), mk5), mk7) ## index objects of xi with 'propagate' using ii as seeds xo = propagate(xi, io, mask, 1e-2, 2) if (interactive()) display(xo)