Nodes/eric-color-correction/Skin Luminance Adjust (Eric_)
ComfyUI Node

Skin Luminance Adjust (Eric_)

Brighten skin in L\* space, not vibes — the colorist's way

By EricRollei·Created 4 months ago·Updated 4 months ago· 4
Skin Luminance Adjust (Eric_)
  • image
  • skin_mask
  • image
modemanual_offset
detection_modemask_only
target_ire70
manual_offset0.00
strength0.50
skin_threshold0.10
feather8

Brightening a face sounds easy until you do it and the subject looks like a clown: skin lifted in a flat additive way goes milky, saturation gets weird, and shadows turn into a "painted on" mess. Skin Luminance Adjust (Eric_) is built to avoid exactly that. It changes only the luminance of skin pixels - never hue, and it compensates saturation as it goes - using the same perceptual math (L* space) a colorist uses, so a lift in the shadows and a lift in the highlights look like the same intentional brightening instead of two different hacks.

Two modes, pick your poison.

  • target_ire - you set the target mean skin luminance in IRE (default 70, which is the broadcast standard for skin tone). The node measures the current mean, computes a multiplicative gain to hit your target, and applies it in L* so it reads as uniform across shadow and highlight. This is the "make it look like a properly-exposed broadcast face" mode.
  • manual_offset - the default. A direct Y offset (manual_offset, -1 to +1): +0.1 lifts skin by about 0.1 Y units (~10 IRE), -0.3 darkens by 0.3. Simple and predictable.

The other knobs. detection_mode works exactly like its sibling in SkinToneCorrector: combined (mask + confidence exclusion holes), hsv_auto (no mask), or mask_only (default here - just your feathered mask). skin_threshold (default 0.1) in combined mode drops the bottom fraction of skin-likeness inside the mask - raise it toward 0.2–0.25 to also exclude lips. feather softens the boundary. And strength (0–1, default 0.5) scales the whole shift - this is the dial to turn if the result looks too aggressive.

There's a nice hidden behavior worth knowing: the node attenuates the correction automatically when darkening, precisely so you don't get that dead "painted" look. It also applies a saturation rolloff - brightening slightly desaturates, darkening slightly saturates - which keeps skin looking like skin rather than plastic.

Where it goes. It's the third step in the pack's recommended chain: ColorCastRemover → SkinToneCorrector → SkinLuminanceAdjust. Fix white balance, then hue, then brightness - in that order, or the luminance pass will fight a cast you haven't removed yet. Output is just the corrected image; run the analyzer afterward and watch skin_ire approach 70.

Installing it. It's 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 ComfyUI Manager → "Eric Color Correction"). Pure tensor math, no model downloads, CPU-friendly. Same license reminder as the rest of the pack: non-commercial CC BY-NC-style by default, paid commercial license required for work you sell.

One honest note: this node has more moving parts than the rest of the pack - two modes, three detection modes, threshold, feather, strength - and the defaults (manual_offset, mask_only) are conservative on purpose. If you're a beginner, set a skin mask, leave manual_offset at 0 and strength at 0.5, and nudge the offset a tenth at a time. It's a scalpel, and it rewards small movements.

CategoryEric_/Color Correction

Inputs (9)

NameTypeDefaultDescription
imageIMAGE
modeCOMBOmanual_offset2 options: target_ire, manual_offset
detection_modeCOMBOmask_only3 options: combined, hsv_auto, mask_only
target_ireFLOAT700–100Target mean skin luminance in IRE (Y-space). 70 = broadcast standard skin tone. The shift is applied perceptually (L* space) so it looks uniform across shadow and highlight areas of skin.
manual_offsetFLOAT0.00-1–1Direct additive Y offset applied to skin pixels. +0.1 lifts by 0.1 Y units (about 10 IRE). -0.3 darkens by 0.3 Y units. Full range: -1.0 to +1.0.
strengthFLOAT0.500–1
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 also 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. Raise to exclude warm backgrounds or clothing.
featherFLOAT80–64Softens the outer boundary of the skin selection. COMBINED: feathers the SAM mask edge (hairline, shoulder, jaw). The skin interior stays clean at weight 1.0 - feather only affects the edge. HSV_AUTO / MASK_ONLY: feathers the confidence or mask boundary directly.
skin_maskoptMASK

Outputs (1)

NameTypeDescription
imageIMAGE