Color Cast Remover (Eric_)
Kill the orange cast without nuking the rest of the shot
- image
- skin_mask
- image
- correction_matrix
Every AI portrait eventually comes out looking like it was shot through a pumpkin. Color Cast Remover (Eric_) is the white-balance pass that fixes that, and it has a genuinely useful trick: instead of guessing "neutral" from the whole frame, it can use your skin mask as a known reference and drive the skin's color to where it belongs. That's the difference between "the average of everything is now gray" and "the person's skin looks like skin."
Three methods, one honest recommendation. The method dropdown picks the algorithm:
gray_world- assumes the scene's average color should be neutral gray. Decent general-purpose default, but it gets fooled by a shot that's genuinely one color (a golden-hour scene will fight you).white_patch- assumes the brightest region should be white, withwhite_patch_percentile(default 99) controlling how aggressive it is. Great when there's an actual white object to anchor on, dicey otherwise.skin_guided- the default and the reason to install this node. It measures the skin's chrominance centroid inside your mask and rotates it onto the skin-tone line at the same saturation. It's the most accurate for portraits by a mile.
strength (0–1, default 1) blends the correction back toward the original, so you can dial in a half-fix instead of a full one.
Here's the trap, and it's a real one. skin_guided without a skin_mask does not error out - it quietly prints a warning to the console and falls back to gray_world. If you pick the fancy method and forget the mask, you'll get the mediocre one and never see a red error. If the correction suddenly looks "average-ish" instead of skin-aware, check your mask wiring first.
Outputs. You get the corrected image plus a correction_matrix output. Like the rest of this pack, that's a CONDITIONING-typed wire carrying a plain dict (the RGB scale factors), not something you feed a sampler. Its job is to go into ApplySavedCorrection so you can stamp the exact same white balance onto every frame of a video batch - that's the no-flicker workflow this pack is built for: fix frame zero, capture the matrix, replay it on the rest.
Installing it. It ships in the Eric Color Correction pack:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Eric_Color_Correction_ComfyUI
cd Eric_Color_Correction_ComfyUI
pip install -r requirements.txt
Restart ComfyUI, or find it under "Eric Color Correction" in ComfyUI Manager. This node is pure tensor math - no model downloads, runs on CPU happily. Just remember the pack is dual-licensed (non-commercial CC BY-NC-style unless you buy the commercial license), so check that before you ship client work.
The workflow it belongs to. Build a skin mask with FaceParsingSkinMask or HumanParsingSkinMask, feed it here, then chain SkinToneCorrector → SkinLuminanceAdjust, and re-run the analyzer to confirm. White balance first, hue second, brightness last - the order is the whole game, and this node is step one.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| method | COMBO | skin_guided | 3 options: gray_world, white_patch, skin_guided |
| strength | FLOAT | 1.000–1 | — |
| white_patch_percentile | FLOAT | 99.090–100 | — |
| skin_maskopt | MASK | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| correction_matrix | CONDITIONING | — |