Lut
Color grade with real LUTs — .cube, HALD, reshade, even 3D LUTs
- image
- IMAGE
LUTs are the fastest way to make an AI image look like it went through a real colorist, and for a long time ComfyUI's options for applying them were thin. This Lut node is the reason a lot of people install the Photography Nodes pack at all. It's a full LUT player: it eats .cube files (the industry standard), .1dlut, .3dl, and PNG-based LUTs - both HALD CLUTs and reshade-style texture LUTs - and applies them with proper 3D interpolation. Give it a color grade, and it lands film emulations or a "Teal & Orange" look on a whole batch with the same repeatability the rest of this pack is built around.
How it works
A LUT (lookup table) is just a remapping of color values: for every input RGB triple, the table says what output color to produce. The node reads your file, builds the 3D lookup grid, then samples it for every pixel. Where the pack's Lut node gets fancy is how it samples - interpolation is the knob:
- nearest neighbor - fastest, can show banding
- bilinear - the default, smooth and cheap
- tricubic - proper 3D cubic interpolation, smoother in gradients at the cost of speed
- gaussian - blurs the lookup space before sampling (
gaussian_interpolation_radius,sigma) - stochastic - samples multiple times with jitter and averages; this one's a de-noising trick for heavy grades (
stochastic_interpolation_samples)
use_torch_optimized_interpolation switches to a vectorized torch path - the author notes it only applies to nearest neighbor and bilinear, but it's the mode you want if you're grading a big batch and the CPU-ish interpolation is the bottleneck.
Inputs that matter
- lut_filepath - path to the LUT. Quotes around it are fine; the node strips them. The pack even ships a few starter files under
assets/luts/(Cyberpunk_Neon, Teal_Orange, VHS_Grade .cube files plus HALD and reshade PNGs) if you want to test without sourcing your own - lut_strength - exponentially scales the LUT values; 1.0 is identity, this is your "how hard does the grade hit" dial
- chroma_amount / luma_amount - independently scale the chroma vs luma contribution of the grade. Dropping chroma to 0 with a strong LUT gives you the same look with muted color
- lut_order - RGB or BGR. A swapped order is the most common reason a LUT looks catastrophically wrong; try this before debugging anything else
- gamma_correction - for
.3dlfiles written against a different gamma space - opacity - Photoshop-style effect strength, 0–100
Output is a single IMAGE. In the author's example workflow this node sits right after the color-correction chain (Contrast → Levels → Saturation) and before the optical effects, which is the order that makes a grade read as "from the camera" rather than "pasted on top."
Install
Same story as the rest of the pack - one install, no extra deps:
cd ComfyUI/custom_nodes
git clone https://github.com/TrophiHunter/ComfyUI_Photography_Nodes
Restart and look under TrophiHunter/Photography. ComfyUI Manager finds it as "Photography Nodes" too. The pack has no requirements.txt; it's all torch/PIL/numpy, so nothing else to install.
Where people get burned
LUTs are a crowded field - there are lightweight .cube-only nodes out there, and they're fine if that's all you need. This one earns its keep on the format breadth and the chroma/luma split. The classic traps: a LUT meant for a different color space (that's the gamma_correction and lut_order escape hatch), and expecting a huge lut_strength to just "turn it up" - values outside 0.5–1.5 make grades clip into posterization. Start at 1.0, dial opacity down instead of inflating strength, and save a workflow with your LUT path embedded so batch runs don't ask you to re-pick it.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| lut_filepath | STRING | — | |
| chroma_amount | FLOAT | 1.0000–2 | — |
| luma_amount | FLOAT | 1.0000–2 | — |
| lut_strength | FLOAT | 1.0000.5–1.5 | — |
| use_torch_optimized_interpolation | BOOLEAN | false | — |
| interpolation | COMBO | bilinear | 5 options: nearest neighbor, bilinear, tricubic, gaussian, stochastic |
| gaussian_interpolation_radius | INT | 11–20 | — |
| stochastic_interpolation_samples | INT | 81–200 | — |
| stochastic_interpolation_use_gaussian | BOOLEAN | true | — |
| sigma | FLOAT | 0.500.01–10 | — |
| lut_order | COMBO | RGB | 2 options: RGB, BGR |
| gamma_correction | BOOLEAN | false | — |
| opacity | INT | 1000–100 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |