#' A rfSegmentation function.
#'
#' Unsupervised image segmentation via random forests. An example.
#'
#' @param featureMatrix input matrix of features matched to mask size
#' n predictors in rf
#' @param mask input antsImage mask
#' @param labelimg input antsImage labelimage, optional for supervised seg
#' @param ntrees number of rf trees
#' @param verbose boolean
#' @return list of n-probability images is output where n is number of classes
#' @author Tustison NJ, Avants BB
#' @seealso \code{\link{mrvnrfs}}
#' @examples
#' \dontrun{
#' if (usePkg("randomForest")) {
#' img <- antsImageRead(getANTsRData("r16")) %>% iMath("Normalize")
#' mask <- getMask(img)
#' segs <- kmeansSegmentation(img, k = 3, kmask = mask)
#' fmat0 <- t(antsrimpute(getNeighborhoodInMask(img, mask, c(2, 2))))
#' fmat1 <- t(antsrimpute(getNeighborhoodInMask(
#' segs$probabilityimages[[1]], mask, c(2, 2)
#' )))
#' fmat2 <- t(antsrimpute(getNeighborhoodInMask(
#' segs$probabilityimages[[2]], mask, c(2, 2)
#' )))
#' fmat3 <- t(antsrimpute(getNeighborhoodInMask(
#' segs$probabilityimages[[3]], mask, c(2, 2)
#' )))
#' fmat <- cbind(fmat0, fmat1, fmat2, fmat3)
#' # produces proximity between all voxel pairs
#' rfsegs <- rfSegmentation(fmat, verbose = FALSE)
#' lrr <- lowrankRowMatrix(rfsegs, 10, faster = TRUE)
#' nv <- eanatSelect(
#' inmat = lrr, mask = mask, selectorScale = 1.2, cthresh = 50,
#' verbose = T, smooth = 1
#' )
#' ee <- eanatDef(lrr, mask,
#' nvecs = nv, smooth = 0., cthresh = 50,
#' its = 2, verbose = TRUE
#' )
#' eseg <- eigSeg(mask, ee)
#' plot(img, eseg)
#' }
#' }
#' @export rfSegmentation
rfSegmentation <- function(
featureMatrix,
mask, labelimg = NULL,
ntrees = 100, verbose = FALSE) {
if (nargs() == 0) {
print("Usage: probs<-rfSegmentation( x, x2 ) ")
return(1)
}
haverf <- usePkg("randomForest")
if (!haverf) {
print("need randomForest package for this function")
return(NA)
}
mask <- check_ants(mask)
haveLabels <- !is.null(labelimg)
if (haveLabels) {
labelimg <- check_ants(labelimg)
labels <- as.factor(labelimg[mask == 1])
mydf <- data.frame(labels = labels, featureMatrix)
myrf <- randomForest::randomForest(
y = labels, x = featureMatrix, ntree = ntrees, type = "classification",
importance = TRUE, na.action = na.omit, do.trace = verbose
)
} else {
myrf <- randomForest::randomForest(
x = featureMatrix, ntree = ntrees,
type = "unsupervised",
importance = TRUE, na.action = na.omit, do.trace = verbose
)
return(myrf$proximity)
}
if (verbose) print(myrf)
probabilityimages <- predict(myrf, type = "prob")
probabilityimages <- matrixToImages(t(probabilityimages), mask)
segs <- antsImageClone(mask)
segs[mask == 1] <- predict(myrf)
myout <- list(segmentation = segs, probabilityimages = probabilityimages, rfModel = myrf)
return(myout)
}
#' A rfSegmentationPredict function.
#'
#' Predict image segmentation via random forests.
#'
#' @param rfSegmentationModel input rf model
#' @param featureMatrix input feature matrix
#' @param mask antsImage mask
#' @param verbose bool
#' @return segmentation is output
#' @author Tustison NJ, Avants BB
#' @examples
#'
#' if (usePkg("randomForest")) {
#' img <- antsImageRead(getANTsRData("r16"))
#' mask <- getMask(img)
#' mask2 <- getMask(img)
#' mask[129:255, 1:255] <- 0
#' mask2[2:128, 1:255] <- 0
#' segs <- kmeansSegmentation(img, k = 3, kmask = mask)
#' fmat <- t(antsrimpute(getNeighborhoodInMask(img, mask, c(2, 2))))
#' rfsegs <- rfSegmentation(fmat, mask, segs$segmentation, ntrees = 100)
#' fmat2 <- t(antsrimpute(getNeighborhoodInMask(img, mask2, c(2, 2))))
#' rfseg2 <- rfSegmentationPredict(rfsegs$rfModel, fmat2, mask2)
#' }
#'
#' @export rfSegmentationPredict
rfSegmentationPredict <- function(
rfSegmentationModel, featureMatrix,
mask, verbose = FALSE) {
segs <- antsImageClone(mask)
segs[mask == 1] <- predict(rfSegmentationModel, newdata = featureMatrix)
return(segs)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.