fullseye

psf_to_mtf — OPTICS imaging op

使い方

Radially-averaged MTF of a measured point-spread function.

OTF = FFT{PSF}, MTF = |OTF| / |OTF(0)|, then averaged over annuli of constant spatial frequency out to the Nyquist limit 1/(2*pitch). This is the measurement side of resolution: image a point source (or a slit, or differentiate a knife edge), hand the spot here, and compare the curve with the diffraction limit from :func:mtf_diffraction.

Returns an (n, 2) float64 pairs array: column 0 the spatial frequency in cycles per millimetre, column 1 the MTF in [0, 1]. One row per non-empty radial bin (a very anisotropic array can leave a bin empty; those rows are dropped rather than filled with a NaN).

Ground truth it reproduces (measured): a delta PSF gives MTF == 1 at every frequency exactly (max deviation 0.0); a Gaussian PSF of sigma pixels gives the closed form exp(-2*pi^2*sigma^2*f^2) — the maximum absolute deviation over the whole curve is 4.1e-4 at sigma = 2 px on 128x128, 8.3e-4 at sigma = 1.5 px on 64x64 and 2.4e-4 at sigma = 3 px on 256x256 (the residual is the radial average over a square grid, not an error in the transform). Doubling pixel_pitch_um halves every reported frequency and leaves the MTF column bit-identical.

The PSF is not re-normalised or re-centred: a PSF whose energy is not centred carries a linear phase, which the modulus discards, so the MTF is unaffected — but the phase transfer function, which is where a decentred/asymmetric PSF shows up, is deliberately not summarised here.

Raises ValueError: psf is not 2-D / smaller than 2x2 / over the size cap / complex / masked / non-finite; a PSF that sums to zero or less (the DC normalisation would be 0/0 — an all-zero “PSF” is not a PSF); non-positive or non-finite pixel_pitch_um.

ファミリ共通の入力契約(fail-closed)

optics の全 op は入力を検証してから計算する(黙って通さない):

詳しい使い方ガイド

背景知識ガイド(この op の手前にある物理・規約)

参考(サンプルデータ・文献)

実行できる例(この op を実際に呼ぶ検証済みサンプル)

型が繋がる次の op(pairs を入力に取れる)

同カテゴリ(imaging)

mtf_diffraction · wavefront_stats


Provenance: optics.py — OPTICS operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.