Deflicker Fusionvideo deflicker for slow motion, LED and fluorescent flicker
Original
Flicker Fusion
Drag to compare
frame –

Shooting-range clip, 200 frames of 240 fps slow-motion under 50 Hz lighting. The shot fires at frame 157. Step through it frame by frame to compare the methods.

Deflicker research · October 2026

FlickerScope & Flicker Fusion

A meter that measures flicker the way lighting engineers do, as IEEE 1789 Percent Flicker for every pixel, and a remover that uses those measurements to rebuild each frame from its neighbours.

29.7% → 2.0%flicker on the shooting-range clip
Flash keptthe muzzle flash survives; the CVPR 2023 method erases it
~3 minper 200 frames, against ~65 min for that method

Slow-motion cameras sample mains-powered lamps faster than the lamps stay steady, so frames alternate between bright and dark. Generic deflickering treats this as noise. We treat it as physics: multiplicative, periodic, aliased by the frame rate, different for every light, and separate from real events like a muzzle flash.

How it works

Measure first, then remove

FlickerScope models every pixel as steady scene light multiplied by a flicker gain, Y = S · G, and fits G along optical-flow trajectories so moving people and camera motion are not mistaken for flicker. Flicker Fusion takes that gain field and rebuilds each frame from its neighbours.

FLICKERSCOPE · MEASUREFLICKER FUSION · REMOVEInput videoI(x, t), slow-moOptical flowRAFT on frames with theslow light divided outFlicker frequencyspectrum of change alongthe flow → f0, aliased setPer-pixel fittrend + Fourier seriesalong trajectories, TukeyEvents · normaliseflash = event, not flicker;gain to arithmetic meanAlign & dividewarp frames t±k onto t,÷ each one's own gainSNR-weighted mergeweight ∝ gain²; rejectclipped & misalignedEvent lightadd the flash back; flashframes rebuilt from t−PRefine · guardfull-res gain, 2nd pass;never add flickerflow fieldgain G(x, t) per pixel, per frameevent mask · period PFlicker %+ per-pixel mapsSteady videosame codec, audio
What the meter hands the remover: the optical flow, a gain for every pixel of every frame, a mask of real events, and the exact light period. The remover never guesses where flicker is.
lamp output, 50 Hz mains → 100 Hz123456789101112brightness of each 1/240 s frameframes 1–12 = 50 ms = 5 lamp cycles
Why the range clip repeats every 12 frames. 50 Hz mains makes lamps pulse at 100 Hz. At 240 fps each frame catches a different point of the cycle, and 12 frames span exactly 5 cycles (100/240 = 5/12). FlickerScope finds this 5/12 directly. Our previous method chased a 6-frame pattern, which is only an alias of the second harmonic.
light level of each frame (range clip, real values)steady1.00×t-315%0.82×t-210%1.20×t-122%0.63×t6%1.20×t+122%0.85×t+211%0.98×t+314%tweight ∝ light² — line width and % show each frame’s share
Why the grain disappears. A frame caught at the lamps' dimmest point has to be brightened several times over, and brightening amplifies its noise. Flicker Fusion aligns the neighbours instead, divides each by its own light level and weights them by light squared, so the dark frame is mostly rebuilt from bright, clean ones. Moving or mismatched pixels are rejected, and a flash is never borrowed.
FlickerScope on the range clip

Where it flickers, and by how much

The lane behind the shooter swings by up to 88%, so its darkest frames get about 14 times less light than its brightest. The shooter, lit by a different source, barely flickers at all. The meter also flags the muzzle flash as an event and leaves it out of the measurement.

Per-pixel flicker map of the original: the lane glows yellow at 60 to 88 percent, the shooter is dark near 0 percent.
Original · 29.7%
Per-pixel flicker map after Flicker Fusion: almost uniformly dark, residual flicker near 0 to 5 percent.
Flicker Fusion · 2.0%
0%45%90% flicker

Percent Flicker per pixel, (max − min) / (max + min) of the light reaching it, computed in linear light along motion. Detected frequency: 0.417 cycles per frame, which is 100 Hz at 240 fps.

-40%-20%+0%+20%0255075100125150175shot
originalFlicker Fusion
Frame brightness against the steady level. The original swings from about −37% to +23% every few frames. After Flicker Fusion it stays within a few percent, and the shot at frame 157 is kept as the real burst of light it was.
Head to head

Against ffmpeg, our previous method and CVPR 2023

All methods are scored by the same meter. Calm flicker leaves out the frames around the shot and its smoke, so no method gains from smoothing away a real event. Warp error is the field-standard temporal-consistency measure and does not use our model at all. Structure shows how much of the original image survives.

