Nodes/ComfyUI LC123 Nodes/LC Color Match 🎨
ComfyUI Node

LC Color Match 🎨

Make a regen actually match your reference

By lonecatone23Β·Created 2 months agoΒ·Updated 3 days agoΒ· 18
LC Color Match 🎨
  • image
  • reference
  • mask
  • image
β—„methodadainβ–Ί
β—„strength1.00β–Ί
β—„skin_protect0.50β–Ί

"Re-roll it, the colors are off" is a terrible way to fix color. Re-rolling re-rolls everything - pose, face, composition - and you usually end up with a different problem. LC Color Match is the honest alternative: it takes whatever you generated and a reference image, and shoves your image's color statistics toward the reference's. Deterministic, instant, no diffusion pass.

It's the LCColorMatch node in the LC123 pack, under Image FX. Feed it an image, feed it a reference, and it does a classic statistics transfer - the same family as the "Color Match Image" nodes in packs like WAS, but with a skin-awareness twist that makes it usable on people.

How it works

Under the hood it's AdaIN (adaptive instance normalization): it computes the per-channel mean and standard deviation of your image and the reference, then rescales your channels to match the reference's distribution. That's the classic Reinhard-style mean/std transfer from the post-processing world - your palette moves toward the reference's overall look without copying its structure.

The method dropdown gives you two flavors:

  • adain - the raw channel stats transfer in sRGB space. Fast, punchy.
  • mean_std - the same math but done in linear light (the node converts to linear, matches, converts back). Gentler and more physically-correct-feeling on highlights.

strength blends between original (0) and fully matched (1), so you can keep only 40% of the reference's influence.

The standout input is skin_protect (default 0.5). After the match it holds the original skin hue and caps how much the transfer can push skin chroma - lightness still follows the match, but faces don't turn green because your reference was a moody teal frame. On people shots this is the difference between "matches the grade" and "alien."

The bypass gotcha

The reference input is optional. If you leave it unplugged, the node bypasses itself and passes the image straight through - it doesn't error, it just does nothing. That's deliberate (the tooltip says so), and it makes the node safe to leave in a template. But it also means an empty reference is the #1 way people think the node is broken when it's actually working as designed.

Output is a single image socket. Classic uses: making an outpainted or inpainted region agree with the original, matching an upscaled tile to its neighbors, or seating a composited subject into a new background's light - the exact jobs post-processing lore keeps telling people to do by hand.

Install

ComfyUI Manager (search ComfyUI_LC123_nodes) or:

cd ComfyUI/custom_nodes
git clone https://github.com/lonecatone23/ComfyUI_LC123_nodes

Restart. Pure torch/numpy - no pip extras, no models to download.

Where people get burned

Because the pack is a quiet niche utility collection, most "issues" are self-inflicted: no reference connected (bypass), strength left at 1.0 when the match is too aggressive, or skin_protect at 0 on a portrait and wondering why faces went off-hue. If the match looks overdone, blend down before you rebuild the whole pipeline - you're one slider from a keeper.

CategoryLC123/image

Inputs (6)

NameTypeDefaultDescription
imageIMAGEImage to recolor (content)
methodCOMBOadainadain = channel mean/std match; mean_std = same in linear light
strengthFLOAT1.000–1Blend between original (0) and matched (1)
referenceoptIMAGEColor reference (style). If empty, node bypasses and passes image through.
skin_protectoptFLOAT0.500–1Hold original skin hue and cap skin chroma gain after match (0=off, 1=full). Lightness still follows the match.
maskoptMASKWhite = apply match. Black = keep image. Leave empty for full frame (old graphs unchanged).

Outputs (1)

NameTypeDescription
imageIMAGEβ€”