Superside Color Match
Pull a generative edit's color back toward the original, no API needed
- image
- reference
- image
Run an image through a generative editor a couple of times and watch what happens to the color: it drifts. Warmth creeps in, saturation climbs, whites stop being white. The standard fix in this pack's world is this node - a local, no-API color transfer that moves the statistics of one image toward another's, so your edited result ends up looking like it came from the same session as the clean original.
The mechanism is classic Reinhard mean/std transfer, and it's older than diffusion: the node computes the color mean and standard deviation of the reference image and maps the image's channels onto them, so the target inherits the reference's overall color character without copying its pixels. Because it matches global statistics rather than pixels, it keeps working even when pose or framing changed between the two - exactly the case that breaks a pixel-based match. By default it works in LAB, which is perceptual and the better choice for skin tones (the tooltip says as much); the RGB method is the simpler per-channel version, useful when you want a cruder, more mechanical match.
The inputs you actually set:
image- the drifted edit.reference- the clean original. Both required.strength- 0 to 1, default 1. 1.0 is the full match; 0.5 is halfway. This is your blend knob when a 100% match overcorrects.match_luminance- on by default, so brightness/contrast get matched too. Turn it off if you like the generated exposure and only want the color (a/b) corrected.ignore_background- on by default, and it's the catalogue-shot savior: it excludes near-white background pixels from the statistics so the subject (skin, hair) drives the match instead of a huge white backdrop.
Output is a single image. That's the whole node.
The two nb2_* inputs need a moment because they're the most specialized thing in the pack. nb2_passes_since_reference (default 0) exists for deep Nano Banana 2 pipelines where reference isn't a perfect clean original - say the clean file is several NB2 edit passes back and the subject mask is small or noisy, so the Reinhard stats alone are unreliable. Set it to the number of passes that separate image from a true clean original, and the node first applies a small study-derived directional pre-correction (hue rotated back from red, saturation trimmed, brightness lifted, an RGB curve nudge - per-pass averages from the pack's own NB2 color-drift study) to the subject before doing the match, so there's less residual drift for the stats to chew on. nb2_bias_strength (default 1.0) scales that pre-correction. The tooltip is explicit that leaving nb2_passes_since_reference at 0 makes the output byte-for-byte identical to before this input existed - so you can ignore the whole mechanism until you actually have a drifted NB2 chain. Most people never touch it.
This is one of the genuinely good "reach for the deterministic operation instead of re-rolling" nodes the post-processing layer exists to teach: it's free, instant, and cannot hallucinate. Install - ComfyUI Manager (search "comfyui-superside-nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Superside/comfyui-superside-nodes
pip install -r requirements.txt
Restart ComfyUI, find it under Superside. No key, no model downloads, nothing but the pack's own dependencies.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| reference | IMAGE | — | |
| strengthopt | FLOAT | 1.000–1 | How strongly to pull the image toward the reference's color. 1.0 = full match, 0.5 = halfway. |
| methodopt | COMBO | LAB (Reinhard) | LAB is perceptual and usually best for skin. RGB is a simpler per-channel match. |
| match_luminanceopt | BOOLEAN | true | ON also matches brightness/contrast to the reference. OFF keeps the image's own luminance and only corrects color (a/b), useful if you like the generated exposure. |
| ignore_backgroundopt | BOOLEAN | true | Exclude near-white background pixels when measuring color, so the SUBJECT (skin/hair) drives the match instead of the large white backdrop. Ideal for catalogue shots on white. |
| nb2_passes_since_referenceopt | INT | 00–50 | How many NB2 (Nano Banana 2) edit passes separate `image` from a TRUE clean original (0 if `reference` already IS that clean original - leave at 0 for normal use). When > 0, applies a small study-derived directional pre-correction (hue rotated back from red, saturation trimmed, brightness lifted, RGB curve nudged) BEFORE the Reinhard match, so the match has less residual drift to compensate for. Useful when `reference` isn't the perfect original, or the subject mask is small/noisy and the Reinhard stats alone are unreliable. |
| nb2_bias_strengthopt | FLOAT | 1.000–2 | Scales the nb2_passes_since_reference pre-correction. 1.0 = the study's measured average. Only has any effect when nb2_passes_since_reference > 0. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |