ComfyUI Node

Beautify Photo

A face-tune pipeline that needs zero VRAM and zero models

By billwuhao·Created about a year ago·Updated about a year ago· 21
Beautify Photo
  • image
  • image
whitening_strength0
brightness_strength0
contrast_strength0
saturation_strength0
sharpen_strength0.1
grind_skin0

BeautifyPhoto is the phone-camera "beauty mode" as a ComfyUI node: skin smoothing, whitening, brightness, contrast, saturation and sharpening, all in one box. The reason it's worth having in a graph is what it doesn't use - no diffusion model, no face detector, no VRAM. It's pure OpenCV running on the pixels, which means it's instant, it runs on a potato, and it slots in as a final polish step after a generation or a restore.

The honest framing: this is the "make it prettier" node, not the "make it real" node. Use it with restraint.

How it works

Six inputs, and they map to a classic Chinese-style beautification pipeline, applied in a fixed order in the source:

  1. grind_skin (0–10) - the famous one. Portrait skin smoothing via a bilateral filter blend ("grinding" the skin), tuned so it flattens blemishes without smearing edges.
  2. whitening_strength (0–100) - a LUT-based whitening pass, the "make the skin brighter/whiter" effect.
  3. brightness_strength / contrast_strength (–100 to 100) - plain cv2.convertScaleAbs brightness and contrast.
  4. saturation_strength (–100 to 100) - HSV saturation shift.
  5. sharpen_strength (0–10, default 0.1) - unsharp-style sharpening, applied last.

All zero by default except sharpen's 0.1, so the node is a no-op until you turn things up - which is exactly what you want for a "maybe I'll add polish" node. The order matters if you're chasing a specific look: smoothing happens first, sharpening last, so you won't re-introduce the texture you just smoothed away.

The inputs and outputs

The three you'll actually touch: grind_skin (the whole point - start at 1–3), whitening_strength (10–30 is a subtle glow, 100 is a different person), and sharpen_strength (nudge up after smoothing to claw back crispness). The brightness/contrast/saturation sliders are just a convenience so you don't need three extra nodes. One output, image, same size, ready to feed a Save or a viewer.

How to install

It ships with the rest of billwuhao/ComfyUI_PortraitTools:

cd ComfyUI/custom_nodes
git clone https://github.com/billwuhao/ComfyUI_PortraitTools.git
cd ComfyUI_PortraitTools
pip install -r requirements.txt   # or: ./python_embeded/python.exe -m pip install -r requirements.txt

No models, no downloads, no face-detection weights - it's just opencv-python, PyYAML and huggingface_hub. The only dependency you could miss is that it expects opencv to be present, which requirements.txt covers.

Where people get burned

  • This is the "too smooth" trap, in node form. The photorealism crowd has spent years teaching models to stop producing airbrushed skin - pores and micro-texture are the tell of a real photo. Crank grind_skin to 10 and you've recreated the exact uncanny beauty filter everyone warns about. 1–3 smooths; past that you're sculpting plastic.
  • It's global, not face-aware. It smooths the whole image - a textured shirt or a beard gets the same treatment as skin. That's the trade-off for being model-free.
  • Whitening at high strength changes skin tone, not just "glow." If the result looks washed out, it's doing exactly what you asked.
  • It only processes the first image in a batch (single-image pipeline) - run it per-image if you need a whole batch beautified.
Category🎤MW/MW-PortraitTools

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
whitening_strengthINT00–100
brightness_strengthINT0-100–100
contrast_strengthINT0-100–100
saturation_strengthINT0-100–100
sharpen_strengthFLOAT0.10–10
grind_skinINT00–10

Outputs (1)

NameTypeDescription
imageIMAGE