Shooting range (200 frames)Flicker %Calm flicker %Warp errorStructureGrainTime
Original29.7329.1958.691.0000.90–
ffmpeg deflicker33.8933.2763.010.9990.9411 s
Our previous method8.838.2018.360.9890.9545 s
All-In-One Deflicker (CVPR'23)2.281.597.530.7540.7565 min
CVPR'23 filter with our guide2.481.668.820.7340.87~5 min
Flicker Fusion1.981.245.210.9860.683 min

Lower is better for flicker, warp error and grain; higher is better for structure. Grain compares noise in the flickering zone with that zone in the original's brightest frames. ffmpeg makes this clip worse: one global gain cannot fix flicker that only one region has.

Frame 157, the muzzle flash, side by side: the original fireball, the CVPR 2023 method turning it into a grey smudge, and Flicker Fusion keeping the fireball.
Original · frame 157CVPR'23 · flash erasedFlicker Fusion · flash kept
A muzzle flash adds its own light, so Flicker Fusion removes only the lamps' share at that moment. The light level for the lamps comes from frame 145, which saw the same lamp phase one cycle earlier.
More footage

Before and after on other clips

The same method with the same settings, on footage it was never tuned on: real-world slow-motion clips from the public Blind Video Deflickering dataset. Pick a clip, then drag the divider. Clips marked "partial" improve but still show some flicker; the caption says what is left.

Clips: Blind Video Deflickering dataset (Lei, Ren, Zhang and Chen, “Blind Video Deflickering by Neural Filtering with a Flawed Atlas”, CVPR 2023), CC BY 4.0. Shown as original | Flicker Fusion output, downscaled.

Original
Flicker Fusion
Drag to compare
frame –

Flicker % is FlickerScope's reading before → after. Where the CVPR 2023 method also ran, its result is listed for comparison. Clips with almost no flicker to begin with are left out.

Where it doesn't help yet

Same run, same settings. These clips are not lamp flicker that repeats over a few frames, so there is little for the method to fuse. None gets meaningfully worse: the flicker reading stays within 0.1 points or drops, and warp error drops on all five. As a safeguard, any result that would shift the whole clip's exposure is discarded and the original returned.

ClipFlicker %Why
Smoker
Low-key portrait, drifting smoke
63.0 → 59.4Drifting smoke changes brightness with no lamp cycle, and flow cannot track it, so there is nothing reliable to fuse from.
Sunset
Time-lapse exposure flicker
25.9 → 24.5Time-lapse: exposure jumps between shots taken seconds apart. There is no lamp cycle, and too much changes between frames to borrow light.
City
Time-lapse exposure flicker
25.1 → 25.2Time-lapse: exposure jumps between shots taken seconds apart. There is no lamp cycle, and too much changes between frames to borrow light.
Snow day
Time-lapse exposure flicker
28.9 → 25.6Time-lapse: exposure jumps between shots taken seconds apart. There is no lamp cycle, and too much changes between frames to borrow light.
Snow night
Time-lapse exposure flicker
40.3 → 39.6Time-lapse: exposure jumps between shots taken seconds apart. There is no lamp cycle, and too much changes between frames to borrow light.
Proving it

Tested against ground truth

Real footage has no "correct answer", so we built clips that do. A physics simulator relights clean video with modelled lamps (filament, fluorescent ballast, LED drivers, LED dimmers from 100 Hz to 2 kHz) on 50 or 60 Hz mains, as seen by a 120 to 480 fps camera with global or rolling shutter, highlight clipping and sensor noise. Because we know the true flicker, we can check both the meter and the remover.

Meter checkTrue %Measured %
LED + PWM dimmer, 120 fps1.21.4
2 kHz PWM, 480 fps3.83.7
3 sources incl. PWM11.211.5
Fluorescent, rolling shutter12.514.6
2 tubes, 480 fps12.816.5
3 sources, 240 fps19.020.1
3 lamps out of phase23.330.6
Raw LED driver38.841.5

Correlation with the truth r = 0.988, mean error 2.2 points, frequency correct on all 8. The meter reads a little high, most with several out-of-phase lamps.

PSNR vs truth (dB)OriginalBest otherFusion
LED + PWM dimmer34.934.941.4
2 kHz PWM33.033.035.8
3 sources incl. PWM30.130.635.7
Fluorescent, rolling30.532.041.4
2 tubes, 480 fps28.029.537.1
3 sources, 240 fps28.232.538.3
3 lamps out of phase27.329.231.6
Raw LED driver23.529.335.5

Higher is better. Best other: the best of the untouched original, ffmpeg deflicker, our previous method and the FlickerScope-gain-only ablation. Flicker Fusion wins every clip by 2.4 to 9.5 dB, partly because rebuilding dark frames from bright ones also removes noise.

Try it

Run it on your own footage

The code is on GitHub. With a CUDA GPU and the RAFT weights (see the README), one command writes the deflickered video (original audio kept), a side-by-side compare video and a flicker report:

git clone https://github.com/devgmstudios/deflicker-fusion
cd deflicker-fusion
pip install -r requirements.txt
python bench/deflicker_file.py my_slowmo_clip.mov

The repository also holds the benchmark (prep.py, run.py, gate.py), the testing-grounds viewer that plays every clip and method side by side, and a small local web app. On iPhone, Deflicker: Slow Mo Flicker Fix runs this method in its Fusion engine.

What's next

Open questions

  1. A learned version of FlickerScope, trained on the simulator with clean DAVIS video, to see whether it beats the hand-built fit.
  2. The full public Blind-Video-Deflickering benchmark: 15 clips, 6 of them already processed by the CVPR 2023 method.
  3. The meter's slight over-reading with several out-of-phase lamps.
  4. Scoring the Flickerformer (CVPR 2026) baseline on the same clips with the same meter.