RC High/Low Frequency Skin Smoothing
Skin smoothing that doesn't turn faces into plastic
- image
- mask
- IMAGE
The reason so much AI "portrait retouching" looks like a mannequin is that it smooths everything uniformly - pores, edges, eyelashes, all of it - until the face has the texture of a ping-pong ball. Frequency separation exists to avoid exactly that. You split the image into a smooth low-frequency layer (color and tone) and a detail high-frequency layer (pores, texture), smooth only the low frequencies, and put the detail back on top. Skin gets softer; edges and texture stay.
RC High/Low Frequency Skin Smoothing automates that whole pipeline with skin-tone detection and edge protection built in. It's the rare one-click retouching node that understands the difference between a blemish and an eyebrow.
How it works
The core method (frequency_separation) is textbook: blur the image with a Gaussian at low_frequency_radius to get the low-frequency layer, subtract it from the original to isolate high-frequency detail, smooth the low-frequency layer, and recombine. The high_frequency_strength slider controls how much of that detail comes back - 0 is maximum smoothing, 1.0 restores original detail, above 1.0 actually sharpens texture.
Around that core sit the safeguards:
- skin_tone_protection - masks the effect toward detected skin tones. At 0.8 (default), 80% of the smoothing budget is reserved for skin, leaving hair, clothing, and background alone.
- preserve_fine_details - keeps eyelashes, eyebrows, and hair from being smoothed into mush.
- edge_protection - preserves hard edges (jawlines, lips) from blur bleed.
- method - you can also pick
surface_blurorselective_gaussian, two alternative smoothing approaches that some find more forgiving on texture. Frequency separation is the classic for a reason, though. - mask (optional) - a MASK input to limit smoothing to specific regions. White = smooth, black = preserve. If the auto skin detection misses, this is your override.
Output is a single IMAGE tensor.
How to install it
Part of the RC Image Compositor pack:
cd ComfyUI/custom_nodes
git clone https://github.com/kj863257/ComfyUI_RC_Image_Compositor
cd ComfyUI_RC_Image_Compositor
pip install -r requirements.txt
Restart ComfyUI, or install via ComfyUI Manager by searching "RC Image Compositor". Deps: pillow, numpy, opencv-python.
Common issues
The biggest practical mistake is cranking high_frequency_strength to 0 and expecting beauty - at 0 you've thrown away all texture, and even with edge protection the result is waxy. Keep it at 0.5–0.7 for a "still human" retouch and only drop lower for a deliberate airbrush look.
Second, low_frequency_radius controls what counts as "texture" vs. "tone." Too small (1–3) and the low-frequency layer still contains pores, so smoothing does little; too large (20+) and you start softening facial contours, which reads as a plastic face. Start at 8 and move in 2-unit steps.
Third, if you're feeding it an already-upscaled 2K portrait, the same radius covers fewer feature pixels than it would at 512. Scale your radius with resolution - a rule of thumb is roughly 1 unit of radius per 100px of face size. And when the auto skin detection fails on unusual lighting or heavy makeup, feed it your own mask from a segmentation pass rather than fighting the slider.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| low_frequency_radius | FLOAT | 8.01–50 | Low frequency separation radius - determines the size of skin texture features to smooth |
| high_frequency_strength | FLOAT | 0.700–2 | High frequency detail strength (0=maximum smoothing, 1=original detail, >1=enhanced detail) |
| skin_tone_protection | FLOAT | 0.800–1 | Skin tone protection level (0=affect all areas, 1=only affect detected skin tones) |
| preserve_fine_details | BOOLEAN | true | Preserve fine details like eyelashes, eyebrows and hair |
| edge_protection | FLOAT | 0.300–1 | Edge protection strength (0=no protection, 1=maximum edge preservation) |
| method | COMBO | frequency_separation | Smoothing method: - frequency_separation: Classic PS frequency separation - surface_blur: Surface blur for texture preservation - selective_gaussian: Selective Gaussian blur |
| maskopt | MASK | Optional mask to limit smoothing to specific areas (1.0=smooth, 0.0=preserve) |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |