Skip to content
Snippets Groups Projects
Commit 8bf574fa authored by Paul McCarthy's avatar Paul McCarthy :mountain_bicyclist:
Browse files

Adjusted atlas mask query routines to be less inaccurate

parent 56fa033f
No related branches found
No related tags found
No related merge requests found
...@@ -698,33 +698,43 @@ class LabelAtlas(Atlas): ...@@ -698,33 +698,43 @@ class LabelAtlas(Atlas):
- A sequence of all labels which are present in the mask - A sequence of all labels which are present in the mask
- A sequence containing the proportion, within the mask, - A sequence containing the proportion, within the mask,
of each present label. of each present label. The proportions are returned as
values between 0 and 100.
""" """
# Make sure that the mask has the # Make sure that the mask has the same
# same number of voxels as the # number of voxels as the atlas image.
# atlas image # Use nearest neighbour interpolation
mask = mask.resample(self.shape[:3], order=1) # for resampling, as it is most likely
# that the mask is binary.
mask = mask.resample(self.shape[:3], dtype=np.float32, order=0)[0]
boolmask = mask > 0 boolmask = mask > 0
fslimage.Image(mask, xform=self.voxToWorldMat).save('blag.nii.gz')
# Extract the labels that are in # Extract the labels that are in
# the mask, and their corresponding # the mask, and their corresponding
# mask weights # mask weights
vals = self[boolmask] vals = self[boolmask]
weights = mask[boolmask] weights = mask[boolmask]
labels = np.unique(vals) weightsum = weights.sum()
props = [] labels = np.unique(vals)
props = []
for label in labels: for label in labels:
# Figure out the number of all voxels # Figure out the number of all voxels
# in the mask with this label, weighted # in the mask with this label, weighted
# by the mask # by the mask.
prop = ((vals == label) * weights).sum() prop = weights[vals == label].sum()
# Normalise it to be a proportion # Normalise it to be a proportion
# of all voxels in the mask # of all voxels in the mask. We
props.append(prop / float(len(vals))) # multiply by 100 because the FSL
# probabilistic atlases store their
# probabilities as percentages.
props.append(100 * prop / weightsum)
return labels, props return labels, props
...@@ -817,7 +827,8 @@ class ProbabilisticAtlas(Atlas): ...@@ -817,7 +827,8 @@ class ProbabilisticAtlas(Atlas):
- A sequence of all labels which are present in the mask - A sequence of all labels which are present in the mask
- A sequence containing the proportion, within the mask, - A sequence containing the proportion, within the mask,
of each present label. of each present label. The proportions are returned as
values between 0 and 100.
""" """
labels = [] labels = []
...@@ -825,18 +836,18 @@ class ProbabilisticAtlas(Atlas): ...@@ -825,18 +836,18 @@ class ProbabilisticAtlas(Atlas):
# Make sure that the mask has the same # Make sure that the mask has the same
# number of voxels as the atlas image # number of voxels as the atlas image
mask = mask.resample(self.shape[:3], dtype=np.float32, order=1)[0] mask = mask.resample(self.shape[:3], dtype=np.float32, order=0)[0]
boolmask = mask > 0 boolmask = mask > 0
weights = mask[boolmask]
weightsum = weights.sum()
for label in range(self.shape[3]): for label in range(self.shape[3]):
weights = mask[boolmask] vals = self[..., label]
vals = self[..., label] vals = vals[boolmask] * weights
vals = vals[boolmask] * weights prop = vals.sum() / weightsum
prop = vals.sum() / weights.sum()
if not np.isclose(prop, 0): if not np.isclose(prop, 0):
labels.append(label) labels.append(label)
props .append(prop) props .append(prop)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment