distortion

Distortion utilities.

StructuredGrid(xy)

A structured 2D-grid, stored as a complex 2D-array.

GeometricDistortion([center, Kcoeffs, …])

Brown-Conrady (achromatic) distortion model.

ChromaticDistortion([wref, coeffs])

A polynomial description of Transverse Chromatic Distortion.

class spectrogrism.distortion.StructuredGrid(xy)[source]

A structured 2D-grid, stored as a complex 2D-array.

create(nx, ny[, step, offset, rotation])

Create a regular rectangular grid.

reorder(signature)

Manipulate self.xy to match signature.

plot([ax, label, color])

Plot structured grid.

estimate_parameters([rmin, frac, rescale, fig])

Estimate regular grid parameters from triangulation analysis.

rms(xy)

Compute RMS distance to 2D-array.

adjust_distortion(other, gdist[, scale, …])

Adjust geometric distortion to match other (compatible) grid.

plot_offsets(other[, ax, units])

Plot offset between self and other grid (used as reference).

classmethod create(nx, ny, step='auto', offset=0, rotation=0.0)[source]

Create a regular rectangular grid.

Parameters
  • nx (int) – number of steps in x

  • ny (int) – number of steps in y

  • step – fixed (float) or automatic (‘auto’) stepsize

  • offset (complex) – grid offset

  • rotation (float) – grid angle [rad]

property nx
property ny
property x

Flattened x-coordinate array.

property y

Flattened y-coordinate array.

property signature

Return a 4-character signature string such as ‘x+y-‘.

Standard order – x increasing along 1st axis and y increasing along 0th axis – corresponds to ‘x+y+’. ‘y-x+’ corresponds to a transposed coordinate array, with y decreasing along the 1st axis, and x increasing along the 0th axis.

Noting ‘+.’ a mean finite difference where the real part is positive and larger (in absolute value) than the imaginary part, one has the following correspondance:

fd[0] |  +.    -.    .+    .-
fd[1] |
------+-----------------------
  +.  |             y+x+  y-x+
  -.  |             y+x-  y-x-
  .+  | x+y+  x-y+
  .-  | x+y-  x-y-
reorder(signature)[source]

Manipulate self.xy to match signature.

plot(ax=None, label=None, color='k')[source]

Plot structured grid.

estimate_parameters(rmin=0.1, frac=0.1, rescale=False, fig=None)[source]

Estimate regular grid parameters from triangulation analysis.

Parameters
  • rmin (float) – minimal circle ratio (see matplotlib.tri.TriAnalyzer.get_flat_tri_mask())

  • frac (float) – fraction of edges used for distortion parameters

  • rescale (bool) – rescale long edges (not trustworthy for significantly distorted grid)

  • fig (matplotlib.pyplot.Figure) – produde a control plot if not None

Returns

(step, rotation [rad], complex offset, complex center of distortion)

rms(xy)[source]

Compute RMS distance to 2D-array.

Note

intput grids are supposed to be compatible both in shape and signature. RMS cannot be computed or is meaningless otherwise.

adjust_distortion(other, gdist, scale=False, rotation=False, offset=False, **options)[source]

Adjust geometric distortion to match other (compatible) grid.

If scale (resp. rotation and offset), the grid scale (resp. rotation and offset) is adjusted simultaneously.

Other options are transmitted to Minuit initialization.

plot_offsets(other, ax=None, units=(1, ''))[source]

Plot offset between self and other grid (used as reference).

class spectrogrism.distortion.GeometricDistortion(center=0, Kcoeffs=[], Pcoeffs=[], scale=1, rotation=0, offset=0)[source]

Brown-Conrady (achromatic) distortion model.

\[\begin{split}x_d &= x_u \times (1 + K_1 r^2 + K_2 r^4 + \ldots) \\ &+ \left(P_2(r^2 + 2x_u^2) + 2P_1 x_u y_u\right) (1 + P_3 r^2 + P_4 r^4 + \ldots) \\ y_d &= y_u \times (1 + K_1r^2 + K_2r^4 + \ldots) \\ &+ \left(P_1(r^2 + 2y_u^2) + 2P_2 x_u y_u\right) (1 + P_3 r^2 + P_4 r^4 + \ldots)\end{split}\]

