LAB Color Blend (L + a/b)
The L + a/b split
- image_l
- image_ab
- image
This node is the "one image's lighting, another image's colors" trick, done properly instead of by eyeballing. Feed it a picture that has the structure you want and a picture that has the palette you want, and it fuses them in CIE-LAB space: the L (lightness/detail) channel comes from image_l, the a/b (color) channels come from image_ab. You get the composition and light of the first image wearing the colors of the second.
Why reach for it? The classic job is palette transfer without disturbing the pose, framing, or lighting of a generated image - take a render you like and let it pick up a reference's mood, skin tones, or film grade. It also works the other way: keep your colors, steal someone's lighting structure, which is how people fake a "relight" cheaply. It sits in that deterministic-primitives layer of your workflow where a color match beats re-rolling a generation, because it's instant and repeatable - no diffusion pass required. This is the unclamped-free, ordinary-sRGB cousin of the same pack's LABBlendSaveEXR, which is the version you reach for when the output has to survive as a comp element.
Mechanically it's simple and honest. Both images get converted RGB→LAB (via kornia, which is already in ComfyUI's requirements.txt, or a pure-torch D65 fallback if kornia is missing - either way GPU and accurate to about 1e-6 on the round trip). The node takes L from the first image, a/b from the second, and converts back. That's it. The two knobs modulate the handoff rather than the math:
image_l- the light/detail source. The output resolution follows this image, and the a/b image is auto-resized to match it, so you don't need same-size inputs.image_ab- the color source.chroma_blend- the one you'll actually move.0keepsimage_l's own color,1is fullyimage_ab's color (default1). Values between blend the two chroma sets, which is useful when the reference palette is too strong.chroma_scale- saturation multiplier on the result (default1, range 0–3). Drop it below 1 when the borrowed colors come out overcooked.backend- leave it onauto; it picks kornia if present and falls back to torch.
There's a single image output, and batch sizes are matched automatically (a batch of 1 broadcasts), so it slots into video-frame chains without fuss.
Install is a one-liner and there are no extra dependencies - that's the nice part of this pack:
cd ComfyUI/custom_nodes
git clone https://github.com/villainsquad/ComfyUI-LABColorBlend
Then restart ComfyUI. Or use ComfyUI Manager and search "ComfyUI-LABColorBlend". No model files, no weights, nothing to download.
Troubleshooting is blessedly short. If the result looks washed out, remember the L channel is 100% from image_l - that's the design, not a bug; if the light itself feels off, blend the L source instead of fighting this node. If colors look too hot, ease chroma_scale under 1 rather than reaching for chroma_blend, because chroma scaling is a global multiplier that overshoots near-pure colors fast. And if you find yourself wishing the result weren't clamped to 0–1 sRGB - for HDR or a wide-gamut pipeline - you want the pack's other node, which does this exact blend but writes it as a linear unclamped EXR or float TIFF.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image_l | IMAGE | — | |
| image_ab | IMAGE | — | |
| chroma_blend | FLOAT | 1.000–1 | — |
| chroma_scale | FLOAT | 1.000–3 | — |
| backend | COMBO | auto | 3 options: auto, kornia, torch |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |