Nodes/ComfyUI-JH-PixelPro/Tone Match LUT (auto-gen .cube)
ComfyUI Node

Tone Match LUT (auto-gen .cube)

Steal a Hero Frame's Look as an Auto-Generated LUT

By jetthuangai·Created 5 months ago·Updated 4 months ago· 5
Tone Match LUT (auto-gen .cube)
  • reference
  • lut_path
level8
filenametone_match.cube
titleTone Match LUT

JHPixelProToneMatchLUT takes one reference image - a hero frame, a film still, a finished grade you love - and automatically generates a .cube LUT that transfers its look. No manual curve drawing, no eyeballing sliders. Feed it a reference, get a portable Adobe Cube 1.0 file you can apply to anything with the pack's LUT Import, or ship to Resolve, Premiere, OBS, or OCIO. It's look-dev without rebuilding a node chain per shot.

How it works: the node applies MKL (Monge-Kantorovich Linear) covariance transfer in LAB color space. Plainly: it computes the mean and covariance of the reference's color distribution, then maps an identity HALD image through that transform. What this captures that a per-channel mean/std match misses is cross-channel correlation - the teal-orange relationship, the way a grade couples the channels. The result is serialized to a .cube file. A flat neutral reference comes out near-identity; a clean single-frame reference gives a clean LUT.

Inputs:

  • reference - the graded image whose look gets captured.
  • level - HALD resolution (default 8 → 64³ entries, the standard creative-look sweet spot).
  • filename - output path, relative to ComfyUI/output/ or absolute.
  • title - the TITLE header embedded in the file.

Output: lut_path, a STRING with the written file's absolute path.

The workflow: pick your hero frame, run this, then apply the .cube with LUT Import at strength ~0.7, or drop it into a color suite. "Match this film look across a whole sequence" becomes a three-node chain instead of a week of manual grading.

Honest caveats: it's statistical, not semantic. It transfers the global cast and color-correlation direction - it will not match a localized grade (a vignette, a selective skin adjustment). And garbage in, garbage out: an extreme or badly-graded reference yields an extreme LUT, so curate the hero frame before exporting.

Install is the shared pack install:

cd ComfyUI/custom_nodes
git clone https://github.com/jetthuangai/ComfyUI-JH-PixelPro.git
cd ComfyUI-JH-PixelPro
pip install -r requirements.txt

Restart and it's under ComfyUI-JH-PixelPro/color, or use ComfyUI Manager → search "ComfyUI-JH-PixelPro".

Troubleshooting: if the resulting LUT looks washed or weird, check that your reference is properly graded and mid-toned - not clipped, not underexposed, not full of one cast color. A singular-covariance reference (like a flat gray card) falls back to a mean-only shift, so don't expect magic from a featureless input. And remember the output is LUT-only: this node doesn't apply the look itself, so wire the .cube into LUT Import downstream.

CategoryComfyUI-JH-PixelPro/color

Inputs (4)

NameTypeDefaultDescription
referenceIMAGE
levelCOMBO8HALD LUT level. 8 -> 64^3 entries (industry-standard creative-look resolution).
filenameSTRINGtone_match.cubeOutput .cube filename. Relative paths resolve against ComfyUI's output/ directory; absolute paths are honored.
titleSTRINGTone Match LUTAdobe Cube TITLE header embedded into the exported file.

Outputs (1)

NameTypeDescription
lut_pathSTRING