Video Tile Reference Color Match
Stop your upscaled video drifting into a different color world
- merged
- reference
- IMAGE
Here's a failure mode every tiled upscale eventually hits: the individual tiles look great, the seams are gone, and the result is still wrong. Not structurally - chromatically. Your upscale branch decided the sky should be more cyan than the source, or the skin tones shifted a stop. Tiling doesn't cause this, it just makes it more visible: each tile's generative pass can drift its color independently, and once stitched, the whole clip sits in a slightly different color world than the original.
Video Tile Reference Color Match is the fix. It's a post-merge node: you feed it the merged upscale plus the original (LR or pre-upscale) clip, and it pulls the large-scale color back toward the reference while keeping all the fine detail your upscale added. Mechanically, it splits both images into low-frequency and high-frequency components with a Gaussian blur, matches the LF color, and recombines with the merged HF detail on top.
The inputs that matter
merged- the output of Video Tile Merge.[B,H,W,3].reference- the same content at LR/pre-upscale resolution. Resized internally; a batch-1 reference broadcasts across the merged batch.color_pull(default 0.58) - how hard the LF follows the reference vs. the merged LF. Lower = subtler correction, higher = the reference's palette wins.low_frequency_sigma(default 14) - Gaussian σ in pixels for the LF/HF split. Higher σ means only the broadest color moves get corrected; near 0 means the reference imprints hard.detail_mix(default 1) - gain on the merged high-frequency residual. 1 keeps the full upscale detail.preserve_merged_luminance(default true) - rescales RGB after the pull so the merged scene's brightness is kept. This is the setting that stops the reference's exposure from flattening your scene into a uniform gray.
luma_scale_clamp (default 4) caps how extreme that luminance correction can get, and reference_resize picks the interpolation (bicubic default) when the reference is upsampled to merged resolution.
Why it behaves well
The LF/HF split is the whole trick - it means the node can shift color without smearing detail, which is the thing naive "match the histogram" approaches get wrong. It also chunks long batches so it doesn't trip PyTorch's indexing limits on multi-thousand-frame clips, and a recent pack fix made it fall back to replicate padding when reflect padding would be too large for small frames (a crash some users hit). Output is an IMAGE of the same shape and dtype as the merged input.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/maDcaDDie2000/comfyui-video-tiler
Restart, find it under Video Tiler. No extra dependencies, no model downloads - it's pure tensor math. Apache 2.0, vibe-coded for personal use, not actively maintained. Start with the defaults, then nudge color_pull down if the result looks over-processed, or up if the drift is severe. This is the kind of node you add once, leave in the workflow, and forget about - which is the highest praise a color-matching node can get.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| merged | IMAGE | Video Tile Merge output [B,H,W,3]. | |
| reference | IMAGE | Same content at LR or pre-upscale resolution; resized internally. Batch 1 broadcasts to merged batch. | |
| low_frequency_sigmaopt | FLOAT | 14.00–256 | Gaussian σ (px) for LF/HF split. Higher = only broader color moves. ~0 skips blur (strong reference imprint). |
| color_pullopt | FLOAT | 0.580–1 | How much low-frequency RGB follows the reference vs merged LF. |
| detail_mixopt | FLOAT | 1.000–1 | Gain on high-frequency residual from merged (1 = keep full upscale detail). |
| preserve_merged_luminanceopt | BOOLEAN | true | If true, rescale RGB after pull so Rec.709 luma matches merged (reference brightness won’t flatten scene). |
| luma_scale_clampopt | FLOAT | 4.001.05–10 | Max/min multiplier when locking luma (prevents extreme corrections). |
| reference_resizeopt | COMBO | bicubic | Interpolation when upsampling reference to merged width/height. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | Color-matched IMAGE; same shape/dtype as merged input. |