def __init__(self, volume_geometry, sinogram_geometry): super(FBP_Flexible, self).__init__(volume_geometry=volume_geometry, sinogram_geometry=sinogram_geometry) #convert parallel geomerty to cone with large source to object sino_geom_cone = sinogram_geometry.copy() sino_geom_cone.config.system.update_reference_frame() #reverse ray direction unit-vector direction and extend to inf cone_source = -sino_geom_cone.config.system.ray.direction * sino_geom_cone.config.panel.pixel_size[ 1] * sino_geom_cone.config.panel.num_pixels[1] * 1e6 detector_position = sino_geom_cone.config.system.detector.position detector_direction_x = sino_geom_cone.config.system.detector.direction_x if sinogram_geometry.dimension == '2D': tmp = AcquisitionGeometry.create_Cone2D(cone_source, detector_position, detector_direction_x) else: detector_direction_y = sino_geom_cone.config.system.detector.direction_y tmp = AcquisitionGeometry.create_Cone3D(cone_source, detector_position, detector_direction_x, detector_direction_y) sino_geom_cone.config.system = tmp.config.system.copy() self.vol_geom_astra, self.proj_geom_astra = convert_geometry_to_astra_vec( volume_geometry, sino_geom_cone)
def __init__(self, volume_geometry, sinogram_geometry): vol_geom_astra, proj_geom_astra = convert_geometry_to_astra_vec( volume_geometry, sinogram_geometry) super(FDK_Flexible, self).__init__(volume_geometry=volume_geometry, sinogram_geometry=sinogram_geometry, vol_geom_astra=vol_geom_astra, proj_geom_astra=proj_geom_astra)
def __init__(self, volume_geometry=None, sinogram_geometry=None, proj_geom=None, vol_geom=None): kwargs = { 'volume_geometry' : volume_geometry, 'sinogram_geometry' : sinogram_geometry, 'proj_geom' : proj_geom, 'vol_geom' : vol_geom} #DataProcessor.__init__(self, **kwargs) super(AstraBackProjectorVec, self).__init__(**kwargs) self.set_ImageGeometry(volume_geometry) self.set_AcquisitionGeometry(sinogram_geometry) self.vol_geom, self.proj_geom = convert_geometry_to_astra_vec(self.volume_geometry, self.sinogram_geometry)
def test_convert_geometry_to_astra_vec(self): #2D parallel radians astra_vol, astra_sino = convert_geometry_to_astra_vec(self.ig, self.ag) self.assertEqual(astra_sino['type'], 'parallel3d_vec') self.assertEqual(astra_sino['DetectorRowCount'], 1.0) self.assertEqual(astra_sino['DetectorColCount'], self.ag.pixel_num_h) vectors = np.zeros((3, 12), dtype='float64') vectors[0][1] = 1.0 vectors[0][6] = self.ag.pixel_size_h vectors[0][11] = self.ag.pixel_size_h vectors[1][0] = 1.0 vectors[1][7] = -self.ag.pixel_size_h vectors[1][11] = self.ag.pixel_size_h vectors[2][1] = -1.0 vectors[2][6] = -self.ag.pixel_size_h vectors[2][11] = self.ag.pixel_size_h np.testing.assert_allclose(astra_sino['Vectors'], vectors, atol=1e-6) self.assertEqual(astra_vol['GridColCount'], self.ig.voxel_num_x) self.assertEqual(astra_vol['GridRowCount'], self.ig.voxel_num_y) self.assertEqual(astra_vol['GridSliceCount'], 1) self.assertEqual(astra_vol['option']['WindowMinX'], -self.ig.voxel_num_x * self.ig.voxel_size_x * 0.5) self.assertEqual(astra_vol['option']['WindowMaxX'], self.ig.voxel_num_x * self.ig.voxel_size_x * 0.5) self.assertEqual(astra_vol['option']['WindowMinY'], -self.ig.voxel_num_y * self.ig.voxel_size_y * 0.5) self.assertEqual(astra_vol['option']['WindowMaxY'], self.ig.voxel_num_y * self.ig.voxel_size_y * 0.5) self.assertEqual(astra_vol['option']['WindowMinZ'], -self.ig.voxel_size_x * 0.5) self.assertEqual(astra_vol['option']['WindowMaxZ'], +self.ig.voxel_size_x * 0.5) #2D parallel degrees astra_vol, astra_sino = convert_geometry_to_astra_vec( self.ig, self.ag_deg) np.testing.assert_allclose(astra_sino['Vectors'], vectors, atol=1e-6) #2D cone astra_vol, astra_sino = convert_geometry_to_astra_vec( self.ig, self.ag_cone) self.assertEqual(astra_sino['type'], 'cone_vec') vectors = np.zeros((3, 12), dtype='float64') vectors[0][1] = -1 * self.ag_cone.dist_source_center vectors[0][4] = self.ag_cone.dist_center_detector vectors[0][6] = self.ag_cone.pixel_size_h vectors[0][11] = self.ag_cone.pixel_size_h vectors[1][0] = -1 * self.ag_cone.dist_source_center vectors[1][3] = self.ag_cone.dist_center_detector vectors[1][7] = -self.ag_cone.pixel_size_h vectors[1][11] = self.ag_cone.pixel_size_h vectors[2][1] = self.ag_cone.dist_source_center vectors[2][4] = -1 * self.ag_cone.dist_center_detector vectors[2][6] = -1 * self.ag_cone.pixel_size_h vectors[2][11] = self.ag_cone.pixel_size_h np.testing.assert_allclose(astra_sino['Vectors'], vectors, atol=1e-6) #3D cone astra_vol, astra_sino = convert_geometry_to_astra_vec( self.ig3, self.ag3_cone) self.assertEqual(astra_sino['type'], 'cone_vec') vectors = np.zeros((3, 12), dtype='float64') vectors[0][1] = -1 * self.ag_cone.dist_source_center vectors[0][4] = self.ag_cone.dist_center_detector vectors[0][6] = self.ag_cone.pixel_size_h vectors[0][11] = self.ag_cone.pixel_size_h vectors[1][0] = -1 * self.ag_cone.dist_source_center vectors[1][3] = self.ag_cone.dist_center_detector vectors[1][7] = -1 * self.ag_cone.pixel_size_h vectors[1][11] = self.ag_cone.pixel_size_h vectors[2][1] = self.ag_cone.dist_source_center vectors[2][4] = -1 * self.ag_cone.dist_center_detector vectors[2][6] = -1 * self.ag_cone.pixel_size_h vectors[2][11] = self.ag_cone.pixel_size_h np.testing.assert_allclose(astra_sino['Vectors'], vectors, atol=1e-6)