Imitation Hue Node (UTK)
Steal one image's look without turning the people in it orange
- target_image
- imitation_image
- mask
- image
"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.strengthandskin_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.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| target_image | IMAGE | — | |
| imitation_image | IMAGE | — | |
| strength | FLOAT | 1.00.1–1 | — |
| skin_protection | FLOAT | 0.20–1 | — |
| auto_brightness | BOOLEAN | true | — |
| brightness_range | FLOAT | 0.50.1–1 | — |
| auto_contrast | BOOLEAN | false | — |
| contrast_range | FLOAT | 0.50.1–1 | — |
| auto_saturation | BOOLEAN | false | — |
| saturation_range | FLOAT | 0.50.1–1 | — |
| auto_tone | BOOLEAN | false | — |
| tone_strength | FLOAT | 0.50.1–1 | — |
| maskopt | MASK | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |