예제 #1
0
    def __init__(self, geometry):
        """
        Parameters
        ----------
        geometry : GeometryCone3D
           The geometry used for reconstruction
        """

        self.geometry = geometry

        self.cosine_weight = tf.get_variable(
            name='cosine_weight',
            dtype=tf.float32,
            initializer=ct_weights.cosine_weights_3d(geometry),
            trainable=True)

        self.recon_filter = tf.get_variable(
            name='recon_filter',
            dtype=tf.float32,
            initializer=filters.ram_lak_3D(geometry),
            trainable=True)

        self.relu_alpha = tf.get_variable(
            name='relu_alpha',
            shape=(1),
            dtype=tf.float32,
            initializer=tf.constant_initializer(0),
            trainable=True)
    def __init__(self, geometry):
        """
       Parameters
       ----------
       geometry : GeometryCone3D
           The geometry used for reconstruction
       """

        self.geometry = geometry

        self.initializer = tf.contrib.layers.xavier_initializer()

        self.cosine_weight = tf.get_variable(name='cosine_weight', dtype=tf.float32,
                                             initializer=ct_weights.cosine_weights_3d(geometry),
                                             trainable=True)

        self.recon_filter = tf.get_variable(name='recon_filter', dtype=tf.float32,
                                           initializer=filters.ram_lak_3D(geometry),
                                           trainable=True)

        self.relu_alpha = tf.get_variable(name='relu_alpha', shape=(1), dtype=tf.float32,
                                          initializer=tf.constant_initializer(0),
                                          trainable=True)

        # for multi perceptron if needed
        self.mlp_all = tf.get_variable(name='mlp_all', dtype=tf.float32, initializer=tf.ones(1), trainable=False)
        self.mlp_one = tf.get_variable(name='mlp_one', dtype=tf.float32, initializer=tf.ones(1), trainable=False)
        self.mlp_two = tf.get_variable(name='mlp_two', dtype=tf.float32, initializer=tf.ones(1), trainable=False)
