Nodes/ComfyUI-UniversalToolkit/Imitation Hue Node (UTK)
ComfyUI Node

Imitation Hue Node (UTK)

Steal one image's look without turning the people in it orange

By whmc76·Created about a year ago·Updated 3 months ago· 77
Imitation Hue Node (UTK)
  • target_image
  • imitation_image
  • mask
  • image
◄strength1.0►
◄skin_protection0.2►
◄auto_brightnesstrue►
◄brightness_range0.5►
◄auto_contrastfalse►
◄contrast_range0.5►
◄auto_saturationfalse►
◄saturation_range0.5►
◄auto_tonefalse►
◄tone_strength0.5►

"Make my photo look like this photo" - the classic color-transfer ask. Generic implementations just match the mean and standard deviation of the color channels, which works great on landscapes and turns skin a horrifying shade of orange the moment a person is in frame. Imitation Hue Node (UTK) is the version with a skin-protection pass bolted on, and it's why it beats the naive approach for anything with humans.

It's part of ComfyUI-UniversalToolkit, and the changelog shows the author iterating on this exact thing - the v1.1.5 release is specifically "optimized skin protection to better preserve skin tone." That's the feature to remember: color transfer with skin preservation, not color transfer full-stop.

How it works

Under the hood it does statistics-based color transfer - it computes the mean and standard deviation of the color channels in the reference (imitation_image) and applies that shift to your target_image. The clever part is the skin detection: it converts the image to LAB color space and flags pixels that fall in the characteristic skin/lips range (specific L, A, B thresholds), then protects those regions from the full-strength transfer. The skin_protection slider (0–1, default 0.2) controls how much of the look applies to skin pixels - 0.2 keeps most of the grade while sparing flesh tones from going wonky.

Beyond the base transfer, there's a stack of auto_* adjustments, each with a range control: auto_brightness/brightness_range (HSV value scaling), auto_contrast, auto_saturation (HSV saturation), and auto_tone. They default to mostly off except brightness, so you can add them one at a time instead of fighting six dials. strength is the master amount of the transfer (0.1–1, default 1). The optional mask input lets you restrict the whole operation to a region, which is how you recolor a background without touching the subject at all.

Inputs and outputs that matter

  • target_image - what gets recolored.
  • imitation_image - the look you're copying.
  • strength and skin_protection - the two you'll actually tune.
  • auto_brightness - the one auto-tweak that's on by default.

Single output: image (IMAGE), the recolored result.

Install and gotchas

Install via ComfyUI Manager (search "ComfyUI-UniversalToolkit") or:

cd ComfyUI/custom_nodes
git clone https://github.com/whmc76/ComfyUI-UniversalToolkit
pip install -r requirements.txt

Restart ComfyUI. No models, no keys - this runs on OpenCV and numpy, both in the requirements.

Where people get burned: skin detection is threshold-based, so extreme skin tones - very dark or heavily made-up skin - can slip outside the LAB window and get recolored anyway. Dial skin_protection up to 1 if you see it, and if that's still not enough, draw a mask over the face and feed it into the optional mask input. Also, this transfers color statistics, not the lighting structure of the reference; if the reference has dramatically different lighting, no amount of slider work will fully imitate it - that's what relighting models are for. For the "same scene, different grade" case, though, it's fast and shockingly good.

CategoryUniversalToolkit/Image

Inputs (13)

NameTypeDefaultDescription
target_imageIMAGE—
imitation_imageIMAGE—
strengthFLOAT1.00.1–1—
skin_protectionFLOAT0.20–1—
auto_brightnessBOOLEANtrue—
brightness_rangeFLOAT0.50.1–1—
auto_contrastBOOLEANfalse—
contrast_rangeFLOAT0.50.1–1—
auto_saturationBOOLEANfalse—
saturation_rangeFLOAT0.50.1–1—
auto_toneBOOLEANfalse—
tone_strengthFLOAT0.50.1–1—
maskoptMASK—

Outputs (1)

NameTypeDescription
imageIMAGE—