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

Switch to side-by-side view

--- a
+++ b/R/register_lung_mask.R
@@ -0,0 +1,151 @@
+reg_helper = function(
+  moving_mask,
+  fixed_mask,
+  value = 1,
+  moving = NULL,
+  composeTransforms = NULL,
+  add_prefix = "_right_",
+  verbose = FALSE,
+  typeofTransform = "SyN",
+  mask_interpolator = "nearestNeighbor",
+  interpolator = "linear",
+  ...
+) {
+
+
+  # Which lobe
+  moving_mask = moving_mask == value
+  fixed_mask = fixed_mask == value
+
+  # Register lung mask
+  if (sum(moving_mask) > 0) {
+    reg = antsRegistration(
+      fixed = fixed_mask,
+      moving = moving_mask,
+      typeofTransform = typeofTransform,
+      verbose = verbose,
+      ...)
+
+    # If composeTransforms in non-null
+    if (!is.null(composeTransforms)){
+      output_prefix = paste0(composeTransforms, add_prefix)
+      fixed_mask = antsImageClone(fixed_mask, out_pixeltype = "double")
+      moving_mask = antsImageClone(moving_mask, out_pixeltype = "double")
+      composed = antsApplyTransforms(fixed = fixed_mask,
+                                    moving = moving_mask,
+                                    transformlist = reg$fwdtransforms,
+                                    compose = output_prefix)
+    } else {
+      composed = NULL
+    }
+
+    # If moving image is non-null
+    if (!is.null(moving)) {
+
+      # Get images in correct format (otherwise antsApplyTransforms will throw errors)
+      image = maskImage(moving, moving_mask)
+      image = antsImageClone(image, out_pixeltype = "float")
+      fixed_mask = antsImageClone(fixed_mask, out_pixeltype = "double")
+
+      # Apply transformation to moving image
+      transformed = antsApplyTransforms(
+        fixed = fixed_mask,
+        moving = image,
+        transformlist = reg$fwdtransforms,
+        interpolator = interpolator)
+
+      # Mask with warped mask and template mask, just to be sure
+      transformed = maskImage(transformed, reg$warpedmovout)
+      transformed = maskImage(transformed, fixed_mask)
+    } else {
+      transformed = NULL
+    }
+  } else {
+    return(NULL)
+  }
+  L = list(warped_mask = reg$warpedmovout,
+           warped_img = transformed,
+           fwdtransforms = reg$fwdtransforms,
+           composedtransform = composed)
+  return(L)
+}
+
+#' Lung Registration
+#'
+#' This function registers the right and left lung masks to a template mask. To register to the standard lung template mask, type \code{system.file("extdata", "lung_template_mask.nii.gz", package = "lungct").}
+#'
+#' @param moving_mask Mask of moving image. Right lung = 1, left lung = 2, non-lung = 0
+#' @param fixed_mask Mask of fixed image. Right lung = 1, left lung = 2, non-lung = 0
+#' @param moving Moving image to apply transformation
+#' @param sides Choose to register right and/or left lungs.
+#' @param verbose Print diagnostic messages
+#' @param typeofTransform Type of transform, passed to \code{\link{antsRegistration}}
+#' @param composeTransforms Prefix of output filename to save the composed forward transformations. The prefix will add comptx.nii.gz to the end.
+#' @param mask_interpolator Interpolator used to apply transformation to moving mask,
+#' passed to \code{\link{antsApplyTransforms}}
+#' @param interpolator Interpolator used to apply transformation to image,
+#' passed to \code{\link{antsApplyTransforms}}
+#' @param ... addition arguments to pass to \code{\link{antsRegistration}}
+#'
+#' @return A list of warped masks, images, and transformations for
+#' right and left lungs separately
+#' @importFrom ANTsRCore antsRegistration antsApplyTransforms
+#' @export
+register_lung_mask = function(
+  moving_mask,
+  fixed_mask,
+  moving = NULL,
+  sides = c("right", "left"),
+  verbose = FALSE,
+  typeofTransform = "SyN",
+  composeTransforms = NULL,
+  mask_interpolator = "nearestNeighbor",
+  interpolator = "linear",
+  ...
+) {
+
+  sides = match.arg(sides, several.ok = TRUE)
+  moving_mask = check_ants(moving_mask)
+  fixed_mask = check_ants(fixed_mask)
+  if (!is.null(moving)) {
+    moving = check_ants(moving)
+  }
+
+
+  args = list(
+    moving_mask = moving_mask,
+    fixed_mask = fixed_mask,
+    moving = moving,
+    verbose = verbose,
+    typeofTransform = typeofTransform,
+    composeTransforms = composeTransforms,
+    mask_interpolator = mask_interpolator,
+    interpolator = interpolator,
+    ...)
+
+
+  if ("right" %in% sides) {
+    # run right
+    args$add_prefix = "_right_"
+    args$value = 1
+    reg_right = do.call("reg_helper", args = args)
+  } else {
+    reg_right = NULL
+  }
+
+
+  if ("left" %in% sides) {
+    # run left
+    args$add_prefix = "_left_"
+    args$value = 2
+    reg_left = do.call("reg_helper", args = args)
+  } else {
+    reg_left = NULL
+  }
+
+
+  res = list()
+  res$right = reg_right
+  res$left = reg_left
+  return(res)
+}