Exemplo n.º 1
0
def main():
    args = parse_args()
    syris.init()
    n = 1024
    d = args.propagation_distance * q.m
    shape = (n, n)
    ps = 1 * q.um
    energy = 20 * q.keV
    tr = Trajectory([(n / 2, n / 2, 0)] * ps, pixel_size=ps)
    sample = make_sphere(n,
                         n / 30 * ps,
                         pixel_size=ps,
                         material=get_material('air_5_30_kev.mat'))

    bm = make_topotomo(pixel_size=ps, trajectory=tr)
    print 'Source size FWHM (height x width): {}'.format(bm.size.rescale(q.um))

    u = bm.transfer(shape, ps, energy, t=0 * q.s)
    u = sample.transfer(shape, ps, energy)
    intensity = propagate([sample], shape, [energy], d, ps).get()
    incoh = bm.apply_blur(intensity, d, ps).get()

    region = (n / 4, n / 4, n / 2, n / 2)
    intensity = ip.crop(intensity, region).get()
    incoh = ip.crop(incoh, region).get()

    show(intensity, title='Coherent')
    show(incoh, title='Applied source blur')
    plt.show()
Exemplo n.º 2
0
def main():
    args = parse_args()
    syris.init(device_index=0)
    m = 20

    if args.input == 'grid':
        image = make_grid(args.n, m * q.m).thickness.get()
    elif args.input == 'lena':
        from scipy.misc import lena
        image = lena().astype(cfg.PRECISION.np_float)
        if args.n != image.shape[0]:
            image = gutil.get_host(ip.rescale(image, (args.n, args.n)))

    n = image.shape[0]
    crop_n = n - 2 * m - 2
    y, x = np.mgrid[-n / 2:n / 2, -n / 2:n / 2]
    # Compute a such that the disk diameter is exactly the period when distance from the middle is n
    # / 2
    a = m / (2 * (crop_n / 2.)**2)
    radii = (a * np.sqrt(x**2 + y**2)**2 + 1e-3).astype(cfg.PRECISION.np_float)
    x_param = radii
    y_param = radii

    result = ip.varconvolve_disk(image, (y_param, x_param)).get()
    result = ip.crop(result, (m - 1, m - 1, crop_n, crop_n)).get()
    radii = ip.crop(radii, (m - 1, m - 1, crop_n, crop_n)).get()
    image = ip.crop(image, (m - 1, m - 1, crop_n, crop_n)).get()

    if args.output:
        save_image(args.output, result)

    show(image, title='Original Image')
    show(2 * radii, title='Blurring Disk Diameters')
    show(result, title='Blurred Image')
    plt.show()
Exemplo n.º 3
0
def main():
    args = parse_args()
    syris.init()
    n = 1024
    d = args.propagation_distance * q.m
    shape = (n, n)
    ps = 1 * q.um
    energy = 20 * q.keV
    tr = Trajectory([(n / 2, n / 2, 0)] * ps, pixel_size=ps)
    sample = make_sphere(n, n / 30 * ps, pixel_size=ps, material=get_material('air_5_30_kev.mat'))

    bm = make_topotomo(pixel_size=ps, trajectory=tr)
    print 'Source size FWHM (height x width): {}'.format(bm.size.rescale(q.um))

    u = bm.transfer(shape, ps, energy, t=0 * q.s)
    u = sample.transfer(shape, ps, energy)
    intensity = propagate([sample], shape, [energy], d, ps).get()
    incoh = bm.apply_blur(intensity, d, ps).get()

    region = (n / 4, n / 4, n / 2, n / 2)
    intensity = ip.crop(intensity, region).get()
    incoh = ip.crop(incoh, region).get()

    show(intensity, title='Coherent')
    show(incoh, title='Applied source blur')
    plt.show()
Exemplo n.º 4
0
def main():
    args = parse_args()
    syris.init(device_index=0)
    m = 20

    if args.input == 'grid':
        image = make_grid(args.n, m * q.m).thickness.get()
    elif args.input == 'lena':
        from scipy.misc import lena
        image = lena().astype(cfg.PRECISION.np_float)
        if args.n != image.shape[0]:
            image = gutil.get_host(ip.rescale(image, (args.n, args.n)))

    n = image.shape[0]
    crop_n = n - 2 * m - 2
    y, x = np.mgrid[-n / 2:n / 2, -n / 2:n / 2]
    # Compute a such that the disk diameter is exactly the period when distance from the middle is n
    # / 2
    a = m / (2 * (crop_n / 2.) ** 2)
    radii = (a * np.sqrt(x ** 2 + y ** 2) ** 2 + 1e-3).astype(cfg.PRECISION.np_float)
    x_param = radii
    y_param = radii

    result = ip.varconvolve_disk(image, (y_param, x_param)).get()
    result = ip.crop(result, (m - 1, m - 1, crop_n, crop_n)).get()
    radii = ip.crop(radii, (m - 1, m - 1, crop_n, crop_n)).get()
    image = ip.crop(image, (m - 1, m - 1, crop_n, crop_n)).get()

    if args.output:
        save_image(args.output, result)

    show(image, title='Original Image')
    show(2 * radii, title='Blurring Disk Diameters')
    show(result, title='Blurred Image')
    plt.show()
