Tone Match LUT (auto-gen .cube)
Steal a Hero Frame's Look as an Auto-Generated LUT
- reference
- lut_path
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.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| reference | IMAGE | — | |
| level | COMBO | 8 | HALD LUT level. 8 -> 64^3 entries (industry-standard creative-look resolution). |
| filename | STRING | tone_match.cube | Output .cube filename. Relative paths resolve against ComfyUI's output/ directory; absolute paths are honored. |
| title | STRING | Tone Match LUT | Adobe Cube TITLE header embedded into the exported file. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| lut_path | STRING | — |