diff options
Diffstat (limited to 'src/silx/opencl/test/test_backprojection.py')
-rw-r--r-- | src/silx/opencl/test/test_backprojection.py | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/src/silx/opencl/test/test_backprojection.py b/src/silx/opencl/test/test_backprojection.py index 501cf2f..b08c972 100644 --- a/src/silx/opencl/test/test_backprojection.py +++ b/src/silx/opencl/test/test_backprojection.py @@ -35,11 +35,13 @@ import logging import numpy as np import unittest from math import pi + try: import mako except ImportError: mako = None from ..common import ocl + if ocl: from .. import backprojection from ...image.tomography import compute_fourier_filter @@ -56,7 +58,7 @@ def generate_coords(img_shp, center=None): l_r, l_c = float(img_shp[0]), float(img_shp[1]) R, C = np.mgrid[:l_r, :l_c] if center is None: - center0, center1 = l_r / 2., l_c / 2. + center0, center1 = l_r / 2.0, l_c / 2.0 else: center0, center1 = center R = R + 0.5 - center0 @@ -72,7 +74,7 @@ def clip_circle(img, center=None, radius=None): M = R * R + C * C res = np.zeros_like(img) if radius is None: - radius = img.shape[0] / 2. - 1 + radius = img.shape[0] / 2.0 - 1 mask = M < radius * radius res[mask] = img[mask] return res @@ -80,20 +82,21 @@ def clip_circle(img, center=None, radius=None): @unittest.skipUnless(ocl and mako, "PyOpenCl is missing") class TestFBP(unittest.TestCase): - def setUp(self): if ocl is None: return self.getfiles() self.fbp = backprojection.Backprojection(self.sino.shape, profile=True) if self.fbp.compiletime_workgroup_size < 16 * 16: - self.skipTest("Current implementation of OpenCL backprojection is " - "not supported on this platform yet") + self.skipTest( + "Current implementation of OpenCL backprojection is " + "not supported on this platform yet" + ) # Astra does not use the same backprojector implementation. # Therefore, we cannot expect results to be the "same" (up to float32 # numerical error) self.tol = 5e-2 - if not(self.fbp._use_textures) or self.fbp.device.type == "CPU": + if not (self.fbp._use_textures) or self.fbp.device.type == "CPU": # Precision is less when using CPU # (either CPU textures or "manual" linear interpolation) self.tol *= 2 @@ -130,8 +133,12 @@ class TestFBP(unittest.TestCase): ref_clipped = clip_circle(self.reference_rec) delta = abs(res_clipped - ref_clipped) bad = delta > 1 - logger.debug("Absolute difference: %s with %s outlier pixels out of %s" - "", delta.max(), bad.sum(), np.prod(bad.shape)) + logger.debug( + "Absolute difference: %s with %s outlier pixels out of %s" "", + delta.max(), + bad.sum(), + np.prod(bad.shape), + ) return delta.max() @unittest.skipUnless(ocl and mako, "pyopencl is missing") @@ -157,17 +164,14 @@ class TestFBP(unittest.TestCase): for i in range(10): res = self.fbp.filtered_backprojection(self.sino) errmax = np.max(np.abs(res - res0)) - self.assertTrue(errmax < 1.e-6, "Max error is too high") + self.assertTrue(errmax < 1.0e-6, "Max error is too high") @unittest.skipUnless(ocl and mako, "pyopencl is missing") def test_fbp_filters(self): """ Test the different available filters of silx FBP. """ - avail_filters = [ - "ramlak", "shepp-logan", "cosine", "hamming", - "hann" - ] + avail_filters = ["ramlak", "shepp-logan", "cosine", "hamming", "hann"] # Create a Dirac delta function at a single angle view. # As the filters are radially invarant: # - backprojection yields an image where each line is a Dirac. @@ -176,7 +180,7 @@ class TestFBP(unittest.TestCase): # test will also ensure that backprojection behaves well. dirac = np.zeros_like(self.sino) na, dw = dirac.shape - dirac[0, dw//2] = na / pi * 2 + dirac[0, dw // 2] = na / pi * 2 for filter_name in avail_filters: B = backprojection.Backprojection(dirac.shape, filter_name=filter_name) @@ -184,17 +188,15 @@ class TestFBP(unittest.TestCase): # Check that radial invariance is kept std0 = np.max(np.abs(np.std(r, axis=0))) self.assertTrue( - std0 < 5.e-6, - "Something wrong with FBP(filter=%s)" % filter_name + std0 < 5.0e-6, "Something wrong with FBP(filter=%s)" % filter_name ) # Check that the filter is retrieved - r_f = np.fft.fft(np.fft.fftshift(r[0])).real / 2. # filter factor + r_f = np.fft.fft(np.fft.fftshift(r[0])).real / 2.0 # filter factor ref_filter_f = compute_fourier_filter(dw, filter_name) errmax = np.max(np.abs(r_f - ref_filter_f)) logger.info("FBP filter %s: max error=%e" % (filter_name, errmax)) self.assertTrue( - errmax < 1.e-3, - "Something wrong with FBP(filter=%s)" % filter_name + errmax < 1.0e-3, "Something wrong with FBP(filter=%s)" % filter_name ) @unittest.skipUnless(ocl and mako, "pyopencl is missing") @@ -202,13 +204,14 @@ class TestFBP(unittest.TestCase): # Generate a 513-sinogram. # The padded width will be nextpow(513*2). # silx [0.10, 0.10.1] will give 1029, which makes R2C transform fail. - sino = np.pad(self.sino, ((0, 0), (1, 0)), mode='edge') - B = backprojection.Backprojection(sino.shape, axis_position=self.fbp.axis_pos+1) + sino = np.pad(self.sino, ((0, 0), (1, 0)), mode="edge") + B = backprojection.Backprojection( + sino.shape, axis_position=self.fbp.axis_pos + 1 + ) res = B(sino) # Compare with self.reference_rec. Tolerance is high as backprojector # is not fully shift-invariant. errmax = np.max(np.abs(clip_circle(res[1:, 1:] - self.reference_rec))) self.assertLess( - errmax, 1.e-1, - "Something wrong with FBP on odd-sized sinogram" + errmax, 1.0e-1, "Something wrong with FBP on odd-sized sinogram" ) |