def get_subvolume(self, bounds):
subvol_shape = bounds.stop - bounds.start
label_shape = subvol_shape - 2 * bounds.label_margin
parent_bounds = SubvolumeBounds(self.world_coord_to_parent(bounds.start),
self.world_coord_to_parent(bounds.stop),
label_margin=self.world_coord_to_parent(bounds.label_margin))
subvol = self.parent.get_subvolume(parent_bounds)
subvol.image = subvol.image.reshape(
[subvol_shape[0], self.scale[0],
subvol_shape[1], self.scale[1],
subvol_shape[2], self.scale[2]]).mean(5).mean(3).mean(1)
if subvol.label_mask is not None:
# Downsample body mask by considering blocks where the majority
# of voxels are in the body to be in the body. Alternatives are:
# - Conjunction (tends to introduce false splits)
# - Disjunction (tends to overdilate and merge)
# - Mode label (computationally expensive)
if CONFIG.volume.label_downsampling == 'conjunction':
subvol.label_mask = subvol.label_mask.reshape(
[label_shape[0], self.scale[0],
label_shape[1], self.scale[1],
label_shape[2], self.scale[2]]).all(5).all(3).all(1)
else:
subvol.label_mask = subvol.label_mask.reshape(
[label_shape[0], self.scale[0],
label_shape[1], self.scale[1],
label_shape[2], self.scale[2]]).mean(5).mean(3).mean(1) > 0.5
# Note that this is not a coordinate xform to parent in the typical
# sense, just a rescaling of the coordinate in the subvolume-local
# coordinates. Hence no similar call in VolumeView.get_subvolume.
subvol.seed = self.parent_coord_to_world(subvol.seed)
return subvol
评论列表
文章目录