counting op• Data kinds: image2d → image2d
• Call: import photoncount; photoncount.photon_sample(image, photons_per_unit=100.0, dark_rate=0.0, seed=0) (or opsphoton.get("photon_sample"))
Poisson-sample an expected-photon image into an actual photon count image.
*image* is a non-negative 2-D map of scene radiance in arbitrary units;
`lambda = image * photons_per_unit + dark_rate` is the expected number of
photons in each pixel over the exposure, and the result is one Poisson
realisation of it. *dark_rate* is the dark-count contribution (a SPAD counts
thermally generated carriers even in the dark) in the same photon units.
Returns the counts themselves as a float64 `(H, W)` image (integer
valued). That is the deliberate difference from
:func:backends_aug.aug_shot_noise, which returns `Poisson(v*K)/K` clipped
to `[0, 1]` for training-data augmentation: every operator downstream here
(Fano factor, Anscombe, Coates, dToF) needs `N`, and the rescale-and-clip
is not invertible.
`seed` is a required non-negative integer and the RNG is
`numpy.random.default_rng(seed)` — same seed, same frame, on any machine.
Ground truth it reproduces (pinned in `tests/test_photoncount.py`): the
sample mean and sample variance both converge to `lambda`. Measured on a
flat `lambda = 100` field of 512x512 pixels at seed 0 — mean 99.9796,
Fano factor 1.001089, so the photon-limited SNR is `sqrt(lambda)`: 9.9990
predicted from the mean, 9.9935 actually achieved.
Raises `ValueError`: negative or non-finite *image*, negative
*photons_per_unit* / *dark_rate*, a non-integer or negative *seed*, an image
over :data:MAX_IMAGE_ELEMENTS, and — instead of letting numpy fail deep
inside the sampler — any `lambda over :data:MAX_LAMBDA`.
• photon_timeresolved family guide
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• The canonical algorithm (author, year) and its uses are named in the family usage guide above.
• photon_timeresolved — py -3.11 examples/photon_timeresolved.py
image2d as input)photon_statistics · photon_uncertainty · anscombe_transform · anscombe_inverse
counting)photon_statistics · photon_uncertainty
*Provenance: photoncount.py — PHOTON operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.