Skin Tone Corrector (Eric_)
Nudge every skintone onto the 127° line without trashing a single hair
- image
- skin_mask
- image
- hue_delta_deg
- correction_params
Most "skin color" fixes in ComfyUI are just hue sliders applied to the whole image, which means your subject's skin lands right but so does the background, the shirt, and the wood paneling. Skin Tone Corrector (Eric_) does the version you actually want: it measures the mean color of the skin, rotates it onto the broadcast skin-tone line (127° in Cb-Cr space), and applies that rotation only where skin is. It's the node this pack is built around, and it's the one I'd grab over a blunt hue shift every single time.
How it works - the two-pass trick. The node does a measurement pass and an application pass, and the difference matters. For measurement it computes a skin-confidence map in HSV and normalizes it inside your mask, so the person's peak skin confidence is 1.0 regardless of complexion. That's the clever bit: the measurement is skin-tone-agnostic, so it works on pale and deep skin without you re-tuning anything. For application it uses your mask as the outer boundary, feathers the edge, then punches exclusion holes wherever confidence is below your threshold - which is how it dodges eyes, teeth, and lips that an HSV detector would happily "correct" into gray goo.
The inputs that matter. You can leave most of them alone and get good results:
hue_strength(0–1, default 1) - how much of the computed correction to apply. Dial to 0.5 for a subtle version, or drop it when the math disagrees with your eye.detection_mode-combined(default) uses your mask plus the confidence exclusions;hsv_autoneeds no mask at all and just thresholds confidence;mask_onlyfeathers your mask directly. Start withcombinedand a mask.skin_threshold(default 0.1) - incombinedmode it's a fraction of the peak confidence inside the mask, so 0.1 always means "drop the bottom 10% of skin-likeness." Raise toward 0.2–0.25 to exclude lips too.apply_globally- bypasses masking entirely and rotates the whole frame. Handy for rescuing a shot with one dominant cast (like the analyzer's advice for split lighting), but it's the blunt instrument, not the default.sat_adjust(default 1.0) andfeather(default 8) - saturation scale and edge softness; tweak only if you see problems.
Outputs. You get the corrected image, a hue_delta_deg float telling you how many degrees it actually moved (satisfying when it's 0 after a good grade), and correction_params. That last one is a payload you can pipe into ApplySavedCorrection to replay this exact rotation on every frame of a video batch - the temporal-consistency play this pack is built around.
Where it sits. The pack's recommended order is ColorCastRemover → SkinToneCorrector → SkinLuminanceAdjust, and it's worth respecting: fix white balance first, then hue, then brightness. Run the analyzer before and after to watch skin_deviation_deg collapse toward zero.
Installing it. It's one node 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. Manager has it too if you search "Eric Color Correction." Note the license before commercial use - CC BY-NC-style non-commercial with a separate paid commercial license. This node itself pulls no models and runs on CPU fine; the parsing masks elsewhere in the pack are what download weights on first use. The one real trap here is expecting correction_params to behave like actual conditioning - it doesn't, it's a dict carrier in a CONDITIONING-typed wire. Feed it to ApplySavedCorrection, never into a sampler.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| hue_strength | FLOAT | 1.000–1 | — |
| sat_adjust | FLOAT | 1.000.5–1.5 | — |
| detection_mode | COMBO | combined | 3 options: combined, hsv_auto, mask_only |
| skin_threshold | FLOAT | 0.100.01–0.9 | Skin confidence threshold - behavior depends on detection_mode. COMBINED (recommended): pixels inside the SAM mask whose skin confidence is below this fraction of the PEAK confidence inside the mask are excluded. Skin-tone-agnostic: 0.10 always means 'exclude the bottom 10% of skin-likeness for this person' - eyes, teeth, eyebrows - regardless of complexion. Start at 0.10. Raise to 0.20-0.25 to exclude lips. Lower to 0.05 if shadow areas of skin are being incorrectly excluded. HSV_AUTO (no mask): threshold applied to raw confidence score (0-1). Start at 0.25-0.35. |
| feather | FLOAT | 80–64 | Softens the outer boundary of the skin selection. COMBINED: feathers the SAM mask edge (hairline, jaw, shoulder). Skin interior stays clean at weight 1.0. HSV_AUTO / MASK_ONLY: feathers the confidence or mask boundary directly. |
| apply_globally | BOOLEAN | false | Apply hue rotation to entire image, ignoring all masking. |
| skin_maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| hue_delta_deg | FLOAT | — |
| correction_params | CONDITIONING | — |