Video Color Match π¨
Make clip B look like it was graded with clip A
- images
- reference
- images
- summary
Generate two video segments in separate runs - even from the same prompt family - and they'll drift: one a little brighter, one with a different white balance, both "correct" but visibly not from the same shoot. When you splice them together, that drift is the thing that reads as amateur. The Video Color Match node from TensorVizion/OmniNodes is the fix: it adjusts an IMAGE batch so its per-channel color statistics match a reference, then hands back a batch that sits in the same grade.
This is the video-flavored version of the classic color-transfer trick the post-processing world uses constantly: match the target's mean and standard deviation to a reference's, per channel. The nuance here is that the stats are computed once from the reference and applied uniformly across the whole clip - not per-frame, which would make the brightness visibly pump. That's a small detail that separates a usable node from a flicker factory.
Inputs and outputs
images- the batch to regrade.reference- a single image, or another batch. If it's a batch, its stats are averaged across all frames first. Feed it the first few frames of a previously-graded segment to match a new one to it before splicing.strength(0β1, default 1) - blends between the original and the fully matched result. Full matches can look aggressive; 0.5β0.8 often reads more natural.match_mode-mean_std(default) matches both mean and standard deviation;mean_onlymatches just the average, leaving contrast alone. When the target has very different contrast,mean_onlycan be the safer pick.
Outputs: images (the regraded batch) and summary.
Where it fits
The author built it for exactly the stitching workflow: run the segments, color-match them to a shared reference, then join them with Video Concat / Splice. It also pairs with the post-processing wisdom that says color transfer is the honest alternative to re-rolling a generation because "the colors are off" - it's deterministic, instant, and doesn't gamble on a new seed.
Install
Part of OmniNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes
Or ComfyUI Manager β OmniNodes β restart. Pure PyTorch, no extra dependencies. It lives under TensorVizion/Video.
Troubleshooting
- Full match looks washed or overcooked - drop
strengthto blend the result back toward the original; that's what the knob is for. - Result flickers - shouldn't happen from this node (stats are global by design), but if you see pumping, check you're not running something per-frame downstream.
- Reference is a very different image - mean/std matching can only do so much; a bright beach reference against a dark interior clip will stretch and crush. Match within a similar lighting family, or accept a stylized look.
- Node missing - restart ComfyUI and check the
[OmniNodes]terminal log.
Reach for it the moment you're assembling multiple AI segments into one timeline. It's the difference between "shots cut together" and "a video."
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| reference | IMAGE | β | |
| strength | FLOAT | 1.000β1 | β |
| match_mode | COMBO | mean_std | 2 options: mean_std, mean_only |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | β |
| summary | STRING | β |