TLDR:
Most consumer CMOS sensors lack Non-Destructive Readout (NDR), but you can simulate it. By combining a sequence of short exposures with precise dark-frame subtraction, noise-weighting, and duty-cycle scaling, we can approximate the evolution of a single long exposure while compensating for the "dead time" between frames.
Introduction
In high-end scientific imaging, Non-Destructive Readout (NDR) is a coveted feature. It allows researchers to monitor photon accumulation during an exposure without resetting the pixel charge. While standard CMOS sensors are typically "destructive"—clearing the charge upon readout—we can emulate this behaviour using Approximate Temporal Sampling. This article explores the mathematical pipeline for transforming a burst of short-exposure RAW frames into a single, high-fidelity synthetic exposure that accounts for sensor noise, dead time, and dark current.
Setup
To demonstrate the synthesis of a long exposure, we will use the following parameters:
- Synthetic exposure: 1 second
- Number of frames: 15
Phase 1: Preparation & Calibration
Before capturing the scene, we must characterise the sensor's behaviour to correct for hardware limitations.
1. Defining Timing and Duty Cycle
Because standard sensors have a "readout gap" between exposures, we must calculate the ratio of active integration time to total elapsed time. This assumes scene brightness is constant and the camera is static.
Let:
- t_s = exposure time per frame
- Δt = frame period (exposure + gap)
- M = 15 frames
Then:
T_covered = M · t_sT_total = M · Δt ≈ 1 sα = t_s / Δt2. Dark Frame Acquisition
To isolate the signal from noise, we measure the black-level offset (bias), read noise, and dark current.
Capture frames with:
- Lens cap on (no light)
- Same exposure time (t_s)
- Same ISO/gain and temperature
Capture N = 20–50 dark frames:
- Lens covered or sensor unexposed
- Same exposure time, ISO/gain, temperature as short exposures
D1, D2, ..., D_N3. Compute Dark Statistics
We calculate pixel-wise maps to handle fixed-pattern noise and random noise:
1. Pixel-wise mean (dark map):
D_mean(x,y) = (1/N) Σ D_k(x,y)Represents the black level + fixed-pattern dark current.
2. Pixel-wise variance (noise map):
σ²(x,y) = (1/(N-1)) Σ (D_i(x,y) - D_mean(x,y))²Measures per-pixel random noise for weighted stacking.
Image Processing
Now we have the data needed to start our pipeline.
1. Capture Images
Capture M = 15 short exposures:
- Each with exposure t_s, spaced by Δt
- Use RAW data (no sRGB/AdobeRGB, no gamma)
I1, I2, ..., I_MEnsure the camera is static.
2. Subtract Black Level
Remove the sensor offset and fixed-pattern noise:
I'_i(x,y) = I_i(x,y) - D_mean(x,y)3. Stack Frames
Option A: Physically accurate (sum)
I_stack(x,y) = Σ I'_i(x,y)Option B: Noise-weighted (normalized)
I_stack(x,y) = (Σ I'_i(x,y)/σ²(x,y)) / (Σ 1/σ²(x,y))4. Correct for Dead Time
Apply intensity scaling to compensate for readout gaps:
I_scaled(x,y) = (T_total / T_covered) · I_stack(x,y)I_scaled(x,y) = (1 / α) · I_stack(x,y)5. Reintroduce Long-Exposure Dark Current (Optional)
A real 1-second exposure accumulates more dark current than 15 short ones. We approximate and reintroduce this signal:
I_dark,long(x,y) = (T_total / t_s) · D_mean(x,y)I_dark,long(x,y) = (M / α) · D_mean(x,y)Final Integration:
I_final(x,y) = I_scaled(x,y) + I_dark,long(x,y)6. Output
The resulting image, I_final, approximates a true 1-second exposure. The pipeline ensures:
- Correct Total Signal: Gap-compensated intensity
- Thermal Realism: Accurately modelled dark current
- Enhanced SNR: Noise reduction via statistical stacking
Comments
0 comments
Please sign in to leave a comment.