Image White Balance
Take the colour cast out by guessing the light
- images
- images
A render that came out orange where it should be white, or footage shot under tungsten that's gone yellow - that's a colour cast, and the correct fix isn't to regenerate. WAS Image White Balance works out what colour the light was and divides it back out, leaving brightness alone. It's the automatic-white-balance of the image tools, with the one thing real cameras don't give you: a choice of how it guesses.
The mechanism is classic white-balance estimation. Every estimator here starts from an assumption about the scene, computes the colour of the light from that assumption, and divides the cast away. The estimator dropdown is where the assumptions differ, because each one is fooled by a different scene:
- grey world assumes the average of the whole scene is grey - solid and simple, but a scene that's genuinely one colour (a field of grass, a blue sky) drags the balance off trying to make the average grey.
- white patch assumes the brightest point in the scene is white - great when there's a real specular highlight or a white object, wrong when the brightest thing is a coloured light.
- shades of grey sits between the two, a compromise that resists both failure modes a bit.
- grey edge is the interesting one - it averages the scene's edges instead of its flat colours, so a large block of one colour barely moves it. If your subject fills the frame with a single hue, this is the one that won't panic.
strength (0 to 1, default 1) sets how much of the cast to remove. Full strength is a full correction; drop it to 0.6–0.8 and you keep some of the original warmth for a look that's meant to be there. This is the dial that separates "correcting the light" from "sanitising the mood" - a golden-hour shot corrected to 1.0 is a midday shot.
The node's special trick for footage is temporal_radius, default 0. At 0, every frame is balanced on its own, which is fine for a still and a disaster for video: as the scene's contents change from frame to frame, each frame's guess wanders and the "correction" flickers worse than the cast did. Raise temporal_radius and the estimate is averaged over that many frames on either side, so the balance holds still across the shot. The tooltip's advice is worth taking literally: raise temporal_radius for footage so the balance stays put instead of shifting shot to shot. There's a real-world principle underneath - the light in a shot changes slowly; the contents change fast. Averaging over time separates the two.
Inputs are images (a batch is treated as ordered frames once temporal_radius is above 0), the estimator, strength and temporal_radius. Output is images, same size and length as it went in - a clean like-for-like swap you can drop anywhere in a post chain. It's deterministic and instant, the kind of cheap primitive the KB keeps nudging people toward before they re-roll a generation "because the colours are off."
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+. No pip packages or model downloads (v3 dropped the v2 pack's dependency pile).
Common issues
- Balance overcorrects a warm scene to grey. The scene violates the estimator's assumption - a sunset sky is not "white under orange light." Drop
strengthor switch estimators. - Footage balance flickers shot to shot.
temporal_radiusis at 0. Raise it so the guess averages across frames. - A solid-colour subject makes the whole frame shift. Try
grey edge, which averages edges and barely moves on a big flat block of one colour.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | The image or sequence to balance; IMAGE. A batch is treated as frames in order when temporal_radius is above 0. | |
| estimator | COMBO | How the colour of the light is guessed; COMBO. 'grey world' assumes the average of the scene is grey, 'white patch' that the brightest point is white, 'shades of grey' sits between them, and 'grey edge' averages the edges instead, which a large block of one colour barely moves. | |
| strength | FLOAT | 1.000–1 | How much of the cast to remove; FLOAT, 0 to 1. Below 1 keeps some of the original warmth, for a look that is meant to be there. 0 leaves the image alone. |
| temporal_radius | INT | 00–250 | Frames either side the guess is averaged over; INT. 0 balances every frame on its own, which wanders when the scene's contents change. Raise it for footage so the balance holds still. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | The balanced image; IMAGE, the same size and length as it went in. |