Exemplo n.º 5
0
def test_simple():
    syris.init(device_index=0)
    n = 8
    ps = 1 * q.um
    thickness = np.arange(n**2).reshape(n, n).astype(
        cfg.PRECISION.np_float) * q.m
    go = StaticBody(thickness, ps)

    # Same
    projection = go.project((n, n), ps).get()
    np.testing.assert_almost_equal(thickness.magnitude, projection)

    # Cropped upsampled
    shape = (n, n)
    gt = rescale(thickness.magnitude, shape).get()
    projection = go.project(shape, ps / 2).get()
    gt = rescale(crop(thickness.magnitude, (0, 0, n / 2, n / 2)), shape).get()
    np.testing.assert_almost_equal(gt, projection)

    # Cropped downsampled
    shape = (n / 4, n / 4)
    gt = rescale(thickness.magnitude, shape).get()
    projection = go.project(shape, 2 * ps).get()
    gt = rescale(crop(thickness.magnitude, (0, 0, n / 2, n / 2)), shape).get()
    np.testing.assert_almost_equal(gt, projection)

    # Padded upsampled
    shape = (4 * n, 4 * n)
    projection = go.project(shape, ps / 2, offset=(-n / 2, -n / 2) * ps).get()
    gt = rescale(pad(thickness.magnitude, (n / 2, n / 2, 2 * n, 2 * n)),
                 shape).get()
    np.testing.assert_almost_equal(gt, projection)

    # Padded downsampled
    shape = (n, n)
    projection = go.project(shape, 2 * ps, offset=(-n / 2, -n / 2) * ps).get()
    gt = rescale(pad(thickness.magnitude, (4, 4, 2 * n, 2 * n)), shape).get()
    np.testing.assert_almost_equal(gt, projection)

    # Crop and pad and upsample
    def crop_pad_rescale(ss):
        shape = (n, n)
        target_ps = ps / ss
        fov = shape * ps
        offset = (2, -2) * q.um
        shape = (int(n / 2 * ss), int(ss * 3 * n / 2))
        projection = go.project(shape, target_ps, offset=offset).get()
        gt = rescale(
            pad(thickness[n / 4:3 * n / 4, :], (0, n / 4, n / 2, 3 * n / 2)),
            shape).get()
        np.testing.assert_almost_equal(gt, projection)

    crop_pad_rescale(2)
    crop_pad_rescale(0.5)
Exemplo n.º 6
0
    def test_crop(self):
        shape = 8, 4
        image = np.arange(shape[0] * shape[1]).reshape(shape).astype(cfg.PRECISION.np_float)
        x_0 = 1
        y_0 = 2
        width = 3
        height = 4
        res = ip.crop(image, (y_0, x_0, height, width)).get()

        np.testing.assert_equal(image[y_0 : y_0 + height, x_0 : x_0 + width], res)

        # Identity
        np.testing.assert_equal(image, ip.crop(image, (0, 0, shape[0], shape[1])).get())
Exemplo n.º 7
0
    def test_crop(self):
        shape = 8, 4
        image = np.arange(shape[0] * shape[1]).reshape(shape).astype(cfg.PRECISION.np_float)
        x_0 = 1
        y_0 = 2
        width = 3
        height = 4
        res = ip.crop(image, (y_0, x_0, height, width)).get()

        np.testing.assert_equal(image[y_0:y_0 + height, x_0:x_0 + width], res)

        # Identity
        np.testing.assert_equal(image, ip.crop(image, (0, 0, shape[0], shape[1])).get())
Exemplo n.º 8
0
    def _project(self, shape, pixel_size, offset, t=None, queue=None, out=None, block=False):
        """Project thickness."""
        orig_shape = self.thickness.shape
        orig_region = (0, 0) + orig_shape
        end = ((offset + shape * pixel_size) / self.pixel_size).simplified.magnitude
        end = np.round(end).astype(np.int)
        start = np.round((offset / self.pixel_size).simplified.magnitude).astype(np.int)
        # numpy integers are not understood by pyopencl's rectangle copy
        end = [int(num) for num in end]
        start = [int(num) for num in start]

        cy, cx = (max(0, start[0]), max(0, start[1]))
        crop_region = (cy, cx,
                       min(end[0], orig_shape[0]) - cy,
                       min(end[1], orig_shape[1]) - cx)

        py, px = (abs(min(0, start[0])), abs(min(0, start[1])))
        pad_region = (py, px, end[0] - start[0], end[1] - start[1])

        proj = self.thickness
        if crop_region != orig_region:
            proj = crop(self.thickness, crop_region, block=block)
        if pad_region != (0, 0) + crop_region[2:]:
            proj = pad(proj, pad_region, block=block)
        if proj.shape != shape:
            proj = rescale(proj, shape, block=block)

        return proj
Exemplo n.º 9
0
def crop_to_aperture(image, w, ps):
    """Crop *image* to 2x aperture width."""
    n = image.shape[0]
    fov = image.shape * ps
    wp = int(np.round(w / ps).simplified.magnitude)
    fmt = 'Cropping image with shape {} and FOV {} to {} and FOV {}'
    LOG.info(fmt.format(image.shape[::-1], fov[::-1], 2 * wp, 2 * w))
    # Crop to 4w
    region = (n / 2 - 2 * wp, n / 2 - 2 * wp, 4 * wp, 4 * wp)

    return crop(image, region).get()