scene op• Datenarten: rgbimage × image2d × table → rgbimage
• Aufruf: import fullseye as fs; fs.ledger.defocus_blur(image, depth_mm, camera, f_number: 'float' = 5.6, focus_mm: 'float' = None, layers: 'int' = 7) -> 'np.ndarray' (die Implementierung direkt: import optscene; optscene.defocus_blur(image, depth_mm, camera, f_number: 'float' = 5.6, focus_mm: 'float' = None, layers: 'int' = 7) -> 'np.ndarray'; aus dem Register: opsoptics.get("defocus_blur"))
• GPU: nein (nur CPU-Referenzimplementierung)
Legt aus der Ground-Truth-Tiefe die Schärfentiefe-Unschärfe auf (ideales Lochkamerabild → Bild eines realen Objektivs).
Getrennt gehalten, weil der Name leicht mit optics.depth_of_field verwechselt wird: jener liefert den Zahlenwert der Schärfentiefe, dieser wendet Unschärfe auf ein Bild an (entdeckt am 2026-09-05, als beide im Register unter demselben Namen kollidierten. Ops gleichen Namens werden stillschweigend vom zuletzt registrierten überschrieben, daher werden sie über den Namen unterschieden).
Der Durchmesser des Zerstreuungskreises ist die geschlossene Form der geometrischen Optik c = (f² / (N (z_f − f))) · |z − z_f| / z (f = Brennweite, N = Blendenzahl, z_f = Fokusabstand). In Pixel umgerechnet wird je nach Tiefe gruppierter Schicht ein Gauß-Weichzeichner angewandt und von der vorderen Schicht aus zusammengesetzt.
Das Zusammensetzen ist Over-Compositing von vorn nach hinten (mit vormultiplizierter Farbe und der weichgezeichneten Deckung α verdeckt eine nähere Ebene die ferneren so weit, wie sie deckt). Eine scharfe, undurchsichtige nahe Fläche wird nicht von der Unschärfe dahinter verunreinigt (★bis 2026-11-05 wurden alle Ebenen summiert und durch die weichgezeichneten Gewichte geteilt, und der Rand einer scharfen Fläche fiel 1.0 -> 0.67). Die abschließende Division durch das akkumulierte α füllt den „Schatten der nahen Ebene“, den das Lochkamerabild nicht sieht, mit der umgebenden Farbe.
Tiefe +inf (Unendlich) wird mit dem Grenzwert z -> ∞ c = f² / (N (z_f − f)) weichgezeichnet (★bis 2026-11-05 wurde sie durch die Fokusdistanz ersetzt, und Unendlich wurde scharf abgebildet). NaN und -inf sind Pixel ohne Tiefe und werden wie bisher als scharf behandelt. Die Ebenen werden nach halboffenen Tiefenintervallen [e_i, e_{i+1}) aufgeteilt (nur die letzte Ebene schließt beide Enden ein), daher wird eine Tiefe auf einer Grenze nicht in 2 Ebenen doppelt gezählt.
Ohne dies übersieht man Aufbauten, die "im Sichtfeld liegen, an der realen Maschine aber nie scharf werden" ―― Zweck der Virtualisierung ist nicht, Bilder zu machen, sondern vorab zu wissen, ob die Prüfung mit diesem optischen Aufbau funktioniert, daher lässt sich die Schärfentiefe nicht weglassen.
Ohne focus_mm wird auf den Arbeitsabstand von camera fokussiert. Rückgabe in derselben Form wie die Eingabe.
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. Ausnahme, ausdrücklich erklärt: Das u_map von bottle_fit_from_pattern nimmt nicht gemessene Pixel als NaN entgegen (Unendlich wird weiterhin abgelehnt).
• 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. Ausnahme, ausdrücklich erklärt: bottle_background_map liefert für Pixel mit unbrauchbarem Strahl (Totalreflexion u. Ä.) NaN in u_mm, zusammen mit einer valid-Maske und den Anzahlen.
• 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
• dataset_conventions — Konventionen für Trainingsdatensätze — COCO / YOLO / VOC und Fallstricke in der Sichtprüfung
• mv_cameras — Hersteller von Industriekameras (Sensorzuordnung, Zeilenkamera / TDI)
• mv_illumination_practice — Beleuchtung in der Praxis — Wellenlänge, Polarisation, Ansteuerung, Fremdlicht, Sicherheit
• mv_image_sensors — Industrielle Bildsensoren (vorwiegend aktuelle Produkte)
• virtual_machine_vision — Virtuelle Bildverarbeitung — Parameter erfassen und Objektmodell
• 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.
• poc_focus_stacking — py -3.11 examples/poc_focus_stacking.py
• virtual_machine_vision — py -3.11 examples/virtual_machine_vision.py
rgbimage als Eingabe)clearcoat_shade · wetness · diffraction_blur · sensor_capture · underwater_image · cubemap_from_equirect · viewport_from_equirect · equirect_rotate
scene)scene_material · scene_plane · scene_sphere · scene_box · scene_cylinder · surface_defect · surface_finish · random_defects
*Provenance: optscene.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.