Plotting numbers of features in EBImage in R

一笑奈何 提交于 2019-12-11 06:08:35

问题


I have a question regarding the computeFeatures function of EBImage. I used the following code to compute the features.

biocLite("EBImage")
library (EBImage)
Image <- readImage("test.jpg")
Image3<-getFrame(Image,3)
x = thresh(Image3, w=15, h=15, offset=0.05) 
x = opening(x, makeBrush(5, shape='disc')) 
x = bwlabel(x) 
fts = computeFeatures.shape(x) 

This gives me a list of the computed features. However, this is a list of 39 features, and I am only interested in a few of them. Thus I would like to know which of the computeFeatures correspond to each features in the image.

A solution was presented at http://www.bricol.net/research/leafranks/11-01MS/EBImage-introduction.pdf by using the following code:

> nmask = thresh(nuc, 10, 10, 0.05) 
> nmask = opening(nmask, makeBrush(5, shape='disc')) 
> nmask = fillHull(nmask) 
> nmask = bwlabel(nmask) Cell bodies are segmented using propagate. 
> ctmask = opening(cel>0.1, makeBrush(5, shape='disc')) 
> cmask = propagate(cel, nmask, ctmask)
> res = paintObjects(cmask, img, col='#ff00ff') 
> res = paintObjects(nmask, res, col='#ffff00')
> xy = lapply(hullFeatures(cmask), function(hf) hf[, c('g.x', 'g.y')]) 
> labels = lapply(xy, function(z) as.character(1:nrow(z))) 
> font = drawfont(weight=600, size=16) 
> res = drawtext(res, xy=xy, labels=labels , font=font, col="white")

Which plots numbers corresponding to the features on the Image. However, the function hullFeatures is no longer available.

Thus, is there an other way to plot the number of the features or objects in the Image?


回答1:


The functions hullFeatures and drawtext are defunct. hullFeatures has been replaced by computeFeatures.shape. Now one needs to use computeFeatures.moment to find the position of each object. The base text function is now used to add text to an image plotted in raster mode.

A great overview of EBImage can be found in the vignette: vignette("EBImage-introduction", package = "EBImage"). However, with version 4.22.1, the vignette no longer shows how to number the segmented objects. Here's a recreation of the example from the PDF dated April 22, 2010 by Pau, Sklyar and Huber.

To clarify the nomenclature a bit, the computeFeatures family of functions return a matrix of dimension n x p where n is the number of segmented objects (rows) and p is the number of features (columns). In this example, each object is a cell. The features returned by computeFeatures.moment are m.cx, m.cy, m.majoraxis, m.eccentricity and m.theta. The position is specified by the first two features.

# Starting from EBImage
  if (!require(EBImage)) {
    source("http://bioconductor.org/biocLite.R")
    biocLite("EBImage")
    library(EBImage)
  }

# Use example nuclei and cells, make colorized composite
  nuc <- readImage(system.file('images', 'nuclei.tif', package='EBImage'))
  cel <- readImage(system.file('images', 'cells.tif', package='EBImage'))
  img <- rgbImage(green=1.5*cel, blue=nuc)

# Recreate nuclear and cell masks, add border to color composite
  nmask <- thresh(nuc, 10, 10, 0.05)
  nmask <- opening(nmask, makeBrush(5, shape='disc')) 
  nmask <- fillHull(nmask) 
  nmask <- bwlabel(nmask)
  ctmask <- opening(cel>0.1, makeBrush(5, shape='disc')) 
  cmask <- propagate(cel, nmask, ctmask)
  res <- paintObjects(cmask, img, col='#ff00ff') 
  res <- paintObjects(nmask, res, col='#ffff00')

# Determine position (center of mass) of each object in 'cmask'
  M <- apply(cmask, 3, computeFeatures.moment) # list of length 4 returned
  xy <- lapply(M, function(m) m[,c("m.cx", "m.cy")])

# Create labels and plot in 'raster' mode 
  labels <- lapply(xy, function(z) as.character(1:nrow(z)))
  plot(getFrame(res, 3, type = "render")) # or plot(res[,,,3])

# Add labels by text function
  text(xy[[3]], labels[[3]], col = "white")



来源:https://stackoverflow.com/questions/48019788/plotting-numbers-of-features-in-ebimage-in-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!