pyCUDAdecon

This package provides a python wrapper and convenience functions for cudaDecon, which is a CUDA/C++ implementation of an accelerated Richardson Lucy Deconvolution algorithm [1]. cudaDecon was originally written by Lin Shao and modified by Dan Milkie, at Janelia Research campus. This package makes use of a shared library interface that I wrote for cudaDecon while developing LLSpy, that adds a couple additional kernels for affine transformations and camera corrections.

  • CUDA accelerated deconvolution with a handful of artifact-reducing features.

  • radially averaged OTF generation with interpolation for voxel size independence between PSF and data volumes

  • 3D deskew, rotation, general affine transformations

  • CUDA-based camera-correction for sCMOS artifact correction

Install

Install (Linux and Windows) from conda forge:

conda install -c conda-forge pycudadecon

see GPU requirements in Installation.

Quickstart

If you have a PSF and an image volume and you just want to get started, check out the pycudadecon.decon() function, which should be able to handle most basic applications.

from pycudadecon import decon

image_path = '/path/to/some_image.tif'
psf_path = '/path/to/psf_3D.tif'
result = decon(image_path, psf_path)

For finer-tuned control, you may wish to make an OTF file from your PSF using make_otf(), and then use the RLContext context manager to setup the GPU for use with the rl_decon() function. (Note all images processed in the same context must have the same input shape).

from pycudadecon import RLContext, rl_decon
from glob import glob
import tifffile

image_folder = '/path/to/some_images/'
imlist = glob(image_folder + '*488*.tif')
otf_path = '/path/to/pregenerated_otf.tif'

with tifffile.TiffFile(imlist[0]) as tf:
    imshape = tf.series[0].shape

with RLContext(imshape, otf_path, dz) as ctx:
    for impath in imlist:
        image = tifffile.imread(impath)
        result = rl_decon(image, output_shape=ctx.out_shape)
        # do something with result...

If you have a 3D PSF volume, the TemporaryOTF context manager facilitates temporary OTF generation…

# continuing with the variables from the previous example...
psf_path = "/path/to/psf_3D.tif"

with TemporaryOTF(psf) as otf:
    with RLContext(imshape, otf.path, dz) as ctx:
        for impath in imlist:
            image = tifffile.imread(impath)
            result = rl_decon(image, output_shape=ctx.out_shape)
            # do something with result...

… and that bit of code is essentially what the decon() function is doing, with a little bit of additional conveniences added in.

Each of these functions has many options and accepts multiple keyword arguments. For further information, see the documentation for the respective functions.

References

[1]

David S. C. Biggs and Mark Andrews. Acceleration of iterative image restoration algorithms. Appl. Opt., 36(8):1766–1775, Mar 1997. URL: http://ao.osa.org/abstract.cfm?URI=ao-36-8-1766, doi:10.1364/AO.36.001766.