#' Propagate Joint Label Fusion (JLF) solutions through a time series
#'
#' The JLF initialization is reused throughout a time series with an additional
#' lag argument.
#'
#' @param targetI antsImage list to be approximated
#' @param targetIMask mask with value 1
#' @param atlasList list containing antsImages with intensity images
#' @param rad neighborhood radius, default to 2
#' @param labelList optional list containing antsImages with segmentation labels
#' @param rSearch radius of search, default is 3
#' @param lagValue number of prior images to use to fwd propagate JLF solution
#' @param ... arguments to pass to \code{\link{jointLabelFusion}}
#' @param verbose boolean
#' @return segmentation of time series
#' @author Brian B. Avants
#' @keywords fusion, template
#' @export
#'
#' @examples
#' \dontrun{
#' set.seed(123)
#' ref = ri( 1 ) %>% resampleImage( 4 ) %>% iMath( "Normalize" )
#' mi1 = ri( 2 )
#' mi2 = ri( 3 )
#' mi3 = ri( 4 )
#' mi4 = ri( 5 )
#' mi5 = ri( 6 )
#' refmask<-getMask( ref )
#' refmask<-iMath( refmask, "MD", 10 ) # just to speed things up
#' ilist<-list( mi1, mi2, mi3, mi4, mi5 )
#' seglist<-list()
#' for ( i in 1:length(ilist) )
#' {
#' ilist[[i]]<-iMath(ilist[[i]],"Normalize")
#' mytx<-antsRegistration(fixed=ref , moving=ilist[[i]] ,
#' typeofTransform = c("Affine"), verbose = TRUE )
#' mywarpedimage<-antsApplyTransforms(fixed=ref,
#' moving=ilist[[i]],
#' transformlist=mytx$fwdtransforms)
#' ilist[[i]]=mywarpedimage
#' seg<-thresholdImage( ilist[[i]],"Otsu", 3)
#' seglist[[i]]<-seg+1
#' }
#' tarlist = list(
#' iMath( ref, "GD", 3),
#' iMath( ref, "GD", 2),
#' iMath( ref, "GD", 1),
#' iMath( ref, "GD", 0),
#' iMath( ref, "GE", 1),
#' iMath( ref, "GE", 2),
#' iMath( ref, "GE", 3) )
#' pp = jlfProp( tarlist, refmask, ilist, rSearch=2,
#' labelList=seglist, rad = rep( 2, length( dim( ref ) ) ) )
#' }
jlfProp <- function(
targetI,
targetIMask,
atlasList,
rad = 2,
labelList = NULL,
rSearch = 3,
lagValue = 3,
verbose = FALSE,
...
)
{
# #' @param constrain weights to be non-negative
nonnegative = TRUE
# algorithm:
# 1. compute JLF at time point1
newAtlas = list( )
newLabs = list( )
for ( k in 1:lagValue ) {
if ( verbose ) print( paste0( "Pre: Lag ", k ) )
jlfk = jointLabelFusion(
targetI = targetI[[ k ]],
targetIMask = targetIMask,
atlasList = atlasList,
rad = rad,
labelList = labelList,
rSearch = rSearch, ..., verbose=verbose )
newAtlas[[ k ]] = targetI[[ k ]]
newLabs[[ k ]] = jlfk$segmentation
}
# 2. compute JLF at t+k including the result from (t+k-lagValue) as atlas
for ( k in (lagValue+1):length( targetI ) ) {
if ( verbose ) print( paste0( "Prop: Lag ", k , " of ", length( targetI ) ) )
jlfk = jointLabelFusion(
targetI = targetI[[ k ]],
targetIMask = targetIMask,
atlasList = newAtlas[ (k-lagValue):(k-1) ],
rad = rad,
labelList = newLabs[ (k-lagValue):(k-1) ],
rSearch = rSearch, ...,
verbose=verbose )
newAtlas[[ k ]] = targetI[[ k ]]
newLabs[[ k ]] = jlfk$segmentation
}
return( newLabs )
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.