diff --git a/DESCRIPTION b/DESCRIPTION index ae51159d..ec558df5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -58,6 +58,7 @@ Collate: 'searchlight.R' 'sparse_neurovec.R' 'spat_filter.R' + 'as_raster.R' 'zzz.R' RoxygenNote: 7.3.2.9000 Imports: diff --git a/NAMESPACE b/NAMESPACE index aac1da3e..e9b23703 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -45,6 +45,7 @@ export(as.dense) export(as.mask) export(as.matrix) export(as.sparse) +export(as.raster) export(as_nifti_header) export(axes) export(bilateral_filter) @@ -198,6 +199,7 @@ exportMethods(as.mask) exportMethods(as.matrix) exportMethods(as.numeric) exportMethods(as.sparse) +exportMethods(as.raster) exportMethods(axes) exportMethods(bounds) exportMethods(centroid) diff --git a/R/all_generic.R b/R/all_generic.R index 3e310fe3..bed26ab6 100644 --- a/R/all_generic.R +++ b/R/all_generic.R @@ -1450,6 +1450,7 @@ if (!isGeneric("image")) #' @param x An object to be converted. #' @param ... Additional arguments passed to the conversion methods. #' @return A \code{raster} object representing \code{x}. +#' @export #' @rdname as.raster if (!isGeneric("as.raster")) setGeneric("as.raster", function(x, ...) standardGeneric("as.raster")) diff --git a/R/as_raster.R b/R/as_raster.R new file mode 100644 index 00000000..5d7bdc78 --- /dev/null +++ b/R/as_raster.R @@ -0,0 +1,32 @@ +#' Convert neuroimaging objects to raster images +#' +#' These methods convert \code{NeuroSlice} and \code{NeuroVol} objects +#' into \code{raster} images that can be displayed with +#' \code{grid::grid.raster} or base \code{plot}. +#' +#' @inheritParams plot,NeuroSlice-method +#' @param x object to convert. +#' @param zlevel slice index for \code{NeuroVol} objects. Defaults to the middle slice. +#' @param ... additional arguments passed to methods +#' @return A \code{raster} object +#' @seealso \code{\link{plot,NeuroSlice-method}}, \code{\link{plot,NeuroVol-method}} +#' @rdname as.raster-methods +#' @export +setMethod("as.raster", "NeuroSlice", + function(x, + cmap=gray(seq(0,1,length.out=255)), + irange=range(x, na.rm=TRUE), ...){ + cols <- mapToColors(x, col=cmap, alpha=1, + irange=irange, zero_col="#00000000") + grDevices::as.raster(cols) + }) + +#' @rdname as.raster-methods +#' @export +setMethod("as.raster", "NeuroVol", + function(x, zlevel=ceiling(dim(x)[3]/2), + cmap=gray(seq(0,1,length.out=255)), + irange=range(x, na.rm=TRUE), ...){ + sl <- slice(x, zlevel=zlevel, along=3) + as.raster(sl, cmap=cmap, irange=irange, ...) + }) diff --git a/R/neuroslice.R b/R/neuroslice.R index 205ac3d1..06eef578 100644 --- a/R/neuroslice.R +++ b/R/neuroslice.R @@ -178,6 +178,8 @@ setMethod(f="index_to_grid", #' @details when `x` is a NeuroSlice object, the plot method returns a \code{ggplot2} object containing the raster visualization of the slice data. #' The plot can be further customized using standard ggplot2 functions. #' +#' @seealso \code{\link{as.raster}} +#' #' @examples #' # Create example slice #' slice_space <- NeuroSpace(c(100, 100)) diff --git a/R/neurovol.R b/R/neurovol.R index b8994b91..38c68a40 100644 --- a/R/neurovol.R +++ b/R/neurovol.R @@ -1083,6 +1083,7 @@ setMethod(f="[", signature=signature(x = "SparseNeuroVol", i = "numeric", j = "n #' @param alpha the level of alpha transparency #' @param bgvol a background volume that serves as an image underlay (currently ignored). #' @param bgcmap a color map for backround layer consisting of a vector of colors in hex format (e.g. \code{gray(n=255)}) +#' @seealso \code{\link{as.raster}} #' @export #' @importFrom graphics plot #' @import colorplane diff --git a/man/as.raster-methods.Rd b/man/as.raster-methods.Rd new file mode 100644 index 00000000..37bd5fa2 --- /dev/null +++ b/man/as.raster-methods.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/as_raster.R +\name{as.raster,NeuroSlice-method} +\alias{as.raster,NeuroSlice-method} +\alias{as.raster,NeuroVol-method} +\title{Convert neuroimaging objects to raster images} +\usage{ +\S4method{as.raster}{NeuroSlice}(x, cmap = gray(seq(0, 1, length.out = 255)), irange = range(x, na.rm = TRUE)) +\S4method{as.raster}{NeuroVol}(x, zlevel = ceiling(dim(x)[3]/2), cmap = gray(seq(0, 1, length.out = 255)), irange = range(x, na.rm = TRUE)) +} +\arguments{ +\item{x}{object to convert} +\item{cmap}{color map used to map intensities to colors} +\item{irange}{intensity range used for scaling} +\item{zlevel}{slice index for \code{NeuroVol} objects} +} +\value{ +A \code{raster} object suitable for plotting. +} +\description{ +Convert \code{NeuroSlice} or \code{NeuroVol} objects to raster images. +} +\seealso{\code{\link{plot,NeuroSlice-method}},\code{\link{plot,NeuroVol-method}}} diff --git a/man/plot-methods.Rd b/man/plot-methods.Rd index 421ee97a..c90cb217 100644 --- a/man/plot-methods.Rd +++ b/man/plot-methods.Rd @@ -51,6 +51,7 @@ The intensity values are mapped to colors using the specified colormap and range when `x` is a NeuroSlice object, the plot method returns a \code{ggplot2} object containing the raster visualization of the slice data. The plot can be further customized using standard ggplot2 functions. } +\seealso{\code{\link{as.raster}}} \examples{ # Create example slice slice_space <- NeuroSpace(c(100, 100)) diff --git a/tests/testthat/test-as-raster.R b/tests/testthat/test-as-raster.R new file mode 100644 index 00000000..c331b888 --- /dev/null +++ b/tests/testthat/test-as-raster.R @@ -0,0 +1,17 @@ +test_that("as.raster works for NeuroSlice", { + space <- NeuroSpace(c(10, 10)) + dat <- matrix(rnorm(100), 10, 10) + sl <- NeuroSlice(dat, space) + r <- as.raster(sl) + expect_s3_class(r, "raster") + expect_equal(dim(r), dim(dat)) +}) + +test_that("as.raster works for NeuroVol", { + space <- NeuroSpace(c(10,10,5)) + dat <- array(rnorm(10*10*5), c(10,10,5)) + vol <- NeuroVol(dat, space) + r <- as.raster(vol, zlevel=1) + expect_s3_class(r, "raster") + expect_equal(dim(r), dim(dat)[1:2]) +})