LC Skin Beauty ✨
Grade the skin, not the whole frame
- image
- mask
- image
- skin_mask
The classic beauty-retouch move in ComfyUI is dragging a whole-frame node in - brighten, smooth, done - and then watching the background, the clothes, and the eyes all get mangled by a filter that was aimed at a face. LC Skin Beauty is the targeted version: it detects where the skin actually is, then does its cooling and brightening in CIELAB color space on that mask only. You grade the skin, and the rest of the frame barely notices.
That targeting is the whole point. "Too-smooth skin" is the number-one photorealism tell in the KB's photorealism essay - the beauty-filter look that reads instantly as AI - and this node's answer is restraint plus control: an auto skin mask that protects eyes and lips and suppresses busy fabric, with the option to intersect it with an external mask (say, a SAM person matte) for higher precision.
How it works
The pipeline is mask → CIELAB grade → blend. It builds a skin mask automatically (mask_sensitivity controls reach, mask_feather controls the edge), optionally intersects it with your MASK input, then applies the color grade in LAB where lightness and color are separated. That's why you get distinct brightness (lightness lift, highlights protected) and coolness (less yellow, cooler skin) dials instead of one blunt slider. Presets - Natural, Light, Fresh, Porcelain, Warm keep - load the sliders, and after that what you see is what runs. There's an on-node wipe preview to compare before/after.
The dials that matter most
- strength - overall blend with the original; 1.0 = full preset, above 1 = stronger.
- smooth and texture_preserve - the plastic-vs-natural trade. Less plastic = lower
smooth, highertexture_preserve(keep those pores). - mask_sensitivity - if it's grabbing fabric, lower it, or feed a person/skin MASK.
- highlight_protect - keep bright skin from blowing out.
Outputs: image (graded) and skin_mask - inspect the mask output first thing; it tells you exactly what the node thinks is skin.
Getting it right
The README's quick guide: natural cleanup → Natural or Warm keep at strength ~0.7–1.0; fabric leaks → lower mask_sensitivity or supply a mask; and always check skin_mask before trusting the result. "Busy fabric suppressed" is a nice claim but fabric with skin tones in it still occasionally sneaks through - the mask output is your verification.
Install
It's in the LC123 pack - ComfyUI Manager (search "LC123") or:
cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes
Restart. No extra pip packages - this is pure pixel math, no model. Cloud-hosted ComfyUI needs LC123 requested or run locally.
The take: if your portraits come out looking like a skincare ad, this is a gentler, more surgical fix than a sharpen-and-smooth stack, and the mask-aware design means the background survives the retouch.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Source image (batch ok). | |
| preset | COMBO | Natural | Starting preset. Customize below by moving the sliders. |
| strength | FLOAT | 1.000–2 | How much of the effect to apply. 0 = original image, 1 = full, above 1 = stronger. |
| coolness | FLOAT | 0.220–1 | Cool vs warm skin. 0 = no shift, 1 = much less yellow / cooler. |
| brightness | FLOAT | 0.120–1 | Skin whitening / lightness. 0 = none, 1 = strong lift (highlights still protected). |
| rosy | FLOAT | 0.08-0.3–0.5 | Rosy flush. Negative = less red, 0 = neutral, higher = pinker cheeks/lips-adjacent skin. |
| evenness | FLOAT | 0.180–1 | Even skin tone. 0 = keep variation, 1 = strong local color averaging. |
| shadow_lift | FLOAT | 0.150–1 | Shadow recovery. 0 = no change in dark areas, 1 = lift shadows more than midtones. |
| smooth | FLOAT | 0.060–1 | Soft smoothing. 0 = full texture, 1 = softer skin (use with texture preserve). |
| texture_preserve | FLOAT | 0.880–1 | Texture keep. 0 = allow smooth to flatten detail, 1 = protect pores/micro-contrast. |
| saturation | FLOAT | -0.08-0.5–0.5 | Skin saturation. Negative = quieter color, 0 = unchanged, positive = richer. |
| highlight_protect | FLOAT | 0.750–1 | Highlight protect. 0 = treat bright skin same as midtones, 1 = mostly skip highlights. |
| mask_sensitivity | FLOAT | 0.550–1 | Mask reach. 0 = only obvious skin, 1 = wider (may include more non-skin). |
| mask_feather | FLOAT | 0.450–1 | Mask edge. 0 = harder cut, 1 = softer feather into non-skin. |
| maskopt | MASK | Optional external skin mask (higher precision). Combined with auto mask. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| skin_mask | MASK | — |