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

Switch to unified view

a b/R/segment_lung.R
1
#' @title Segment Lungs from CT scans
2
#' @description Segment Lungs from a non-contrast CT scan
3
#'
4
#' @param img Filename or \code{antsImage}
5
#' @param mask Should the image be masked
6
#' @param lthresh lower threshold for the image
7
#' @param verbose Print diagnostic messages
8
#' @param remove_background should background be removed first?
9
#'
10
#' @return List of image, lung, lung mask
11
#' @export
12
#' @importFrom extrantsr check_ants filler
13
#' @importFrom neurobase zero_pad maskEmptyImageDimensions mask_img
14
#' @importFrom oro.nifti voxdim
15
#' @importFrom stats median
16
#' @importFrom ANTsRCore resampleImage iMath smoothImage as.antsImage
17
#' @importFrom ANTsRCore antsImageClone
18
segment_lung = function(
19
  img,
20
  remove_background = FALSE,
21
  mask = TRUE,
22
  lthresh = -300,
23
  verbose = TRUE
24
25
) {
26
27
  if (verbose) {
28
    message("# Checking Inputs")
29
  }
30
  reg_img = check_ants(img)
31
  if (remove_background) {
32
    background = iMath(img = reg_img <= -1024,
33
                       operation = "GetLargestComponent")
34
    reg_img[background == 1] = -Inf
35
  }
36
  img = antsImageClone(reg_img)
37
  vres = voxdim(reg_img)
38
  if (verbose) {
39
    message("# Resampling Image to 1x1x1")
40
  }
41
42
  reg_img = resampleImage(reg_img, c(1,1,1))
43
44
  adder = 1025
45
  res = segment_human(
46
    img = reg_img,
47
    adder = adder,
48
    lthresh = -300,
49
    verbose = TRUE
50
  )
51
  ebody = coarse_body(res$body)
52
  ss = res$smoothed
53
  ss = mask_img(ss, ebody)
54
55
  # inds = getEmptyImageDimensions(body)
56
  # ss = maskEmptyImageDimensions(
57
  #   img = ss,
58
  #   inds = inds,
59
  #   mask.value = 0)
60
61
  # if (verbose) {
62
  #   message("# smoothing image")
63
  # }
64
  # ss = smoothImage(inimg = ss, sigma = 10,
65
  #                  max_kernel_width = 200)
66
  # # smoothed image is greater than some thresh
67
  # if (mask) {
68
  #   vals = as.numeric(ss)
69
  # } else {
70
  #   vals = as.numeric(ss)
71
  #   vals = vals[ as.numeric(body) > 0]
72
  # }
73
  # med = median(vals)
74
  # body = ss > med
75
  #
76
  # # body = ss > (-100 + adder)
77
  # if (verbose) {
78
  #   message("# Getting Humans")
79
  # }
80
  #
81
  # # zero padding in case for any connectedness
82
  # zp = as.array(body)
83
  # kdim = c(1,1,1)
84
  # zp = zero_pad(zp, kdim = kdim)
85
  # zp = as.antsImage(zp, reference = body)
86
  # # getting connected component
87
  # cc = iMath(img = zp, operation = "GetLargestComponent")
88
  # rm(list = "zp"); gc(); gc()
89
  # cc = as.array(cc)
90
  # cc = zero_pad(cc, kdim = kdim, invert = TRUE)
91
  # cc = as.antsImage(cc, reference = body)
92
  #
93
  # if (verbose) {
94
  #   message("# Filling Holes")
95
  # }
96
  # # cc = iMath(img = cc, operation = "FillHoles")
97
  # cc = filler(cc, fill_size = 60)
98
  # # cc = filler(cc, fill_size = 40)
99
  # cc = filler(cc, fill_size = 5, dilate = FALSE)
100
  #
101
  # # Dropping non-human stuff
102
  # inds = getEmptyImageDimensions(cc)
103
  #
104
  # if (verbose) {
105
  #   message("# Making New image")
106
  # }
107
  #
108
  # # Don't want to drop the indices,
109
  # # just blank them out
110
  # newimg = maskEmptyImageDimensions(img = reg_img, inds = inds)
111
  if (verbose) {
112
    message("# Getting Lungs: Thresholding")
113
  }
114
  newimg = ss
115
  cc = ebody
116
117
  lung = newimg < (lthresh + adder) & newimg > 0 & cc == 1
118
  if (verbose) {
119
    message("# Getting Lungs: Largest Component")
120
  }
121
  lung = iMath(img = lung, operation = "GetLargestComponent")
122
  # lung = iMath(img = lung, operation = "FillHoles")
123
  if (verbose) {
124
    message("# Getting Lungs: Filling Holes")
125
  }
126
  lung = filler(lung, fill_size = 2)
127
  if (verbose) {
128
    message("# Resampling Back to Original Image Size")
129
  }
130
  lung_mask = resampleImage(lung,
131
                            resampleParams = dim(img),
132
                            useVoxels = TRUE,
133
                            interpType = 1)
134
  # lung_mask = resampleImageToTarget(
135
  #   lung, target = img,
136
  #   interpType = "nearestNeighbor",
137
  #   verbose = verbose)
138
  lung = mask_img(img, lung_mask)
139
140
  # reg_img = reg_img - adder
141
  L = list(img = img,
142
           lung_mask = lung_mask,
143
           lung = lung
144
  )
145
  return(L)
146
}
147