where:

  • \(z_u = x_u + j y_u\) is the undistorted complex position,

  • \(z_d = x_d + j y_d\) is the distorted complex position,

  • \(z_0 = x_0 + j y_0\) is the complex center of distortion,

  • \(r = |z_u - z_0|\) is the undistorted distance to CoD.

The K-coefficients (resp. P-coefficients) model the radial (resp. tangential) distortion.

Note there’s a possibility to rescale (scale s + rotation \(\alpha\) + offset \(\delta z\)) the input (undistorted) positions before applying the distortion pattern (see GeometricDistortion.rescale()).

Reference: Optical distortion

forward(xyu)

Apply distortion to undistorted (rescaled) positions.

backward(xyd[, lcol])

Correct distortion from distorted complex positions.

rescale(xy)

Rescale input complex positions.

unscale(xy)

Unscale output complex positions.

plot([xy, ax])

Plot distortions for a 2D-grid of complex positions.

Initialize from center of distortion and K- and P-coefficients.

Parameters
  • center (complex) – complex position of center of distortion [m]

  • Kcoeffs (list) – radial distortion coefficients

  • Pcoeffs (list) – tangential distortion coefficients (empty or length >= 2)

  • scale (float) – scaling to be applied to input coordinates

  • rotation (float) – rotation to be applied to input coordinates [rad]

  • offset (complex) – offset to be applied to input coordinates [m]

center

Center of distortion (complex) [m]

scale

Coordinate scaling

rotation

Coordinate rotation [rad]

offset

Coordinate complex offset [m]

classmethod from_kwargs(**kwargs)[source]

Initialize from kwargs.

property x0

x-coordinate of center of distortion.

property y0

y-coordinate of center of distortion.

property Kcoeffs

Radial coefficients.

property Pcoeffs

Tangential coefficients.

rescale(xy)[source]

Rescale input complex positions.

\[z' = z \times s e^{j\alpha} + \delta z\]
unscale(xy)[source]

Unscale output complex positions.

\[z = (z' - \delta z) / (s e^{j\alpha})\]
forward(xyu)[source]

Apply distortion to undistorted (rescaled) positions.

backward(xyd, lcol=0)[source]

Correct distortion from distorted complex positions.

Include a (single-wavelength) lateral color term if needed.

plot(xy=None, ax=None)[source]

Plot distortions for a 2D-grid of complex positions.

class spectrogrism.distortion.ChromaticDistortion(wref=1e-06, coeffs=[])[source]

A polynomial description of Transverse Chromatic Distortion.

The Transverse Chromatic Aberration (so-called lateral color) occurs when different wavelengths are focused at different positions in the focal plane.

Reference: Chromatic aberration

See also: Klein, Brauers & Aach, 2010, for a more detailed modeling of Transversal Chromatic Aberrations.

coeffs

Expose non-null coefficients \([c_{i \geq 1}]\).

amplitude(wavelengths)

Compute amplitude of the (radial) chromatic distortion.

Initialize from reference wavelength and lateral color coefficients.

\[dr = \sum_{i=1}^N c_i (\lambda - \lambda_{\mathrm{ref}})^i\]

Note that \(c_0 = 0\).

Parameters
  • wref (float) – reference wavelength \(\lambda_{\mathrm{ref}}\) [m]

  • coeffs (list) – lateral color coefficients \([c_{i=1, \ldots N}]\)

wref

Reference wavelength [m]

property coeffs

Expose non-null coefficients \([c_{i \geq 1}]\).

amplitude(wavelengths)[source]

Compute amplitude of the (radial) chromatic distortion.

Parameters

wavelengths (numpy.ndarray) – wavelengths [m]

Returns

lateral color radial amplitude