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)
示例#2
0
    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)
示例#4
0
    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)