Title: | Helper Functions to 'misc3d' and 'rgl' Packages for Brain Imaging |
---|---|
Description: | This includes functions for creating 3D and 4D images using 'WebGL', 'rgl', and 'JavaScript' commands. This package relies on the X toolkit ('XTK', <https://github.com/xtk/X#readme>). |
Authors: | John Muschelli [aut, cre] |
Maintainer: | John Muschelli <[email protected]> |
License: | GPL-2 |
Version: | 1.6.0 |
Built: | 2024-11-08 02:41:25 UTC |
Source: | https://github.com/muschellij2/brainr |
Brain Template from Copyright (C) 1993-2009 Louis Collins, McConnell Brain Imaging Centre, Montreal Neurological Institute, McGill University 6th generation non-linear symmetric brain
John Muschelli [email protected]
G. Grabner, A. L. Janke, M. M. Budge, D. Smith, J. Pruessner, and D. L. Collins, "Symmetric atlasing and model based segmentation: an application to the hippocampus in older adults", Med Image Comput Comput Assist Interv Int Conf Med Image Comput Comput Assist Interv, vol. 9, pp. 58-66, 2006.
Make scene returns a list of levels - but makes them mutually distinct.
So if cutoff 0.1, 0.2, then 0.1<= x < 0.2 is an roi, not > 0.1 and > 0.2.
Different than contour3d
as these are mutually exclusive levels.
makeScene(data, cutoffs, alpha, cols)
makeScene(data, cutoffs, alpha, cols)
data |
- 3D array of values (can be nifti-class) |
cutoffs |
- series of levels to be created |
alpha |
- alpha levels for each contour |
cols |
- colors for each contour |
scene with multiple objects - can be passed to write4D
This function takes in filenames, levels, and creates an output html file, with 4D elements. The html is based on XTK (https://github.com/xtk/X#readme)
scene4d( files, fnames = NULL, outfile = "index_4D_stl.html", levels = NULL, alpha = NULL, color = "white", useTemp = FALSE, MNITemp = c("1mm", "2mm"), objtype = "stl", ... )
scene4d( files, fnames = NULL, outfile = "index_4D_stl.html", levels = NULL, alpha = NULL, color = "white", useTemp = FALSE, MNITemp = c("1mm", "2mm"), objtype = "stl", ... )
files |
(character) vector of filenames (first being a brain file if useTemp=FALSE) |
fnames |
(character) filenames for the 3D surfaces in the scene - needs to be the same length as files |
outfile |
(character) html filename |
levels |
(numeric/list) levels to make contours/surfaces for each file. Either a numeric vector may be passed, one level for each file. Or a list of numeric vectors of multiple levels for each file. Will be coerced to a list. |
alpha |
(numeric/list) alpha opacities for each contours/surface for each file. Will be coerced to list similarly as levels |
color |
(character/list) colors for each contours/surface for each file. Will be coerced to list similarly as levels |
useTemp |
(logical) whether to use template from brainR as the brain figure |
MNITemp |
(character) if (useTemp = TRUE) either "1mm" or "2mm" denoting the resolution of the template used |
objtype |
(character) object type to write the files to. Either "stl", "obj", or "ply" to write. |
... |
other options to be passed to write4D |
### Faster - 8mm resampled but very coarse imgs <- paste("Visit_", 1:5, "_8mm.nii.gz", sep="") ifiles <- sapply(imgs, system.file, package='brainR') files = file.path(tempdir(), basename(ifiles)) file.copy(ifiles, files) outfile <- file.path(tempdir(), "index_4D_stl.html") scene4d(files, levels=rep(0.99, length(files)), outfile = outfile, color= rep("blue", length(files)), useTemp=TRUE, MNITemp = "8mm", alpha = rep(1, length(files)), rescale=TRUE ) ## Not run: imgs <- paste("Visit_", 1:5, ".nii.gz", sep="") ifiles <- sapply(imgs, system.file, package='brainR') files = file.path(tempdir(), basename(ifiles)) file.copy(ifiles, files) scene4d(files, levels=rep(0.99, length(files)), outfile = outfile, color= rep("blue", length(files)), useTemp=TRUEge, MNITemp = "8mm", alpha = rep(1, length(files)), rescale=TRUE ) ## End(Not run)
### Faster - 8mm resampled but very coarse imgs <- paste("Visit_", 1:5, "_8mm.nii.gz", sep="") ifiles <- sapply(imgs, system.file, package='brainR') files = file.path(tempdir(), basename(ifiles)) file.copy(ifiles, files) outfile <- file.path(tempdir(), "index_4D_stl.html") scene4d(files, levels=rep(0.99, length(files)), outfile = outfile, color= rep("blue", length(files)), useTemp=TRUE, MNITemp = "8mm", alpha = rep(1, length(files)), rescale=TRUE ) ## Not run: imgs <- paste("Visit_", 1:5, ".nii.gz", sep="") ifiles <- sapply(imgs, system.file, package='brainR') files = file.path(tempdir(), basename(ifiles)) file.copy(ifiles, files) scene4d(files, levels=rep(0.99, length(files)), outfile = outfile, color= rep("blue", length(files)), useTemp=TRUEge, MNITemp = "8mm", alpha = rep(1, length(files)), rescale=TRUE ) ## End(Not run)
This function takes in a scene and writes it out to a series of files either with the stl format or obj format (see writeOBJ and writeSTL)
write4D( scene, outfile, fnames = NULL, captions = NULL, writefiles = TRUE, reprint = TRUE, ... )
write4D( scene, outfile, fnames = NULL, captions = NULL, writefiles = TRUE, reprint = TRUE, ... )
scene |
list of 3D triangles (see contour3d). If a multicolored object is to be rendered (multiple contours with one control) - it must be in a list |
outfile |
html filename that is to be exported |
fnames |
filenames for the 3D surfaces in the scene - needs to be the same length as scene |
captions |
labels for checkboxes on html webpage |
writefiles |
(experimental) simply run the code to create the html and not write the .obj or .stl files |
reprint |
(logical, experimental) do you want to reprint the rgl before saving (common use by rgl functions) |
... |
other options to be passed to write4D.file |
#Brain Template from Copyright (C) 1993-2009 Louis Collins, #McConnell Brain Imaging Centre, #Montreal Neurological Institute, McGill University #6th generation non-linear symmetric brain ##Downsampled to 8mm using FSL fslmaths -subsamp2 template <- readNIfTI(system.file("MNI152_T1_8mm_brain.nii.gz", package="brainR") , reorient=FALSE) dtemp <- dim(template) ### 4500 - value that empirically value that presented a brain with gyri ### lower values result in a smoother surface brain <- contour3d(template, x=1:dtemp[1], y=1:dtemp[2], z=1:dtemp[3], level = 4500, alpha = 0.8, draw = FALSE) ### Example data courtesy of Daniel Reich ### Each visit is a binary mask of lesions in the brain imgs <- paste("Visit_", 1:5, "_8mm.nii.gz", sep="") files <- sapply(imgs, system.file, package='brainR') scene <- list(brain) ## loop through images and thresh nimgs <- length(imgs) cols <- rainbow(nimgs) for (iimg in 1:nimgs) { mask <- readNIfTI(files[iimg], reorient=FALSE) if (length(dim(mask)) > 3) mask <- mask[,,,1] ### use 0.99 for level of mask - binary activation <- contour3d(mask, level = c(0.99), alpha = 1, add = TRUE, color=cols[iimg], draw=FALSE) ## add these triangles to the list scene <- c(scene, list(activation)) } ## make output image names from image names fnames <- c("brain.stl", gsub(".nii.gz", ".stl", imgs, fixed=TRUE)) fnames = file.path(tempdir(), fnames) outfile <- file.path(tempdir(), "index.html") write4D(scene=scene, fnames=fnames, outfile=outfile, standalone=TRUE, rescale=TRUE) if (interactive()) { if (requireNamespace("servr", quietly = TRUE)) { servr::httd(tempdir()) } } unlink(outfile)
#Brain Template from Copyright (C) 1993-2009 Louis Collins, #McConnell Brain Imaging Centre, #Montreal Neurological Institute, McGill University #6th generation non-linear symmetric brain ##Downsampled to 8mm using FSL fslmaths -subsamp2 template <- readNIfTI(system.file("MNI152_T1_8mm_brain.nii.gz", package="brainR") , reorient=FALSE) dtemp <- dim(template) ### 4500 - value that empirically value that presented a brain with gyri ### lower values result in a smoother surface brain <- contour3d(template, x=1:dtemp[1], y=1:dtemp[2], z=1:dtemp[3], level = 4500, alpha = 0.8, draw = FALSE) ### Example data courtesy of Daniel Reich ### Each visit is a binary mask of lesions in the brain imgs <- paste("Visit_", 1:5, "_8mm.nii.gz", sep="") files <- sapply(imgs, system.file, package='brainR') scene <- list(brain) ## loop through images and thresh nimgs <- length(imgs) cols <- rainbow(nimgs) for (iimg in 1:nimgs) { mask <- readNIfTI(files[iimg], reorient=FALSE) if (length(dim(mask)) > 3) mask <- mask[,,,1] ### use 0.99 for level of mask - binary activation <- contour3d(mask, level = c(0.99), alpha = 1, add = TRUE, color=cols[iimg], draw=FALSE) ## add these triangles to the list scene <- c(scene, list(activation)) } ## make output image names from image names fnames <- c("brain.stl", gsub(".nii.gz", ".stl", imgs, fixed=TRUE)) fnames = file.path(tempdir(), fnames) outfile <- file.path(tempdir(), "index.html") write4D(scene=scene, fnames=fnames, outfile=outfile, standalone=TRUE, rescale=TRUE) if (interactive()) { if (requireNamespace("servr", quietly = TRUE)) { servr::httd(tempdir()) } } unlink(outfile)
This function takes in a scene and writes it out to a series of files either with the stl format or obj format
write4D.file( scene = NULL, outfile = "index_4D.html", fnames, visible = TRUE, opacity = 1, colors = NULL, captions = "", standalone = FALSE, rescale = FALSE, index.file = system.file("index_template.html", package = "brainR"), toggle = "checkbox", xtkgui = FALSE )
write4D.file( scene = NULL, outfile = "index_4D.html", fnames, visible = TRUE, opacity = 1, colors = NULL, captions = "", standalone = FALSE, rescale = FALSE, index.file = system.file("index_template.html", package = "brainR"), toggle = "checkbox", xtkgui = FALSE )
scene |
- list of 3D triangles (see contour3d). If a multicolored object is to be rendered (multiple contours with one control) - it must be in a list |
outfile |
- html filename that is to be exported |
fnames |
- filenames for the 3D surfaces in the scene - needs to be the same length as scene |
visible |
- logical vector indicating which structures are visible in html file |
opacity |
- list of alpha values - same length as scene; if sub-structures are present, then the each list element has length the number of structures |
colors |
- character vector of colors (col2rgb is applied) |
captions |
- labels for checkboxes on html webpage |
standalone |
- logical - should this be able to be rendered offline? |
rescale |
- rescale the scene? - in beta |
index.file |
- template html file used |
toggle |
- (experimental) "checkbox" (default) or "radio" for radio or checkboxes to switch thing |
xtkgui |
- (experimental) Logical to use xtkgui for objects |
template <- readNIfTI(system.file("MNI152_T1_8mm_brain.nii.gz", package="brainR") , reorient=FALSE) dtemp <- dim(template) ### 4500 - value that empirically value that presented a brain with gyri ### lower values result in a smoother surface brain <- contour3d(template, x=1:dtemp[1], y=1:dtemp[2], z=1:dtemp[3], level = 4500, alpha = 0.8, draw = FALSE) ### Example data courtesy of Daniel Reich ### Each visit is a binary mask of lesions in the brain imgs <- paste("Visit_", 1:5, "_8mm.nii.gz", sep="") files <- sapply(imgs, system.file, package='brainR') scene <- list(brain) ## loop through images and thresh nimgs <- length(imgs) cols <- rainbow(nimgs) for (iimg in 1:nimgs) { mask <- readNIfTI(files[iimg], reorient=FALSE) if (length(dim(mask)) > 3) mask <- mask[,,,1] ### use 0.99 for level of mask - binary activation <- contour3d(mask, level = c(0.99), alpha = 1, add = TRUE, color=cols[iimg], draw=FALSE) ## add these triangles to the list scene <- c(scene, list(activation)) } ## make output image names from image names fnames <- c("brain.stl", gsub(".nii.gz", ".stl", imgs, fixed=TRUE)) fnames = file.path(tempdir(), fnames) outfile <- file.path(tempdir(), "index.html") write4D.file( scene=scene, fnames=fnames, visible = FALSE, outfile=outfile, standalone=TRUE, rescale=TRUE) unlink(outfile) unlink(fnames)
template <- readNIfTI(system.file("MNI152_T1_8mm_brain.nii.gz", package="brainR") , reorient=FALSE) dtemp <- dim(template) ### 4500 - value that empirically value that presented a brain with gyri ### lower values result in a smoother surface brain <- contour3d(template, x=1:dtemp[1], y=1:dtemp[2], z=1:dtemp[3], level = 4500, alpha = 0.8, draw = FALSE) ### Example data courtesy of Daniel Reich ### Each visit is a binary mask of lesions in the brain imgs <- paste("Visit_", 1:5, "_8mm.nii.gz", sep="") files <- sapply(imgs, system.file, package='brainR') scene <- list(brain) ## loop through images and thresh nimgs <- length(imgs) cols <- rainbow(nimgs) for (iimg in 1:nimgs) { mask <- readNIfTI(files[iimg], reorient=FALSE) if (length(dim(mask)) > 3) mask <- mask[,,,1] ### use 0.99 for level of mask - binary activation <- contour3d(mask, level = c(0.99), alpha = 1, add = TRUE, color=cols[iimg], draw=FALSE) ## add these triangles to the list scene <- c(scene, list(activation)) } ## make output image names from image names fnames <- c("brain.stl", gsub(".nii.gz", ".stl", imgs, fixed=TRUE)) fnames = file.path(tempdir(), fnames) outfile <- file.path(tempdir(), "index.html") write4D.file( scene=scene, fnames=fnames, visible = FALSE, outfile=outfile, standalone=TRUE, rescale=TRUE) unlink(outfile) unlink(fnames)
This is code extracted from writeSTL
in
rgl
. This allows users to write the triangles in STL
without reprinting the rgl (which takes time)
writeTrianglesSTL(scene, con, ascii = FALSE)
writeTrianglesSTL(scene, con, ascii = FALSE)
scene |
list of triangles (that have class Triangles3D) |
con |
filename or connection of stl file to write |
ascii |
indicator if the file should be written in ascii or binary |
filename (invisible) of stl object
Adapted writeWebGL function that splits the triangles into 65535 vertices
writeWebGL_split(ids = rgl.ids()$id, writeIt = TRUE, verb = FALSE, ...)
writeWebGL_split(ids = rgl.ids()$id, writeIt = TRUE, verb = FALSE, ...)
ids |
- rgl ids (see rgl.ids) |
writeIt |
- (logical) write the file out |
verb |
- verbose output |
... |
- further arguments passed to writeWebGL |
if writeIt is TRUE, then returns the value from writeWebGL. Otherwise, returns the split triangles from the rgl objects
## Not run: #Brain Template from Copyright (C) 1993-2009 Louis Collins, #McConnell Brain Imaging Centre, #Montreal Neurological Institute, McGill University #6th generation non-linear symmetric brain template <- readNIfTI(system.file("MNI152_T1_2mm_brain.nii.gz", package="brainR") , reorient=FALSE) dtemp <- dim(template) ### 4500 - value that empirically value that presented a brain with gyri ### lower values result in a smoother surface brain <- contour3d(template, x=1:dtemp[1], y=1:dtemp[2], z=1:dtemp[3], level = 4500, alpha = 0.1, draw = FALSE) drawScene.rgl(brain) ### this would be the ``activation'' or surface you want to render - # hyper-intense white matter contour3d(template, level = c(8200, 8250), alpha = c(0.5, 0.8), add = TRUE, color=c("yellow", "red")) ### add text text3d(x=dtemp[1]/2, y=dtemp[2]/2, z = dtemp[3]*0.98, text="Top") text3d(x=-0.98, y=dtemp[2]/2, z = dtemp[3]/2, text="Right") fname <- "knitted_webGL.html" writeWebGL_split(dir=getwd(), filename =fname, template = system.file("my_template.html", package="brainR"), width=500, writeIt=TRUE) browseURL(fname) ## End(Not run)
## Not run: #Brain Template from Copyright (C) 1993-2009 Louis Collins, #McConnell Brain Imaging Centre, #Montreal Neurological Institute, McGill University #6th generation non-linear symmetric brain template <- readNIfTI(system.file("MNI152_T1_2mm_brain.nii.gz", package="brainR") , reorient=FALSE) dtemp <- dim(template) ### 4500 - value that empirically value that presented a brain with gyri ### lower values result in a smoother surface brain <- contour3d(template, x=1:dtemp[1], y=1:dtemp[2], z=1:dtemp[3], level = 4500, alpha = 0.1, draw = FALSE) drawScene.rgl(brain) ### this would be the ``activation'' or surface you want to render - # hyper-intense white matter contour3d(template, level = c(8200, 8250), alpha = c(0.5, 0.8), add = TRUE, color=c("yellow", "red")) ### add text text3d(x=dtemp[1]/2, y=dtemp[2]/2, z = dtemp[3]*0.98, text="Top") text3d(x=-0.98, y=dtemp[2]/2, z = dtemp[3]/2, text="Right") fname <- "knitted_webGL.html" writeWebGL_split(dir=getwd(), filename =fname, template = system.file("my_template.html", package="brainR"), width=500, writeIt=TRUE) browseURL(fname) ## End(Not run)