Nodes/Lumina_NIVR2/Lumina NIVR2 Color Correction
ComfyUI Node

Lumina NIVR2 Color Correction

SeedVR2 made your image look over-processed? This node puts the colors back

By Luminatrixx·Created about a month ago·Updated about a month ago· 2
Lumina NIVR2 Color Correction
  • content
  • style
  • IMAGE
methodlab

SeedVR2 has exactly one flaw the community agrees on, and it isn't the OOMs or the skin thing. Run any real image through it and the output comes back with the contrast and saturation turned up a notch - the result reads as "more AI-generated" than the input ever did, even though nothing else about the upscale is wrong. This node is the dedicated antidote for that. It's the post-decode step that color-matches your upscaled result back to the original, so you get SeedVR2's detail without the telltale juice.

What it is

Lumina NIVR2 Color Correction is one of the four helper nodes in the Luminatrixx/NIVR2 pack, a from-scratch native ComfyUI port of ByteDance's SeedVR2. Where the other three nodes are plumbing that makes the native graph work, this one is pure post-processing: it runs after VAE Decode and fixes the color statistics that diffusion upscaling quietly shifts. In the pack's intended graph it's the final node before Preview/Save, and it's the one you can add to an already-working workflow without touching anything else.

The mechanism is straightforward and it works per-image and per-video-frame alike: give it the upscaled output as content and a reference as style, and it transfers the style's color distribution onto the content while leaving spatial detail alone. It's a direct port of the original seedvr2_videoupscaler's color_fix.py, and it runs its math in float32 internally, so don't worry about fp16 headaches corrupting the correction.

The inputs that matter

Only three, and you'll rarely touch two of them:

  • content - the image you want fixed. That's your VAE-decoded upscale.
  • style - the reference to match. For a normal upscale that's your original input, resized to the output resolution first.
  • method - which transfer technique to use. Default is lab, and it's the recommended one.

The one real trap is in the tooltip: style must match content's frame count and resolution. Feed the raw low-res original in as style and the node will error out or silently do something weird, because the statistics have nowhere to line up. Resize the source with a native Image Scale node to the output resolution before connecting it, and you're fine. For video, style needs the same number of frames as the upscale - the frame count really is part of the contract here.

The method dropdown is worth knowing because the options are genuinely different flavors:

  • lab - perceptual LAB-space color matching. The safe default and the one I'd reach for.
  • wavelet - frequency-based transfer; keeps fine details if lab ever softens something.
  • wavelet_adaptive - wavelet base plus saturation correction, for when the hue is fine but the saturation is off.
  • hsv - hue-conditional saturation matching, a lighter touch.
  • adain - statistical style transfer; the fast-and-dirty option, tends to be the most aggressive.

How to install it

The pack isn't a one-node install - you get all four nodes together, so this one comes along for the ride. ComfyUI Manager support is listed as "soon"; for now the manual route:

cd ComfyUI/custom_nodes
git clone https://github.com/Luminatrixx/NIVR2

Then install the dependencies into ComfyUI's Python environment and restart:

python -m pip install einops opencv-python numpy

Note that this node needs no model files at all - the SeedVR2 DiT and VAE checkpoints are only required for the upscaling side of the pack. If you're bolting color correction onto some other pipeline you can still use it standalone.

Troubleshooting

  • Output still looks wrong or too shifted: the README's first fix is this node with method = lab and style = original input resized to output resolution. If you skipped resizing, that's almost certainly the issue.
  • An error about dimensions/frames: style and content don't match. Fix the resize, or match the clip length for video.
  • lab looks great but slightly smoothed: switch to wavelet, which is the method that exists specifically to preserve fine detail.

The one honest limitation: color correction can't fully reverse the skin-texture problems SeedVR2 sometimes introduces on close-up faces - that's a model-level thing, not a color thing. If you're doing a portrait, keep the face out of the SeedVR2 pass entirely and fix it separately, then use this node only for the tonal match.

CategoryLumina NIVR2

Inputs (3)

NameTypeDefaultDescription
contentIMAGEImage to correct (the upscaled output).
styleIMAGEReference image to match colors to (must match content's frame count and resolution).
methodCOMBOlablab: perceptual color matching (recommended) wavelet: frequency-based, preserves fine details wavelet_adaptive: wavelet base with saturation correction hsv: hue-conditional saturation matching adain: statistical style transfer

Outputs (1)

NameTypeDescription
IMAGEIMAGEColor-corrected image.