underwater_inspection_image — OPTICS watervision op

• Data kinds: rgbimage × image2d → table

• Call: import fullseye as fs; fs.ledger.underwater_inspection_image(scene_albedo, distance_map_m, water_type, light='camera', lamp_power=1.0, camera_distance_m=None, depth_m=2.0, exposure_photons=10000.0, fov_deg=60.0, beam_exponent=6.0) -> 'dict' (implementation को सीधे call करना हो तो import watervision; watervision.underwater_inspection_image(scene_albedo, distance_map_m, water_type, light='camera', lamp_power=1.0, camera_distance_m=None, depth_m=2.0, exposure_photons=10000.0, fov_deg=60.0, beam_exponent=6.0) -> 'dict', registry से लेना हो तो opsoptics.get("underwater_inspection_image"))

उपयोग

पोत-पतवार या पाइप का निरीक्षण चित्र: कैमरे पर लगा लैंप पानी के आर-पार दीवार को रोशन करता है -> dict (चित्र, प्रति-पिक्सेल SNR)।

> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।

A thin layer over watermedia.underwater_image (the Akkaynak and Treibitz form: direct signal plus backscatter veil). scene_albedo is (H, W) or (H, W, 3) and distance_map_m (H, W) the camera-to-surface distance (> 0). light="camera": the only light is a lamp at the camera of lamp_power (relative power at 1 m); the wall is lit by lamp_power exp(-c r) / r^2 (beam attenuation c of the water at 0.61 / 0.54 / 0.465 um), reflects its albedo and the return path attenuates with Kd. The lamp also lights the water in front of the lens: the veil of the water type's single-scattering backscatter grows as 1 - exp(-Kd r) and is weighted by the lamp's beam pattern, cos(theta)^beam_exponent with theta the angle of the pixel from the axis (fov_deg across the width): strongest in the centre, where the lamp and the camera look at the same water. A baseline between lamp and camera, camera_distance_m (default

None: the lamp is at the camera), reduces the overlap of the lit and the seen water by 1 / (1 + (baseline / r)^2). light="ambient": daylight at depth_m and a veil of the daylight, uniform over the image (lamp_power is not used). light="both": the lamp and the daylight together (the signals and the veils add).

snr = sqrt(N) direct / sqrt(direct + backscatter + 1e-12) is the shot-noise limited signal to noise of the direct signal against its own shot noise and the shot noise of the veil (N = exposure_photons per unit radiance): it falls with distance because the direct term falls and the veil grows. snr_clear is the same expression for water that does not attenuate or scatter (equal to snr as the distance tends to 0). The table has image (H, W, 3), direct, backscatter, snr, snr_clear, snr_mean (over the three bands), veil_profile (H, W), transmission, beam_attenuation_c, kd, water_type and light. A zero or negative distance, an albedo outside [0, 1], an unknown water type and a bad light are refused.

पूरी family का input contract (fail-closed)

optics के सभी ops गणना से पहले input की जाँच करते हैं (कुछ भी चुपचाप पास नहीं होता):

• Unit argument के नाम में ही लिखी होती है — _mm / _um / _deg / _mrad। mm और µm की गड़बड़ी crash नहीं करती, बल्कि "सही दिखने वाला पर गलत उत्तर" देती है, इसलिए नाम से इसे रोका जाता है। मान के आकार से unit का अनुमान बिल्कुल नहीं लगाया जाता।

• String से ValueError — float('50') सफल हो जाता है, इसलिए बिना parse किया config value length के रूप में निकल जाता (मापा गया: thin_lens('50', '200') सही दिखने वाला 66.667 mm लौटा रहा था)। bool को भी True == 1 वाले implicit promotion के रूप में अस्वीकार किया जाता है।

• complex / masked array से ValueError (केवल real-valued slots; imaginary part को चुपचाप छोड़ना या mask हटाना अस्वीकार)। हर input पर NaN/Inf से ValueError।

• शून्य से भाग और उससे जुड़े मामलों को नाम लेकर अस्वीकार किया जाता है: focal length 0, radius of curvature 0, refractive index <= 0, पूरी तरह opaque aperture (सब 0, इसलिए normalisation 0/0), ऐसा PSF जिसका योग <= 0 हो, S0 = 0 वाला Stokes vector, और front focal point पर रखा object (image अनंत पर)।

• केवल 2 ops non-finite value लौटाते हैं, और वह भी contract के रूप में लिखा हुआ: depth_of_field hyperfocal distance से आगे far_mm = inf (hyperfocal distance की परिभाषा यही है) और gaussian_beam waist पर wavefront_radius_mm = inf (plane wavefront की radius of curvature)। दोनों साथ में एक finite साथी (far_is_infinite / curvature_per_mm) भी लौटाते हैं। इसके अलावा कोई भी चुपचाप आया NaN/Inf अंदर ही पकड़ा जाता है और ValueError देता है — "float64 overflow हुआ" और "उत्तर अनंत है" अलग-अलग दावे हैं, इसलिए पहले को दूसरे का चेहरा पहनाकर नहीं लौटाया जाता।

• Size की सीमा: generate होने वाले grid के लिए optics.MAX_GRID (4096), दिए गए field/PSF/aperture के लिए optics.MAX_FIELD_ELEMENTS (2^24), ABCD element chain के लिए optics.MAX_SYSTEM_ELEMENTS (1024), Zernike के लिए MAX_ZERNIKE_TERMS (512) / MAX_ZERNIKE_ORDER (40) / MAX_ZERNIKE_BASIS (2^25)। छोटे argument से बहुत बड़ा internal allocation होने वाले रास्तों (मापा गया: n_max=40 × 4096² पर 108 GB) को fail-closed ढंग से बंद किया गया है।

• भौतिक रूप से असंभव states भी अस्वीकार: degree of polarisation > 1 वाला Stokes vector, ऋणात्मक transmittance, ऋणात्मक intensity, और n-|m| odd जैसे अमान्य Zernike indices।

उपयोग की विस्तृत guide

• optics_imaging family guide

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• poc_water_inspection_images — py -3.11 examples/poc_water_inspection_images.py

वे अगले ops जिनसे type जुड़ता है (table को input के रूप में लेते हैं)

abcd_matrix · wavefront_stats · sfr_from_edge · paraxial_trace · seidel_coefficients · spot_stats · tolerance_analysis · wavefront_from_opd

इसी category के (watervision)

caustic_irradiance · bottle_image · fill_level_from_image · wet_surface_appearance · wet_dry_inspection_pair · caustic_floor_segmentation


*Provenance: watervision.py — OPTICS operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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