Source code for allensdk.internal.mouse_connectivity.projection_thumbnail.volume_projector
import logging
import SimpleITK as sitk
from six.moves import xrange
import numpy as np
from . import volume_utilities as vol
[docs]class VolumeProjector(object):
def __init__(self, view_volume):
logging.info('initializing volume projector')
self.view_volume = view_volume
[docs] def rotate(self, from_axis, to_axis, angle):
logging.info('rotating from axis {0} to axis {1} '
'by {2:2.2f} radians'.format(from_axis, to_axis, angle))
transform = self.build_rotation_transform(from_axis, to_axis, angle)
rotated = sitk.Resample(self.view_volume, transform, sitk.sitkLinear,
0.0, self.view_volume.GetPixelID())
return rotated
[docs] def rotate_and_extract(self, from_axes, to_axes, angles, cb):
for fax, tax, angle in zip(from_axes, to_axes, angles):
rotated = self.rotate(fax, tax, angle)
yield self.extract(cb, rotated)
[docs] @classmethod
def fixed_factory(cls, volume, size):
view_volume = sitk.Image(int(size[0]), int(size[1]), int(size[2]), volume.GetPixelID())
view_volume = vol.sitk_paste_into_center(volume, view_volume)
return cls(view_volume)
[docs] @classmethod
def safe_factory(cls, volume):
max_extent = vol.sitk_get_diagonal_length(volume)
max_extent = [np.ceil(max_extent).astype(int)] * 3
vpar = vol.sitk_get_size_parity(volume)
lpar = np.mod(max_extent, 2)
for ax in xrange(volume.GetDimension()):
if vpar[ax] != lpar[ax]:
max_extent[ax] += 1
return cls.fixed_factory(volume, max_extent)