#' Compute SUVR from PET time series images
#'
#' The standardized uptake value (SUV) ratio (SUVR) is a semi-quantative
#' transformation that is performed on a PET image before intepretation. This
#' function will run rigid motion correction on the PET time series before
#' computing SUVR. The implementation also requires an anatomical image and a
#' segmentation that defines the reference region. This function will produce
#' a mask, a motion corrected image and a PET suvr image mapped to the reference
#' anatomical space.
#'
#' @param petTime pet time series antsImage or 3D image
#' @param anatomicalImage antsImage that indicates the target anatomical image.
#' one should choose this image carefully, as it will impact results. one might
#' compare results with, for example, either whole head or whole brain targets.
#' @param anatomicalSegmentation antsImage in the same space as anatomicalImage.
#' This image should contain a whole brain mask in addition to a labeled
#' reference region for computing SUVR.
#' @param smoothingParameter physical space smoothing parameter see \code{smoothImage}
#' @param labelValue the integer value of the reference region as it
#' appears in anatomicalSegmentation. If not set, we assume a binary segmentation.
#' @param subtractBackground if TRUE, the method will attempt to estimate the
#' background (non-anatomical) activation levels before computing SUVR. In this
#' case, SUVR will be computed after subtracting this background value from the
#' mean activation image.
#' @param mapToPet boolean option causing pet to be used as fixed image in the
#' rigid registration between anatomical and pet
#' @param noMotionCorr boolean option activating simple and fast approach that
#' may be better for dynamic data with insufficient per-frame information
#' @return suvr antsImage
#' @author Avants BB
#' @examples
#'
#' \dontrun{
#' suvr <- petSUVR( petTime, seg )
#' }
#'
#' @export petSUVR
petSUVR <- function(
petTime,
anatomicalImage,
anatomicalSegmentation,
smoothingParameter = 2.5,
labelValue = 0,
subtractBackground = FALSE,
mapToPet = TRUE,
noMotionCorr = FALSE )
{
idim = petTime@dimension
# petTime = petTime - min( petTime )
if ( idim == 4 ) pet = getAverageOfTimeSeries( petTime )
if ( idim == 3 ) {
pet = antsImageClone( petTime )
petMoco = antsImageClone( petTime )
}
if ( idim == 4 )
{
if ( pet@dimension == 3 )
petRef = as.antsImage( as.array( petTime )[,,,1] )
if ( pet@dimension == 2 )
petRef = as.antsImage( as.array( petTime )[,,1] )
petRef = antsCopyImageInfo( pet, petRef )
typetx = "Rigid"
if ( noMotionCorr ) petMoco = antsImageClone( petTime )
if ( !noMotionCorr ) {
if ( length( smoothingParameter ) == 1 & idim == 4 )
smoothingParameterT = c( rep( 1, 3 ), 0 )
petTimeSmoothed = smoothImage( petTime, smoothingParameterT,
sigmaInPhysicalCoordinates = TRUE )
petMoco = antsrMotionCalculation( petTimeSmoothed, petRef,
typeofTransform = typetx, verbose=F )$moco_img
}
pet = getAverageOfTimeSeries( petMoco )
}
typetx = "Rigid"
pets = smoothImage( getAverageOfTimeSeries( petTime ),
smoothingParameter, sigmaInPhysicalCoordinates = TRUE )
petmaskOrig = getMask( pets )
if ( subtractBackground )
{
petbkgd = mean( pet[ petmaskOrig == 0 ] )
pet = pet - petbkgd
}
if ( mapToPet )
{
petreg = antsRegistration( pets, anatomicalImage, typeofTransform = typetx,
# mask = petmaskOrig,
verbose = FALSE )
wti = TRUE
}
else {
brainmask = getMask( anatomicalSegmentation )
# petreg = antsRegistration( anatomicalImage, pets, typeofTransform = typetx,
# mask = brainmask, verbose = FALSE )
petreg1 = antsRegistration( anatomicalImage, pets,
typeofTransform = typetx, verbose = FALSE )
tempmask = antsApplyTransforms( pets, brainmask,
whichtoinvert = c( TRUE ), transformlist = petreg1$fwdtransforms )
petreg = antsRegistration( anatomicalImage, pets,
mask = brainmask,
typeofTransform = typetx, verbose = FALSE,
initialTransform = petreg1$fwdtransforms )
wti = FALSE
}
petmask = antsApplyTransforms( anatomicalImage, petmaskOrig,
whichtoinvert = c( wti ),
transformlist = petreg$fwdtransforms, interpolator='NearestNeighbor' )
if ( idim == 4 )
{
temp = antsApplyTransforms( anatomicalImage, petMoco,
whichtoinvert = c( wti ),
transformlist = petreg$fwdtransforms, interpolator='Linear', imagetype=3 )
pets = getAverageOfTimeSeries( temp )
}
if ( idim == 3 )
{
temp = antsApplyTransforms( anatomicalImage, petMoco,
whichtoinvert = c( wti ),
transformlist = petreg$fwdtransforms, interpolator='Linear' )
pets = antsImageClone( temp )
}
# NOTE: here, the pet image is now in the anatomical space
if ( labelValue > 0 )
{
cerebellum = thresholdImage( anatomicalSegmentation, labelValue, labelValue )
pcerebct = mean( pets[ cerebellum == 1 & petmask == 1 ] )
} else pcerebct = mean( pets[ anatomicalSegmentation == 1 & petmask == 1 ] )
petSUVR = smoothImage( pets / pcerebct, smoothingParameter,
sigmaInPhysicalCoordinates = TRUE )
return(
list( petSUVR = petSUVR,
petMask = petmask,
petMOCO = temp )
)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.