Reference Transfer Reinhard
Steal a photo's whole color mood with one reference image
- image
- image_reference
- IMAGE
If you've ever wanted your render to look like it was shot by the same cinematographer as a reference photo - same warmth, same teal shadows, same overall cast - Reference Transfer Reinhard is the laziest honest way to get it. You feed it your image and a reference image, and it shifts the color statistics of one to match the other. No palette, no prompts, no model. It's the classic "color transfer between images" algorithm, wrapped as a ComfyUI node.
The mechanism, in 25 words
The algorithm is Erik Reinhard's 2001 "Color Transfer between Images" - the paper every modern color-matching node cribs from. Convert both images to LAB (the color space where "lightness" and "chroma" are separated), compute the mean and standard deviation of each channel, then stretch your image so its mean and std match the reference's. Done. It's a global, statistical shift: the whole image moves together, so you get a mood, not a repaint.
That's exactly why it's useful and exactly why it's limited. Because it only matches statistics, it preserves your image's composition and detail while transplanting the reference's overall feel. But it also can't do spatial tricks - a reference that's blue at the top and warm at the bottom averages out into one global cast, not a per-region grade.
Inputs and output
Just two inputs, both IMAGE:
- image - the shot you want recolored.
- image_reference - the photo whose color mood you're stealing. Load it with a plain
LoadImage. If it's a batch, the node flattens the frames into one tall image before computing stats, so a multi-frame reference averages its look - usually fine.
One output: the recolored IMAGE, straight into a preview or save node.
Note the category: this one lives under Color Transfer/Reference Transfer, not Palette Transfer. It's the pack's only node that takes a full reference image instead of a hand-typed swatch list. That makes it the right tool when you have a look example but don't want to eyeball palette values.
When to reach for it (and when not)
Reach for it in post-processing, after VAE decode, as a final color pass - especially when a batch of images needs a consistent grade to look like one set of shots. It's also a great cheap fix for the oversaturated, over-contrasty default that many models pump out; grade a few frames against a reference you like and you've got a LUT-like consistency without building a LUT.
Skip it when you want targeted color - "make the sofa red, keep the wall white." That's the job for the palette-transfer nodes in this pack, which cluster and remap actual colors. Reinhard shifts everything at once, and if your reference is wildly brighter than your image you can push it into banding on smooth gradients. If that happens, blend the output back with the original, or prefer the palette-based PaletteTransferReinhard sibling, which computes the same statistics but from a swatch list instead of a photo.
Install
Same one-line story as the rest of the pack - you install the whole thing:
cd ComfyUI/custom_nodes
git clone https://github.com/45uee/ComfyUI-Color_Transfer
…or grab "Color_Transfer" from ComfyUI Manager, then restart. No model downloads, runs on CPU, and the only dependency you might ever have to install by hand is scikit-learn (per the README) - scikit-image and scipy already ride along with ComfyUI. It's a small solo-dev pack, but this particular node is about the least likely to misbehave: the algorithm is 25 years old, proven, and short.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| image_reference | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |