prysm.psf

A base point spread function interface.

class prysm.psf.PSF(x, y, data)

Bases: prysm.convolution.Convolvable

A Point Spread Function.

center_x

center sample along x

Type

int

center_y

center sample along y

Type

int

data

PSF normalized intensity data

Type

numpy.ndarray

sample_spacing

center to center spacing of samples

Type

float

x

x Cartesian axis locations of samples, 1D ndarray

Type

numpy.ndarray

y `numpy.ndarray`

y Cartesian axis locations of samples, 1D ndarray

encircled_energy(radius)

Compute the encircled energy of the PSF.

Parameters

radius (float or iterable) – radius or radii to evaluate encircled energy at

Returns

if radius is a float, returns a float, else returns a list.

Return type

encircled energy

Notes

implementation of “Simplified Method for Calculating Encircled Energy,” Baliga, J. V. and Cohn, B. D., doi: 10.1117/12.944334

ee_radius(energy=0.8377850436212378)

Radius associated with a certain amount of enclosed energy.

ee_radius_diffraction(energy=0.8377850436212378)

Radius associated with a certain amount of enclosed energy for a diffraction limited circular pupil.

ee_radius_ratio_to_diffraction(energy=0.8377850436212378)

Ratio of this PSF and the diffraction limited PSFs’ radii enclosing a certain amount of energy.

plot2d(axlim=25, power=1, clim=(None, None), interp_method='lanczos', pix_grid=None, cmap='Greys_r', fig=None, ax=None, show_axlabels=True, show_colorbar=True, circle_ee=None, circle_ee_lw=None)

Create a 2D plot of the PSF.

Parameters
  • axlim (float) – limits of axis, symmetric. xlim=(-axlim,axlim), ylim=(-axlim, axlim)

  • power (float) – power to stretch the data by for plotting

  • clim (iterable) – limits to use for log color scaling. If power != 1 and clim != (None, None), clim (log axes) takes precedence

  • interp_method (string) – method used to interpolate the image between samples of the PSF

  • pix_grid (float) – if not None, overlays gridlines with spacing equal to pix_grid. Intended to show the collection into camera pixels while still in the oversampled domain

  • cmap (str, optional) – colormap, passed directly to matplotlib

  • fig (matplotlib.figure.Figure, optional:) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

  • show_axlabels (bool) – whether or not to show the axis labels

  • show_colorbar (bool) – whether or not to show the colorbar

  • circle_ee (float, optional) – relative encircled energy to draw a circle at, in addition to diffraction limited airy radius (1.22*λ*F#). First airy zero occurs at circle_ee=0.8377850436212378

  • circle_ee_lw (float, optional) – linewidth passed to matplotlib for the encircled energy circles

Returns

  • fig (matplotlib.figure.Figure, optional) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional) – Axis containing the plot

plot_encircled_energy(axlim=None, npts=50, lw=3, zorder=3, fig=None, ax=None)

Make a 1D plot of the encircled energy at the given azimuth.

Parameters
  • azimuth (float) – azimuth to plot at, in degrees

  • axlim (float) – limits of axis, will plot [0, axlim]

  • npts (int, optional) – number of points to use from [0, axlim]

  • lw (float, optional) – line width

  • zorder (int optional) – zorder

  • fig (matplotlib.figure.Figure, optional) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

Returns

  • fig (matplotlib.figure.Figure, optional) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

static from_pupil(pupil, efl, Q=2, norm='max')

Use scalar diffraction propogation to generate a PSF from a pupil.

Parameters
  • pupil (Pupil) – Pupil, with OPD data and wavefunction

  • efl (int or float) – effective focal length of the optical system

  • Q (int or float) – ratio of pupil sample count to PSF sample count; Q > 2 satisfies nyquist

Returns

A new PSF instance

Return type

PSF

static polychromatic(psfs, spectral_weights=None, interp_method='linear')

Create a new PSF instance from an ensemble of monochromatic PSFs given spectral weights.

The new PSF is the polychromatic PSF, assuming the wavelengths are sufficiently different that they do not interfere and the mode of imaging is incoherent.

center_x

Center “pixel” in x.

center_y

Center “pixel” in y.

conv(other)

Convolves this convolvable with another.

Parameters

other (Convolvable) – A convolvable object

Returns

a convolvable object

Return type

Convolvable

Notes

If self and other both have analytic Fourier transforms, no math will be done and the aFTs are merged directly.

If only one of self or other has an analytic Fourier transform, the output grid will be defined by the object which does not have an analytic Fourier transform.

If neither has an analytic transform, the output grid will: - span max(self.support, other.support) - have sample spacing min(self.sample_spacing, other.sample_spacing)

This ensures the signal remains Nyquist sampled and (probably) doesn’t expand beyond the extent of the output window. The latter condition will be violated when two large convolvables are convolved.

copy()

Return a (deep) copy of this instance.

deconv(other, balance=1000, reg=None, is_real=True, clip=False, postnormalize=True)

Perform the deconvolution of this convolvable object by another.

Parameters
  • other (Convolvable) – another convolvable object, used as the PSF in a Wiener deconvolution

  • balance (float, optional) – regularization parameter; passed through to skimage

  • reg (numpy.ndarray, optional) – regularization operator, passed through to skimage

  • is_real (bool, optional) – True if self and other are both real

  • clip (bool, optional) – clips self and other into (0,1)

  • postnormalize (bool, optional) – normalize the result such that it falls in [0,1]

Returns

a new Convolable object

Return type

Convolvable

Notes

See skimage: http://scikit-image.org/docs/dev/api/skimage.restoration.html#skimage.restoration.wiener

static from_file(path, scale)

Read a monochrome 8 bit per pixel file into a new Image instance.

Parameters
  • path (string) – path to a file

  • scale (float) – pixel scale, in microns

Returns

a new image object

Return type

Convolvable

plot_slice_xy(axlim=20, lw=3, zorder=3, fig=None, ax=None)

Create a plot of slices through the X and Y axes of the PSF.

Parameters
  • axlim (float or int, optional) – axis limits, in microns

  • lw (float, optional) – line width

  • zorder (int, optional) – zorder

  • fig (matplotlib.figure.Figure, optional) – Figure to draw plot in

  • ax (matplotlib.axes.Axis) – Axis to draw plot in

Returns

  • fig (matplotlib.figure.Figure, optional) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional) – Axis containing the plot

renorm()

Renormalize so that the peak is at a value of unity.

sample_spacing

center-to-center sample spacing.

samples_x

Number of samples in the x dimension.

samples_y

Number of samples in the y dimension.

save(path, nbits=8)

Write the image to a png, jpg, tiff, etc.

Parameters
  • path (string) – path to write the image to

  • nbits (int) – number of bits in the output image

shape

Proxy to phase or data shape.

show(xlim=None, ylim=None, interp_method=None, power=1, show_colorbar=True, fig=None, ax=None)

Display the image.

Parameters
  • xlim (iterable, optional) – x axis limits

  • ylim (iterable,) – y axis limits

  • interp_method (string) – interpolation technique used in display

  • power (float) – inverse of power to stretch image by. E.g. power=2 will plot img ** (1/2)

  • show_colorbar (bool) – whether to show the colorbar or not.

  • fig (matplotlib.figure.Figure, optional:) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

Returns

  • fig (matplotlib.figure.Figure, optional:) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

show_fourier(freq_x=None, freq_y=None, interp_method='lanczos', fig=None, ax=None)

Display the fourier transform of the image.

Parameters
  • interp_method (string) – method used to interpolate the data for display.

  • freq_x (iterable) – x frequencies to use for convolvable with analytical FT and no data

  • freq_y (iterable) – y frequencies to use for convolvable with analytic FT and no data

  • fig (matplotlib.figure.Figure) – Figure containing the plot

  • ax (matplotlib.axes.Axis) – Axis containing the plot

Returns

  • fig (matplotlib.figure.Figure) – Figure containing the plot

  • ax (matplotlib.axes.Axis) – Axis containing the plot

Notes

freq_x and freq_y are unused when the convolvable has a .data field.

size

Proxy to phase or data size.

slice_x

Retrieve a slice through the X axis of the phase.

Returns

  • self.unit (numpy.ndarray) – ordinate axis

  • slice of self.phase or self.data (numpy.ndarray)

slice_y

Retrieve a slice through the Y axis of the phase.

Returns

  • self.unit (numpy.ndarray) – ordinate axis

  • slice of self.phase or self.data (numpy.ndarray)

support

Width of the domain.

support_x

Width of the domain in X.

support_y

Width of the domain in Y.

class prysm.psf.AiryDisk(fno, wavelength, extent=None, samples=None)

Bases: prysm.convolution.Convolvable

An airy disk, the PSF of a circular aperture.

analytic_ft(x, y)

Analytic fourier transform of an airy disk.

Parameters
  • x (numpy.ndarray) – sample points in x axis

  • y (numpy.ndarray) – sample points in y axis

Returns

2D numpy array containing the analytic fourier transform

Return type

numpy.ndarray

center_x

Center “pixel” in x.

center_y

Center “pixel” in y.

conv(other)

Convolves this convolvable with another.

Parameters

other (Convolvable) – A convolvable object

Returns

a convolvable object

Return type

Convolvable

Notes

If self and other both have analytic Fourier transforms, no math will be done and the aFTs are merged directly.

If only one of self or other has an analytic Fourier transform, the output grid will be defined by the object which does not have an analytic Fourier transform.

If neither has an analytic transform, the output grid will: - span max(self.support, other.support) - have sample spacing min(self.sample_spacing, other.sample_spacing)

This ensures the signal remains Nyquist sampled and (probably) doesn’t expand beyond the extent of the output window. The latter condition will be violated when two large convolvables are convolved.

copy()

Return a (deep) copy of this instance.

deconv(other, balance=1000, reg=None, is_real=True, clip=False, postnormalize=True)

Perform the deconvolution of this convolvable object by another.

Parameters
  • other (Convolvable) – another convolvable object, used as the PSF in a Wiener deconvolution

  • balance (float, optional) – regularization parameter; passed through to skimage

  • reg (numpy.ndarray, optional) – regularization operator, passed through to skimage

  • is_real (bool, optional) – True if self and other are both real

  • clip (bool, optional) – clips self and other into (0,1)

  • postnormalize (bool, optional) – normalize the result such that it falls in [0,1]

Returns

a new Convolable object

Return type

Convolvable

Notes

See skimage: http://scikit-image.org/docs/dev/api/skimage.restoration.html#skimage.restoration.wiener

static from_file(path, scale)

Read a monochrome 8 bit per pixel file into a new Image instance.

Parameters
  • path (string) – path to a file

  • scale (float) – pixel scale, in microns

Returns

a new image object

Return type

Convolvable

plot_slice_xy(axlim=20, lw=3, zorder=3, fig=None, ax=None)

Create a plot of slices through the X and Y axes of the PSF.

Parameters
  • axlim (float or int, optional) – axis limits, in microns

  • lw (float, optional) – line width

  • zorder (int, optional) – zorder

  • fig (matplotlib.figure.Figure, optional) – Figure to draw plot in

  • ax (matplotlib.axes.Axis) – Axis to draw plot in

Returns

  • fig (matplotlib.figure.Figure, optional) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional) – Axis containing the plot

renorm()

Renormalize so that the peak is at a value of unity.

sample_spacing

center-to-center sample spacing.

samples_x

Number of samples in the x dimension.

samples_y

Number of samples in the y dimension.

save(path, nbits=8)

Write the image to a png, jpg, tiff, etc.

Parameters
  • path (string) – path to write the image to

  • nbits (int) – number of bits in the output image

shape

Proxy to phase or data shape.

show(xlim=None, ylim=None, interp_method=None, power=1, show_colorbar=True, fig=None, ax=None)

Display the image.

Parameters
  • xlim (iterable, optional) – x axis limits

  • ylim (iterable,) – y axis limits

  • interp_method (string) – interpolation technique used in display

  • power (float) – inverse of power to stretch image by. E.g. power=2 will plot img ** (1/2)

  • show_colorbar (bool) – whether to show the colorbar or not.

  • fig (matplotlib.figure.Figure, optional:) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

Returns

  • fig (matplotlib.figure.Figure, optional:) – Figure containing the plot

  • ax (matplotlib.axes.Axis, optional:) – Axis containing the plot

show_fourier(freq_x=None, freq_y=None, interp_method='lanczos', fig=None, ax=None)

Display the fourier transform of the image.

Parameters
  • interp_method (string) – method used to interpolate the data for display.

  • freq_x (iterable) – x frequencies to use for convolvable with analytical FT and no data

  • freq_y (iterable) – y frequencies to use for convolvable with analytic FT and no data

  • fig (matplotlib.figure.Figure) – Figure containing the plot

  • ax (matplotlib.axes.Axis) – Axis containing the plot

Returns

  • fig (matplotlib.figure.Figure) – Figure containing the plot

  • ax (matplotlib.axes.Axis) – Axis containing the plot

Notes

freq_x and freq_y are unused when the convolvable has a .data field.

size

Proxy to phase or data size.

slice_x

Retrieve a slice through the X axis of the phase.

Returns

  • self.unit (numpy.ndarray) – ordinate axis

  • slice of self.phase or self.data (numpy.ndarray)

slice_y

Retrieve a slice through the Y axis of the phase.

Returns

  • self.unit (numpy.ndarray) – ordinate axis

  • slice of self.phase or self.data (numpy.ndarray)

support

Width of the domain.

support_x

Width of the domain in X.

support_y

Width of the domain in Y.

prysm.psf.airydisk(unit_r, fno, wavelength)

Compute the airy disk function over a given spatial distance.

Parameters
  • unit_r (numpy.ndarray) – ndarray with units of um

  • fno (float) – F/# of the system

  • wavelength (float) – wavelength of light, um

Returns

ndarray containing the airy pattern

Return type

numpy.ndarray