scene op• Datenarten: table × image2d → table
• Aufruf: import fullseye as fs; fs.ledger.surface_defect(primitive: 'dict', field, mask=None, uv_size_mm=(20.0, 20.0), centre_mm=(0.0, 0.0), height_um: 'float' = 0.0, height_field=None, roughness_um: 'float' = 0.6) -> 'dict' (die Implementierung direkt: import optscene; optscene.surface_defect(primitive: 'dict', field, mask=None, uv_size_mm=(20.0, 20.0), centre_mm=(0.0, 0.0), height_um: 'float' = 0.0, height_field=None, roughness_um: 'float' = 0.6) -> 'dict'; aus dem Register: opsoptics.get("surface_defect"))
Klebt eine 2-D-Defektkarte auf die Oberfläche eines Teils (frisst die Ausgabe von defectgen direkt).
field ist die Helligkeitsmodulation (H, W) (0 = keine Änderung, −0.3 = ein um 30% dunklerer Kratzer). Wird height_um angegeben, wird dieselbe Karte auch als Höhe interpretiert und die Normalen werden aus ihrem Gradienten geneigt ―― damit wird der Sinn eines Beleuchtungswechsels reproduziert: derselbe Kratzer verschwindet unter Kuppelbeleuchtung und leuchtet unter Dunkelfeldbeleuchtung (das ist der Kern von Trainingsdaten für Sichtprüfungs-KI).
Mit einem separaten height_field lassen sich Defekte ohne Farbänderung, nur mit Relief erzeugen (Dellen, Einfallstellen, flache Schrammen). Wird field auf lauter Nullen gesetzt, entsteht ein reiner Gelände-(Relief-)Defekt, der unter Kuppelbeleuchtung verschwindet und unter flachem Dunkelfeldlicht leuchtet ―― genau dieser Unterschied ist der Grund, die Beleuchtung zu wählen.
roughness_um ist das Maß, um das die Oberfläche nur am Defekt rauer wird (Default 0.6 µm).
Anders betrachtet tragen die Bearbeitungsspuren von surface_finish dasselbe in anderer Körnung ―― Bearbeitungsspuren sind eine Darstellung, die die Textur des Oberflächenreliefs auf Rauschen weniger Oktaven komprimiert, während die Rauheit hier "Relief feiner als ein Pixel, das nicht auflösbar ist" auf 1 Zahl (σ) zusammendrückt. Auflösbares Relief wird als Normalen, nicht auflösbares als Rauheit behandelt: das ist die Arbeitsteilung. Ein Kratzer ist eine Spur, an der Material abgetragen wurde, daher ist er immer rauer als die intakte Fläche. Damit sinkt der Spiegelanteil exp(-(4πσcosθ/λ)²) und er wird im Hellfeld dunkel, während die Streuung zunimmt und er im Dunkelfeld hell wird ―― die lehrbuchmäßige Kontrastumkehr entsteht nicht aus der Neigung der Normalen, sondern aus dieser Rauheit (um flaches Licht senkrecht nach oben zurückzuwerfen, müsste die Fläche um 39 Grad geneigt sein, was die Flanke eines Kratzers nicht erreicht; am 2026-09-05 durch Messung bestätigt). Mit 0 entsteht ein Defekt, der die Rauheit nicht ändert.
uv_size_mm ist die reale Größe [mm] des Aufbringens, centre_mm das Zentrum in Flächenkoordinaten. Wird mask übergeben, sind dessen Pixel das Defekt-Label (die von optscene_defect_mask zurückgegebene Ground Truth).
Rückgabewert ist ein neues Primitiv mit angebrachtem Defekt (das Original wird nicht verändert).
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
• 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.
• studio_raytrace_scene — py -3.11 examples/studio_raytrace_scene.py
table als Eingabe)abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd
scene)scene_material · scene_plane · scene_sphere · scene_box · scene_cylinder · surface_finish · random_defects · scene_difference
*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.