# Create space defined on a square from [0, 0] to [100, 100] with (100 x 100) # points space = odl.uniform_discr([0, 0], [100, 100], [100, 100]) # Create ODL operator for the Laplacian laplacian = odl.Laplacian(space) # Create right hand side phantom = odl.phantom.shepp_logan(space, modified=True) phantom.show('original image') rhs = laplacian(phantom) rhs += odl.phantom.white_noise(space) * np.std(rhs) * 0.1 rhs.show('rhs') # Convert laplacian to ProxImaL operator proximal_lang_laplacian = odl.as_proximal_lang_operator(laplacian) # Convert to array rhs_arr = rhs.asarray() # Set up optimization problem x = proximal.Variable(space.shape) funcs = [10 * proximal.sum_squares(proximal_lang_laplacian(x) - rhs_arr), proximal.norm1(proximal.grad(x))] # Solve the problem using ProxImaL prob = proximal.Problem(funcs) prob.solve(verbose=True) # Convert back to odl and display result result_odl = space.element(x.value)
max_pt=[20, 20], shape=[300, 300], dtype='float32') # Make a parallel beam geometry with flat detector # Angles: uniformly spaced, n = 360, min = 0, max = pi angle_partition = odl.uniform_partition(0, np.pi, 360) # Detector: uniformly sampled, n = 512, min = -30, max = 30 detector_partition = odl.uniform_partition(-30, 30, 512) geometry = odl.tomo.Parallel2dGeometry(angle_partition, detector_partition) # Initialize the ray transform (forward projection). ray_trafo = odl.tomo.RayTransform(reco_space, geometry) # Convert ray transform to proximal language operator proximal_lang_ray_trafo = odl.as_proximal_lang_operator(ray_trafo) # Create sinogram of forward projected phantom with noise phantom = odl.phantom.shepp_logan(reco_space, modified=True) phantom.show('phantom') data = ray_trafo(phantom) data += odl.phantom.white_noise(ray_trafo.range) * np.mean(data) * 0.1 data.show('noisy data') # Convert to array for ProxImaL rhs_arr = data.asarray() # Set up optimization problem # Note that proximal is not aware of the underlying space and only works with # matrices. Hence the norm in proximal does not match the norm in the ODL space # exactly.
# Create space defined on a square from [0, 0] to [100, 100] with (100 x 100) # points space = odl.uniform_discr([0, 0], [100, 100], [100, 100]) # Create ODL operator for the Laplacian laplacian = odl.Laplacian(space) # Create right hand side phantom = odl.phantom.shepp_logan(space, modified=True) phantom.show('original image') rhs = laplacian(phantom) rhs += odl.phantom.white_noise(space) * np.std(rhs) * 0.1 rhs.show('rhs') # Convert laplacian to ProxImaL operator proximal_lang_laplacian = odl.as_proximal_lang_operator(laplacian) # Convert to array rhs_arr = rhs.asarray() # Set up optimization problem x = proximal.Variable(space.shape) funcs = [ 10 * proximal.sum_squares(proximal_lang_laplacian(x) - rhs_arr), proximal.norm1(proximal.grad(x)) ] # Solve the problem using ProxImaL prob = proximal.Problem(funcs) prob.solve(verbose=True)
detector_partition = odl.uniform_partition(-30, 30, 558) geometry = odl.tomo.Parallel2dGeometry(angle_partition, detector_partition) # The implementation of the ray transform to use, options: # 'scikit' Requires scikit-image (can be installed by # running ``pip install scikit-image``). # 'astra_cpu', 'astra_cuda' Requires astra tomography to be installed. # Astra is much faster than scikit. Webpage: # https://github.com/astra-toolbox/astra-toolbox impl = 'astra_cuda' # Initialize the ray transform (forward projection). ray_trafo = odl.tomo.RayTransform(reco_space, geometry, impl=impl) # Convert ray transform to proximal language operator proximal_lang_ray_trafo = odl.as_proximal_lang_operator(ray_trafo) # Create sinogram of forward projected phantom with noise phantom = odl.phantom.shepp_logan(reco_space, modified=True) phantom.show('phantom') data = ray_trafo(phantom) data += odl.phantom.white_noise(ray_trafo.range) * np.mean(data) * 0.1 data.show('noisy data') # Convert to array for ProxImaL rhs_arr = data.asarray() # Set up optimization problem # Note that proximal is not aware of the underlying space and only works with # matrices. Hence the norm in proximal does not match the norm in the ODL space # exactly.