Image Temporal Equalize
Even out flicker across a batch of frames
- images
- images
Nothing kills an animation faster than footage that flickers or drifts in exposure - a batch where frame 40 is a hair brighter than frame 39, and the whole sequence shimmers when played back. WAS Image Temporal Equalize exists for exactly that: it evens out brightness and colour drift across the frames of a batch, settling the sequence without wrecking the content of any single frame.
The mechanism is a temporal average, and it's worth understanding before you touch the sliders. Each frame is remapped onto an average of the frames around it - temporal_radius (default 4) sets how many frames on either side join that average. A larger radius settles a slower drift and resists a genuine change in lighting (like a light switching on mid-shot); a radius of 0 leaves the sequence alone entirely. The subtlety the tooltip calls out is why this doesn't just push every frame one way: each frame is remapped onto its local average, so the shadows and the highlights of a frame don't both get shoved in the same direction - a frame that's dark in its shadows and bright in its highlights stays that way, it just stops disagreeing with its neighbours.
strength (0 to 1, default 1) decides how far each frame is moved toward that average. Full strength flattens real variation too - if some of the change in your footage is meant to be there (a slow intentional brightening), drop strength toward 0.5 and keep part of the original variation. That's the dial that separates "deflicker" from "destroy the mood."
per_channel (default on) controls whether each colour channel is corrected on its own curve. On, a drifting colour cast is followed as well as a brightness change - so a batch that slowly shifts from warm to cool gets its cast evened out too. Off, one curve computed from brightness is applied to every channel, which moves no colour that wasn't already moving. Leave it on for colour footage; if you only care about luma flicker and want to be conservative about hue, turn it off.
The one hard requirement is in the input tooltip: the batch is read in order, so this only makes sense when you feed it the frames of one shot. Throw a shuffled folder of unrelated pictures at it and you're averaging nonsense together. Feed it the ordered frames of an AnimateDiff render, an img2img sequence, or extracted video frames and it behaves.
The output is images, same size and same length as it went in - a like-for-like swap, so you can slot it anywhere along the frame path. This is a pure post-process, deterministic and cheap; it's the kind of tool the KB keeps pointing people to before they reach for a heavier fix. When an animation flickers, the community's instinct is often a re-roll or a brand-new sampler run, but a deflicker pass over what you already generated is instant and doesn't change the underlying content.
Install
Part of WAS Node Suite v3. ComfyUI Manager, search "WAS Node Suite", or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui
Restart after. Needs ComfyUI 0.14.0+ and Python 3.10+. Nothing pip-installs, no model files. (v3 dropped the v2 pack's dependency pile entirely.)
Common issues
- Footage still flickers.
temporal_radiusis too small for the drift - a slow exposure change wants a bigger window, not a smaller one. - The whole sequence goes mushy or flat.
strengthat 1.0 with a wide radius is aggressively averaging. Back offstrengthand keep the motion of the shot. - Colours shift where you didn't ask. If it's luma-only flicker, set
per_channeloff so hue is left alone. - Random frames fed in produce garbage. The batch must be one ordered shot. Sort your filenames first.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The sequence to even out; IMAGE. The batch is read in order, so it must be the frames of one shot rather than unrelated pictures. | |
| temporal_radius | INT | 40–250 | Frames either side that each frame is averaged against; INT. Larger settles a slower drift and resists a real change in lighting; 0 leaves the sequence alone. |
| strength | FLOAT | 1.000–1 | How far each frame is moved towards its average; FLOAT, 0 to 1. Below 1 keeps part of the original variation, for footage where some change is meant to be there. |
| per_channel | BOOLEAN | true | Correct each colour channel on its own curve; BOOLEAN. On, a colour cast that drifts is followed as well as a brightness change. Off, one curve from brightness is applied to every channel, which moves no colour that was not already moving. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | The evened out sequence; IMAGE, the same size and length as it went in. |