def generate_3d_phantom_data(model_number, L, H, n, m, geometry, from_volume_accuracy=256): N_size = from_volume_accuracy M_size = int(np.ceil(N_size / n * m)) assert M_size <= N_size phantom_3Dt = TomoP3D.ModelTemporal(model_number, N_size, '../resources/phantoms_3D.dat') timesteps = phantom_3Dt.shape[0] # make an upscaled xray transform (we need accurate sinograms) reco_space_copy = odl.uniform_discr(min_pt=[-L, -L, -H], max_pt=[L, L, H], shape=[N_size, N_size, M_size]) xray_transform = odl.tomo.RayTransform(reco_space_copy, geometry) p_lst = list() for t in range(timesteps): x = xray_transform.domain.element(phantom_3Dt[t, ..., :M_size]) p = xray_transform(x).data p_lst.append(p) # plot_3d(phantom_3Dt[t, ..., :M_size]) # plot_sino(p) return np.array(p_lst)
def get_ImageData(num_model, geometry): '''Returns an ImageData relative to geometry with the model num_model from tomophantom :param num_model: model number :type num_model: int :param geometry: geometrical info that describes the phantom :type geometry: ImageGeometry Example usage: .. code-block:: python ndim = 2 N=128 angles = np.linspace(0, 360, 50, True, dtype=np.float32) offset = 0.4 channels = 3 if ndim == 2: ag = AcquisitionGeometry.create_Cone2D((offset,-100), (offset,100)) ag.set_panel(N) else: ag = AcquisitionGeometry.create_Cone3D((offset,-100, 0), (offset,100,0)) ag.set_panel((N,N-2)) ag.set_channels(channels) ag.set_angles(angles, angle_unit=AcquisitionGeometry.DEGREE) ig = ag.get_ImageGeometry() num_model = 1 phantom = TomoPhantom.get_ImageData(num_model=num_model, geometry=ig) ''' ig = geometry.copy() ig.set_labels(DataOrder.TOMOPHANTOM_IG_LABELS) num_dims = len(ig.dimension_labels) if ImageGeometry.CHANNEL in ig.dimension_labels: if not is_model_temporal(num_model): raise ValueError('Selected model {} is not a temporal model, please change your selection'.format(num_model)) if num_dims == 4: # 3D+time for tomophantom # output dimensions channel and then spatial, # e.g. [ 'channel', 'vertical', 'horizontal_y', 'horizontal_x' ] num_model = num_model shape = tuple(ig.shape[1:]) phantom_arr = TomoP3D.ModelTemporal(num_model, shape, path_library3D) elif num_dims == 3: # 2D+time for tomophantom # output dimensions channel and then spatial, # e.g. [ 'channel', 'horizontal_y', 'horizontal_x' ] N = ig.shape[1] num_model = num_model phantom_arr = TomoP2D.ModelTemporal(num_model, ig.shape[1], path_library2D) else: raise ValueError('Wrong ImageGeometry') if ig.channels != phantom_arr.shape[0]: raise ValueError('The required model {} has {} channels. The ImageGeometry you passed has {}. Please update your ImageGeometry.'\ .format(num_model, ig.channels, phantom_arr.shape[0])) else: if num_dims == 3: # 3D num_model = num_model phantom_arr = TomoP3D.Model(num_model, ig.shape, path_library3D) elif num_dims == 2: # 2D if ig.shape[0] != ig.shape[1]: raise ValueError('Can only handle square ImageData, got shape'.format(ig.shape)) N = ig.shape[0] num_model = num_model phantom_arr = TomoP2D.Model(num_model, N, path_library2D) else: raise ValueError('Wrong ImageGeometry') im_data = ImageData(phantom_arr, geometry=ig, suppress_warning=True) im_data.reorder(list(geometry.dimension_labels)) return im_data
import matplotlib.pyplot as plt import numpy as np import tomophantom from tomophantom import TomoP3D print("Building 4D phantom using TomoPhantom software") tic = timeit.default_timer() model = 100 # note that the selected model is temporal (3D + time) # Define phantom dimensions using a scalar (cubic) or a tuple [N1, N2, N3] N_size = 256 # or as a tuple of a custom size (256,256,256) # one can specify an exact path to the parameters file # path_library2D = '../../../PhantomLibrary/models/Phantom3DLibrary.dat' path = os.path.dirname(tomophantom.__file__) path_library3D = os.path.join(path, "Phantom3DLibrary.dat") #This will generate a Time x N_size x N_size x N_size phantom (4D) phantom_tm = TomoP3D.ModelTemporal(model, N_size, path_library3D) toc = timeit.default_timer() Run_time = toc - tic print("Phantom has been built in {} seconds".format(Run_time)) for i in range(0, np.size(phantom_tm, 0)): sliceSel = int(0.5 * N_size) #plt.gray() plt.figure(1) plt.subplot(131) plt.imshow(phantom_tm[i, sliceSel, :, :], vmin=0, vmax=1) plt.title('3D Phantom, axial view') plt.subplot(132) plt.imshow(phantom_tm[i, :, sliceSel, :], vmin=0, vmax=1) plt.title('3D Phantom, coronal view')