R/cytoviewer.R
cytoviewer.RdThis shiny R application allows users to interactively visualize multi-channel
images, segmentation masks and spatial cell locations generated by imaging mass
cytometry and other highly multiplexed imaging techniques. The cytoviewer
interface is divided into image-level (Composite and Channels), cell-level (Masks)
and point-level (Graph) visualization. It allows users to overlay individual
images with segmentation masks, integrates well with SingleCellExperiment
and SpatialExperiment objects for metadata visualization and supports
image downloads.
cytoviewer(
image = NULL,
mask = NULL,
object = NULL,
cell_id = NULL,
img_id = NULL,
coords = NULL
)(optional) a CytoImageList object containing
single or multi-channel Image objects.
(optional) a CytoImageList containing
single-channel Image objects.
(optional) a SingleCellExperiment or SpatialExperiment object.
character specifying the colData(object) entry, in which
the integer cell IDs are stored. These IDs should match the integer pixel
values in the segmentation mask object (mask).
character specifying the colData(object) and
mcols(mask) and/or mcols(image) entry,
in which the image IDs are stored.
character vector of length 2 specifying the names of the
colData (for a SingleCellExperiment object) or the
spatialCoords entries indicating the cells' x and y locations.
A Shiny app object for interactive multi-channel image visualization and exploration
The functionality of cytoviewer depends on which input objects are
user-provided. Below we describe the four use cases in respect to input
objects and functionality.
1. Usage of cytoviewer with images, masks and object
The full functionality of cytoviewer can be leveraged when
image, mask and object are provided.
This allows image-level visualization (Composite and Channels),
cell-level visualization, point-level visualization, overlaying images
with segmentation masks as well as metadata visualization.
2. Usage of cytoviewer with images only
If only image is specified, image-level visualization (Composite and
Channels) is possible.
3. Usage of cytoviewer with images and masks
Image-level visualization (Composite and Channels), overlaying of images with
masks and cell-level visualization is feasible when image and
mask are provided.
4. Usage of cytoviewer with masks and object
If mask and object are specified, cell-level visualization,
point-level visualization as well as metadata visualization is possible.
plotPixels for the function underlying
image-level visualization
plotCells for the function underlying
cell-level visualization
plotSpatial for the function underlying
point-level visualization
cytomapperShiny for a shiny application that
visualizes gated cells on images
# Load example datasets from cytomapper
library(cytomapper, quietly = TRUE)
#>
#> Attaching package: ‘MatrixGenerics’
#> The following objects are masked from ‘package:matrixStats’:
#>
#> colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
#> colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
#> colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
#> colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
#> colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
#> colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
#> colWeightedMeans, colWeightedMedians, colWeightedSds,
#> colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
#> rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
#> rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
#> rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
#> rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
#> rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
#> rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
#> rowWeightedSds, rowWeightedVars
#>
#> Attaching package: ‘generics’
#> The following objects are masked from ‘package:base’:
#>
#> as.difftime, as.factor, as.ordered, intersect, is.element, setdiff,
#> setequal, union
#>
#> Attaching package: ‘BiocGenerics’
#> The following objects are masked from ‘package:stats’:
#>
#> IQR, mad, sd, var, xtabs
#> The following objects are masked from ‘package:base’:
#>
#> Filter, Find, Map, Position, Reduce, anyDuplicated, aperm, append,
#> as.data.frame, basename, cbind, colnames, dirname, do.call,
#> duplicated, eval, evalq, get, grep, grepl, is.unsorted, lapply,
#> mapply, match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
#> rank, rbind, rownames, sapply, saveRDS, table, tapply, unique,
#> unsplit, which.max, which.min
#>
#> Attaching package: ‘S4Vectors’
#> The following object is masked from ‘package:utils’:
#>
#> findMatches
#> The following objects are masked from ‘package:base’:
#>
#> I, expand.grid, unname
#>
#> Attaching package: ‘IRanges’
#> The following objects are masked from ‘package:EBImage’:
#>
#> resize, tile
#> Welcome to Bioconductor
#>
#> Vignettes contain introductory material; view with
#> 'browseVignettes()'. To cite Bioconductor, see
#> 'citation("Biobase")', and for packages 'citation("pkgname")'.
#>
#> Attaching package: ‘Biobase’
#> The following object is masked from ‘package:MatrixGenerics’:
#>
#> rowMedians
#> The following objects are masked from ‘package:matrixStats’:
#>
#> anyMissing, rowMedians
#> The following object is masked from ‘package:EBImage’:
#>
#> channel
#>
#> Attaching package: ‘cytomapper’
#> The following objects are masked from ‘package:Biobase’:
#>
#> channelNames, channelNames<-
data("pancreasImages")
data("pancreasMasks")
data("pancreasSCE")
# 1. Use cytoviewer with images, masks and object
app <- cytoviewer(image = pancreasImages,
mask = pancreasMasks,
object = pancreasSCE,
img_id = "ImageNb",
cell_id = "CellNb",
coords = c("Pos_X", "Pos_Y"))
if (interactive()) {
shiny::runApp(app, launch.browser = TRUE)
}
## Other input variations (see "The input objects" section):
# 2. Use cytoviewer with images
app_1 <- cytoviewer(image = pancreasImages)
if (interactive()) {
shiny::runApp(app_1, launch.browser = TRUE)
}
# 3. Use cytoviewer with images and masks
app_2 <- cytoviewer(image = pancreasImages,
mask = pancreasMasks,
img_id = "ImageNb")
if (interactive()) {
shiny::runApp(app_2, launch.browser = TRUE)
}
# 4. Use cytoviewer with masks and object
app_3 <- cytoviewer(mask = pancreasMasks,
object = pancreasSCE,
img_id = "ImageNb",
cell_id = "CellNb",
coords = c("Pos_X", "Pos_Y"))
if (interactive()) {
shiny::runApp(app_3, launch.browser = TRUE)
}