Nodes/ComfyUI-QwenEditPlusSlots/Skin Realism (De-Plastic)
ComfyUI Node

Skin Realism (De-Plastic)

Synthesized pores, grain, and a waxy-highlight fix in one post node

By normbarrette-arch·Created 3 months ago·Updated 2 months ago· 0
Skin Realism (De-Plastic)
  • image
  • mask
  • image
  • treated_mask
strength0.50
texture_scale1.00
pores0.50
grain0.25
sheen_reduction0.30
mottling0.20
detect_skintrue
seed0

If you've rendered a portrait with Qwen-Image-Edit - or honestly any modern diffusion model - you've seen it: skin that reads like molded plastic. No pores, no micro-texture, highlights that glide instead of catching. It's the single most common photorealism tell, the thing people spot in a photo the instant it's an AI face. The usual fix is a second generation pass or an ADetailer on faces. Skin Realism (De-Plastic) takes a different route: it post-processes what you already have, and it synthesizes what the render is missing rather than borrowing it from a reference photo.

That's the neat part. You don't feed it a texture source or a real-photo reference. It builds the realism from procedural noise, carefully shaped so it lands where plastic skin actually is and skips where you already have texture.

How it works

Under the hood it's four stacked effects, all pure torch + numpy (no OpenCV, no scipy - the pack has zero extra dependencies):

  • Pores - band-passed noise at a controllable spatial scale, weighted toward midtones (pores don't read in deep shadow or blown highlights) and automatically attenuated where the image already has high-frequency texture. So it never double-textures a face that's already got detail.
  • Grain - fine luminance grain over the whole treated region, which is what makes a render feel captured rather than generated.
  • Sheen reduction - soft-knee compression of skin highlights, which is how it kills the waxy specular look.
  • Mottling - very low-frequency color variation, i.e. the subtle subsurface redness patches that lift an airbrushed single-tone face.

Targeting matters, because you don't want pores on the background. By default the node detects skin-colored regions (YCrCb color ranges, morphologically cleaned and feathered) - deliberately approximate, and the README says so. Wire any MASK into mask (say, from a person/face segmenter) and it overrides detection entirely for precision work.

What you actually set

Master strength scales every effect below it; 0 is a pass-through. texture_scale is the pore/mottle size multiplier - ~1.0 suits a face filling most of a ~1024px frame, bump it for close-ups, drop it for small faces. Then four effect sliders (pores, grain, sheen_reduction, mottling) let you dial each contribution. detect_skin toggles auto-detection (off + no mask = whole frame), and seed makes the texture pattern deterministic - same seed, identical output, which you'll want for reproducibility.

Outputs: image and treated_mask, which is the genuinely useful extra - you can inspect exactly what got touched, and catch a bad auto-detection before it wrecks a shot.

Install

Same pack as its sibling, Text Encode Qwen Edit Plus (Slots):

cd ComfyUI/custom_nodes
git clone https://github.com/normbarrette-arch/ComfyUI-QwenEditPlusSlots.git

Restart ComfyUI and hard-refresh the browser. It lands under image/postprocessing as Skin Realism (De-Plastic). Because the implementation is pure torch + numpy, there's nothing else to install - no model downloads, no pip requirements.

Where people get burned

The auto skin detection is color-based and forgiving, which means it can grab hands, lips, or a sunburnt neck and happily texture them. Check the treated_mask output before trusting a result; for anything where the skin region is contested, wire in a proper mask - it's one connection and the node stops guessing.

The other trap is over-tuning. pores and grain are subtle effects; cranking them reads as noise baked onto a face, not realism. The defaults (pores 0.5, grain 0.25, sheen 0.3, mottling 0.2) are a sane starting point. And if the mask comes back empty for a frame, the node logs it to the console and passes the frame through untouched - that message is the clue that your auto-detection found no skin, not that the node is broken.

Categoryimage/postprocessing

Inputs (10)

NameTypeDefaultDescription
imageIMAGE
strengthFLOAT0.500–1Master intensity. Scales every effect below. 0 = pass-through.
texture_scaleFLOAT1.000.25–4Pore/mottle size multiplier. ~1.0 suits a face occupying most of a ~1024px frame; increase for close-ups, decrease for small faces.
poresFLOAT0.500–1Micro-texture (band-passed, midtone-weighted). Auto-attenuated where the image already has texture.
grainFLOAT0.250–1Fine luminance grain over the whole treated region.
sheen_reductionFLOAT0.300–1Soft compression of skin highlights - kills the waxy specular look.
mottlingFLOAT0.200–1Low-frequency color variation (subsurface redness patches).
detect_skinBOOLEANtrueON: auto-detect skin-colored regions (approximate; color-based). OFF: treat the whole frame. Ignored when a mask is wired in.
seedINT00–18446744073709550000Texture pattern seed. Same seed = identical texture.
maskoptMASK

Outputs (2)

NameTypeDescription
imageIMAGE
treated_maskMASK