Add Night Vision Effect to a PNG
Apply realistic night vision effect to PNG images with phosphor tinting, noise, scanlines, bloom & vignette. Free browser-based tool.
About
Night vision devices amplify residual photons through a photocathode and micro-channel plate, then project the result onto a phosphor screen. The characteristic green glow comes from P43 (Gd2O2S:Tb) phosphor, chosen because human scotopic vision peaks near 555nm. This tool replicates that pipeline digitally: it extracts per-pixel luminance using ITU-R BT.709 coefficients (L = 0.2126R + 0.7152G + 0.0722B), injects Gaussian sensor noise via Box-Muller transform, applies a gain curve, then tints through a phosphor color lookup. Scanline artifacts, radial vignette (simulating the round objective lens), and a bloom pass complete the effect. Getting these parameters wrong produces cartoon-ish results. The noise floor, gain, and bloom radius interact non-linearly. This tool exposes those controls individually so you can match specific generation hardware characteristics - Gen I high-noise with heavy vignette, Gen III low-noise with tight bloom.
Formulas
The luminance of each pixel is computed using ITU-R BT.709 luma coefficients:
Gaussian noise is generated via the Box-Muller transform and added to the luminance channel:
where u1 and u2 are uniform random values in (0, 1]. The noisy luminance is then amplified by a gain factor g:
Phosphor tinting maps L′ into RGB through the phosphor color vector (Pr, Pg, Pb):
The vignette mask is computed from normalized radial distance d from image center:
where p controls falloff steepness (typically 2.0 - 4.0). Bloom is a multi-pass box blur applied to pixels exceeding a brightness threshold, then additively composited.
Reference Data
| Generation | Era | Photocathode | Phosphor | SNR | Resolution (lp/mm) | Gain | Typical Noise | Vignette |
|---|---|---|---|---|---|---|---|---|
| Gen 0 | 1940s | S-1 (AgOCs) | P1 Green | 3 - 5 | 15 - 20 | 100 - 1000× | Very High | Extreme |
| Gen I | 1960s | S-20 Multi-alkali | P20 Green | 5 - 10 | 25 - 35 | 1000 - 10000× | High | Strong |
| Gen II | 1970s | S-25 (GaAs) | P43 Green | 12 - 18 | 32 - 40 | 20000 - 30000× | Medium | Moderate |
| Gen II+ | 1980s | Super-Gen (GaAs) | P43 Green | 18 - 22 | 40 - 51 | 25000 - 35000× | Low-Med | Mild |
| Gen III | 1990s | GaAs/AlGaAs | P43 Green | 22 - 28 | 51 - 64 | 30000 - 50000× | Low | Mild |
| Gen III+ (Filmless) | 2000s | Filmless GaAs | P43 Green | 25 - 33 | 64 - 72 | 50000 - 70000× | Very Low | Minimal |
| Gen III OMNI | 2010s | Autogated GaAs | P43/P45 | >28 | 64 - 81 | >70000× | Minimal | Minimal |
| White Phosphor | 2010s+ | GaAs | P45 White | >28 | 64 - 81 | >70000× | Minimal | Minimal |
| Digital (CMOS) | 2015s+ | CMOS Sensor | Display | Varies | Sensor-dependent | Digital AGC | Pixel noise | None |
| Thermal (LWIR) | 1980s+ | Microbolometer | Display | NETD-based | 320 - 1280px | N/A | FPN | None |