Diff of /R/coarse_body.R [000000] .. [3b2327]

Switch to side-by-side view

--- a
+++ b/R/coarse_body.R
@@ -0,0 +1,53 @@
+#' @title Coarse Masking of Image from Z-slicding
+#' @description Calculates a Hull at each slice then stacks them
+#'
+#' @param x Binary \code{antsImage}
+#' @param keep_slices number of slices to keep if needed
+#'
+#' @return Array or \code{antsImage} object
+#' @export
+#' @importFrom ANTsRCore is.antsImage
+#' @importFrom ptinpoly pip2d
+coarse_body = function(x, keep_slices = 20) {
+  
+  bb = as.array(x) > 0
+  dimg = dim(bb)
+  number_slices = dimg[3]
+  dslice = dimg[1:2]
+  ind = which(bb, arr.ind = TRUE)
+  omat = array(FALSE, dim = dimg)
+  
+  
+  ind = as.data.frame(ind)
+  ps = split(ind, ind[,3])
+  ps = lapply(ps, function(x){
+    as.matrix(x[, 1:2])
+  })
+  
+  # get values that are true for ellipse
+  # same for all slices
+  L = lapply(dslice, seq)
+  test.ind = as.matrix(expand.grid(L))
+  
+  res = lapply(ps, ptinpoly::pip2d, Queries = test.ind)
+  
+  i = 1
+  for (i in seq(number_slices)) {
+    # print(i)
+    r = res[[i]] >= 0
+    get_ind = test.ind[r, ]
+    omat[,,i][get_ind] = TRUE
+  }
+  
+  prob = apply(omat, c(1,2), mean)
+  prob = prob > (keep_slices/number_slices)
+  
+  for (i in seq(number_slices)) {
+    # print(i)
+    omat[,,i][!prob] = FALSE
+  }
+  if (is.antsImage(x)) {
+    omat = as.antsImage(omat, reference = x)
+  }
+  return(omat)
+}