예제 #3
0
def example_cone_3d():
    # ------------------ Declare Parameters ------------------

    # Volume Parameters:
    volume_size = 256
    volume_shape = [volume_size, volume_size, volume_size]
    volume_spacing = [0.5, 0.5, 0.5]

    # Detector Parameters:
    detector_shape = [2*volume_size, 2*volume_size]
    detector_spacing = [1, 1]

    # Trajectory Parameters:
    number_of_projections = 360
    angular_range = 2 * np.pi

    source_detector_distance = 1200
    source_isocenter_distance = 750

    # create Geometry class
    geometry = GeometryCone3D(volume_shape, volume_spacing, detector_shape, detector_spacing, number_of_projections, angular_range, source_detector_distance, source_isocenter_distance)
    geometry.set_trajectory(circular_trajectory.circular_trajectory_3d(geometry))

    # Get Phantom 3d
    phantom = shepp_logan.shepp_logan_3d(volume_shape)
    # Add required batch dimension
    phantom = np.expand_dims(phantom, axis=0)

    # ------------------ Call Layers ------------------
    # The following code is the new TF2.0 experimental way to tell
    # Tensorflow only to allocate GPU memory needed rather then allocate every GPU memory available.
    # This is important for the use of the hardware interpolation projector, otherwise there might be not enough memory left
    # to allocate the texture memory on the GPU

    gpus = tf.config.experimental.list_physical_devices('GPU')
    if gpus:
        try:
            for gpu in gpus:
                tf.config.experimental.set_memory_growth(gpu, True)
        except RunetimeError as e:
            print(e)

    sinogram = cone_projection3d(phantom, geometry)

    reco_filter = ram_lak_3D(geometry)
    sino_freq = tf.signal.fft(tf.cast(sinogram,dtype=tf.complex64))
    sino_filtered_freq = tf.multiply(sino_freq,tf.cast(reco_filter,dtype=tf.complex64))
    sinogram_filtered = tf.math.real(tf.signal.ifft(sino_filtered_freq))

    reco = cone_backprojection3d(sinogram_filtered, geometry)

    plt.figure()
    plt.imshow(np.squeeze(reco)[volume_shape[0]//2], cmap=plt.get_cmap('gist_gray'))
    plt.axis('off')
    plt.savefig('3d_cone_reco.png', dpi=150, transparent=False, bbox_inches='tight')
예제 #4
0
def example_cone_3d():
    # ------------------ Declare Parameters ------------------

    # Volume Parameters:
    volume_size = 256
    volume_shape = [volume_size, volume_size, volume_size]
    volume_spacing = [0.5, 0.5, 0.5]

    # Detector Parameters:
    detector_shape = [2 * volume_size, 2 * volume_size]
    detector_spacing = [1, 1]

    # Trajectory Parameters:
    number_of_projections = 360
    angular_range = 2 * np.pi

    source_detector_distance = 1200
    source_isocenter_distance = 750

    # create Geometry class
    geometry = GeometryCone3D(volume_shape, volume_spacing, detector_shape,
                              detector_spacing, number_of_projections,
                              angular_range, source_detector_distance,
                              source_isocenter_distance)
    geometry.set_projection_matrices(
        circular_trajectory.circular_trajectory_3d(geometry))

    # Get Phantom 3d
    phantom = shepp_logan.shepp_logan_3d(volume_shape)
    phantom = np.expand_dims(phantom, axis=0)

    config = tf.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 0.5
    config.gpu_options.allow_growth = True
    # ------------------ Call Layers ------------------
    with tf.Session(config=config) as sess:
        result = cone_projection3d(phantom, geometry)
        sinogram = result.eval()

        filter = ram_lak_3D(geometry)
        sino_freq = np.fft.fft(sinogram, axis=-1)
        filtered_sino_freq = sino_freq * filter
        filtered_sino = np.fft.ifft(filtered_sino_freq, axis=-1)

        result_back_proj = cone_backprojection3d(filtered_sino, geometry)
        reco = result_back_proj.eval()
        plt.figure()
        plt.imshow(np.squeeze(reco)[volume_shape[0] // 2],
                   cmap=plt.get_cmap('gist_gray'))
        plt.axis('off')
        plt.savefig('3d_cone_reco.png',
                    dpi=150,
                    transparent=False,
                    bbox_inches='tight')
예제 #5
0
def example_parallel_3d():
    # ------------------ Declare Parameters ------------------

    # Volume Parameters:
    volume_size = 256
    volume_shape = [volume_size, volume_size, volume_size]
    volume_spacing = [1, 1, 1]

    # Detector Parameters:
    detector_size = 350
    detector_shape = [detector_size, detector_size]
    detector_spacing = [1, 1]

    # Trajectory Parameters:
    number_of_projections = 180
    angular_range = 1 * np.pi

    # create Geometry class
    geometry = GeometryParallel3D(volume_shape, volume_spacing, detector_shape,
                                  detector_spacing, number_of_projections,
                                  angular_range)
    geometry.set_trajectory(circular_trajectory_3d(geometry))

    # Get Phantom
    phantom = shepp_logan.shepp_logan_3d(volume_shape)

    # ------------------ Call Layers ------------------
    with tf.Session() as sess:
        #result = parallel_projection3d(phantom, geometry)

        result = par_projection3d(phantom, geometry)

        sinogram = result.eval()

        sinogram = sinogram + np.random.normal(loc=np.mean(np.abs(sinogram)),
                                               scale=np.std(sinogram),
                                               size=sinogram.shape) * 0.02

        reco_filter = filters.ram_lak_3D(geometry)

        sino_freq = np.fft.fft(sinogram, axis=2)
        sino_filtered_freq = np.multiply(sino_freq, reco_filter)
        sinogram_filtered = np.fft.ifft(sino_filtered_freq, axis=2)

        result_back_proj = par_backprojection3d(sinogram_filtered, geometry)
        reco = result_back_proj.eval()
        import pyconrad as pyc
        pyc.setup_pyconrad()
        pyc.imshow(phantom)
        pyc.imshow(sinogram)
        pyc.imshow(reco)
        a = 5
예제 #6
0
    def __init__(self, geometry):
        self.geometry = geometry

        self.cosine_weight = tf.get_variable(
            name='cosine_weight',
            dtype=tf.float32,
            initializer=ct_weights.cosine_weights_3d(self.geometry),
            trainable=False)

        self.redundancy_weight = tf.get_variable(
            name='redundancy_weight',
            dtype=tf.float32,
            initializer=ct_weights.parker_weights_3d(self.geometry),
            trainable=False)

        self.filter = tf.get_variable(name='reco_filter',
                                      dtype=tf.float32,
                                      initializer=ram_lak_3D(self.geometry),
                                      trainable=False)
    def __init__(self, geometry):
        """
        Parameters
        ----------
        geometry : GeometryCone3D
            The geometry used for reconstruction
        """

        self.geometry = geometry

        self.cosine_weight = tf.get_variable(
            name='cosine_weight',
            dtype=tf.float32,
            initializer=ct_weights.cosine_weights_3d(self.geometry),
            trainable=False)

        self.filter = tf.get_variable(name='reco_filter',
                                      dtype=tf.float32,
                                      initializer=ram_lak_3D(self.geometry),
                                      trainable=False)