Nodes/eric-color-correction/Skin Tone Corrector (Eric_)
ComfyUI Node

Skin Tone Corrector (Eric_)

Nudge every skintone onto the 127° line without trashing a single hair

By EricRollei·Created 4 months ago·Updated 4 months ago· 4
Skin Tone Corrector (Eric_)
  • image
  • skin_mask
  • image
  • hue_delta_deg
  • correction_params
hue_strength1.00
sat_adjust1.00
detection_modecombined
skin_threshold0.10
feather8
apply_globallyfalse

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_auto needs no mask at all and just thresholds confidence; mask_only feathers your mask directly. Start with combined and a mask.
  • skin_threshold (default 0.1) - in combined mode 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) and feather (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.

CategoryEric_/Color Correction

Inputs (8)

NameTypeDefaultDescription
imageIMAGE
hue_strengthFLOAT1.000–1
sat_adjustFLOAT1.000.5–1.5
detection_modeCOMBOcombined3 options: combined, hsv_auto, mask_only
skin_thresholdFLOAT0.100.01–0.9Skin 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.
featherFLOAT80–64Softens 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_globallyBOOLEANfalseApply hue rotation to entire image, ignoring all masking.
skin_maskoptMASK

Outputs (3)

NameTypeDescription
imageIMAGE
hue_delta_degFLOAT
correction_paramsCONDITIONING