imaging_sim op• Datenarten: table → table
• Aufruf: import lensimage; lensimage.calibration_views(system, image_size=(1024, 1024), pixel_pitch_um=5.5, target=(9, 7, 5.0), poses=None, distance_mm=None, noise_px=0.0, seed=0, order=2) (oder opsoptics.get("calibration_views"))
Synthetische Kamerakalibrieransichten eines planaren Targets durch das entworfene Objektiv (`table`).
> Die ausführliche Beschreibung unten ist der Originaltext — Zusammenfassung und Überschriften sind übersetzt.
A chessboard-like grid of *target* = (cols, rows, pitch_mm) corner points
on the plane z = 0 is placed at each of *poses* — ``(rx_deg, ry_deg,
rz_deg, tx_mm, ty_mm, tz_mm)`` in the camera frame (camera at the origin
looking along +z; default: five poses, frontal and ±20° about x and y, at
*distance_mm* — default the distance at which the target spans 60 % of
the sensor width) — projected by a pinhole of the prescription's EFL and
then displaced by the lens's real radial distortion (the polynomial
:func:distortion_map fits from traced chief rays), and expressed as
`(row, col)` pixels on an *image_size* sensor of *pixel_pitch_um*.
Optional Gaussian corner-detection noise *noise_px* (deterministic for
*seed*).
Returns `object_points (N,2) mm on the target plane, image_points`
(a list of (N,2) `(row, col)` arrays — exactly what
`calib.camera_calibration consumes), K_true` (fx = fy = EFL/pitch
px, cx, cy at the sensor centre), the distortion polynomial, the poses,
and per view the fraction of points that landed on the sensor. Views with
fewer than four visible points, a target behind the camera, or an afocal
prescription are `ValueError`.
The point of the op is the closed loop: feed the output to
`calib.camera_calibration` and compare the recovered intrinsics with
`K_true` — for a distortion-free lens (the paraboloid) Zhang's method
returns the EFL to 1e-6, and the singlet's barrel distortion shows up as a
focal-length bias and a non-zero reprojection RMS, so the calibration
module is checked end to end against a lens whose truth is known, and a
real chart can be judged against the same numbers.
Jeder optics-Operator prüft seine Eingabe vor der Berechnung (nichts rutscht stillschweigend durch):
• Einheiten stecken im Argumentnamen — _mm / _um / _deg / _mrad. Eine Verwechslung von mm und µm stürzt nicht ab, sondern liefert eine plausibel aussehende falsche Antwort; der Name verhindert das. Aus der Größenordnung wird nie auf die Einheit geschlossen.
• **Strings lösen ValueError aus** — float('50') gelingt, sodass ein ungeparster Konfigurationswert als Länge durchrutschen würde (gemessen: thin_lens('50', '200') lieferte plausible 66,667 mm). bool wird als implizite Hochstufung True == 1 ebenfalls abgelehnt.
• **complex / Masked Arrays lösen ValueError aus (nur reelle Slots; das stille Verwerfen des Imaginärteils bzw. Abstreifen der Maske wird abgelehnt). NaN/Inf löst bei jeder Eingabe ValueError aus.**
• Division durch null und Verwandtes wird namentlich abgelehnt: Brennweite 0, Krümmungsradius 0, Brechzahl <= 0, undurchlässige Blende (alles 0, die Normierung wird 0/0), PSF mit Summe <= 0, Stokes-Vektor mit S0 = 0 und ein Objekt im vorderen Brennpunkt (Bild im Unendlichen).
• Nur zwei Operatoren liefern einen nicht-endlichen Wert, und beide halten das vertraglich fest: depth_of_field liefert jenseits der hyperfokalen Distanz far_mm = inf (genau das bedeutet die hyperfokale Distanz), und gaussian_beam liefert an der Taille wavefront_radius_mm = inf (der Krümmungsradius einer ebenen Wellenfront). Beide liefern zusätzlich einen endlichen Partner (far_is_infinite / curvature_per_mm). **Jedes andere stille NaN/Inf wird intern erkannt und löst ValueError aus** — "float64 ist übergelaufen" und "die Antwort ist unendlich" sind verschiedene Aussagen; die erste wird nie im Gewand der zweiten geliefert.
• Größenobergrenzen: erzeugte Gitter durch optics.MAX_GRID (4096), übergebene Felder/PSFs/Blenden durch optics.MAX_FIELD_ELEMENTS (2^24), ABCD-Elementketten durch optics.MAX_SYSTEM_ELEMENTS (1024), Zernike durch MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25). Damit werden Pfade fail-closed geschlossen, in denen ein kleines Argument eine riesige interne Allokation auslöst (gemessen: n_max=40 × 4096² braucht 108 GB).
• Physikalisch unmögliche Zustände werden ebenfalls abgelehnt: Stokes-Vektor mit Polarisationsgrad > 1, negative Transmission, negative Intensität und ungültige Zernike-Indizes wie ungerades n-|m|.
• Leitfaden zur Familie optics_imaging
• mv_cables — ケーブル(規格・速度・給電・ロボットケーブル)
• mv_cameras — 産業用カメラメーカー(センサとの紐付け・ラインスキャン / TDI)
• mv_frame_grabbers — フレームグラバーボード(光学系ではないが、撮れるかを決める)
• mv_image_sensors — 産業用イメージセンサ(現行品中心)
• mv_standards — カメラインターフェースの規格と団体
• virtual_machine_vision — 仮想マシンビジョン — パラメータの洗い出しとオブジェクト模型
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.
• lens_calibration_loop_demo — py -3.11 examples/lens_calibration_loop_demo.py
table als Eingabe)abcd_matrix · wavefront_stats · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd · spot_diagram
imaging_sim)psf_from_opd · distortion_map · render_through_lens · defect_dataset
*Provenance: lensimage.py — OPTICS Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.